1 // See LICENSE for license details.
13 htif_isasim_t::htif_isasim_t(sim_t
* _sim
, const std::vector
<std::string
>& args
)
14 : htif_pthread_t(args
), sim(_sim
), reset(true), seqno(1)
18 bool htif_isasim_t::tick()
23 do tick_once(); while (reset
);
28 void htif_isasim_t::tick_once()
31 recv(&hdr
, sizeof(hdr
));
33 char buf
[hdr
.get_packet_size()];
34 memcpy(buf
, &hdr
, sizeof(hdr
));
35 recv(buf
+ sizeof(hdr
), hdr
.get_payload_size());
38 assert(hdr
.seqno
== seqno
);
42 case HTIF_CMD_READ_MEM
:
44 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, hdr
.data_size
, 0);
45 send(&ack
, sizeof(ack
));
47 uint64_t buf
[hdr
.data_size
];
48 for (size_t i
= 0; i
< hdr
.data_size
; i
++)
49 buf
[i
] = sim
->debug_mmu
->load_uint64((hdr
.addr
+i
)*HTIF_DATA_ALIGN
);
50 send(buf
, hdr
.data_size
* sizeof(buf
[0]));
53 case HTIF_CMD_WRITE_MEM
:
55 const uint64_t* buf
= (const uint64_t*)p
.get_payload();
56 for (size_t i
= 0; i
< hdr
.data_size
; i
++)
57 sim
->debug_mmu
->store_uint64((hdr
.addr
+i
)*HTIF_DATA_ALIGN
, buf
[i
]);
59 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, 0, 0);
60 send(&ack
, sizeof(ack
));
63 case HTIF_CMD_READ_CONTROL_REG
:
64 case HTIF_CMD_WRITE_CONTROL_REG
:
66 reg_t coreid
= hdr
.addr
>> 20;
67 reg_t regno
= hdr
.addr
& ((1<<20)-1);
68 assert(hdr
.data_size
== 1);
70 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, 1, 0);
71 send(&ack
, sizeof(ack
));
73 if (coreid
== 0xFFFFF) // system control register space
75 uint64_t scr
= sim
->get_scr(regno
);
76 send(&scr
, sizeof(scr
));
80 assert(coreid
< sim
->num_cores());
81 uint64_t old_val
= sim
->procs
[coreid
]->get_pcr(regno
);
82 send(&old_val
, sizeof(old_val
));
84 if (regno
== PCR_TOHOST
)
85 sim
->procs
[coreid
]->state
.tohost
= 0;
87 if (hdr
.cmd
== HTIF_CMD_WRITE_CONTROL_REG
)
90 memcpy(&new_val
, p
.get_payload(), sizeof(new_val
));
91 if (regno
== PCR_RESET
)
93 if (reset
&& !(new_val
& 1))
95 sim
->procs
[coreid
]->reset(new_val
& 1);
97 else if (regno
== PCR_FROMHOST
&& old_val
!= 0)
98 ; // ignore host writes to fromhost if target hasn't yet consumed
100 sim
->procs
[coreid
]->set_pcr(regno
, new_val
);
110 bool htif_isasim_t::done()
114 return !sim
->running();