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 void htif_isasim_t::tick()
20 do tick_once(); while (reset
);
23 void htif_isasim_t::tick_once()
26 recv(&hdr
, sizeof(hdr
));
28 char buf
[hdr
.get_packet_size()];
29 memcpy(buf
, &hdr
, sizeof(hdr
));
30 recv(buf
+ sizeof(hdr
), hdr
.get_payload_size());
33 assert(hdr
.seqno
== seqno
);
37 case HTIF_CMD_READ_MEM
:
39 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, hdr
.data_size
, 0);
40 send(&ack
, sizeof(ack
));
42 uint64_t buf
[hdr
.data_size
];
43 for (size_t i
= 0; i
< hdr
.data_size
; i
++)
44 buf
[i
] = sim
->debug_mmu
->load_uint64((hdr
.addr
+i
)*HTIF_DATA_ALIGN
);
45 send(buf
, hdr
.data_size
* sizeof(buf
[0]));
48 case HTIF_CMD_WRITE_MEM
:
50 const uint64_t* buf
= (const uint64_t*)p
.get_payload();
51 for (size_t i
= 0; i
< hdr
.data_size
; i
++)
52 sim
->debug_mmu
->store_uint64((hdr
.addr
+i
)*HTIF_DATA_ALIGN
, buf
[i
]);
54 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, 0, 0);
55 send(&ack
, sizeof(ack
));
58 case HTIF_CMD_READ_CONTROL_REG
:
59 case HTIF_CMD_WRITE_CONTROL_REG
:
61 reg_t coreid
= hdr
.addr
>> 20;
62 reg_t regno
= hdr
.addr
& ((1<<20)-1);
63 assert(hdr
.data_size
== 1);
65 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, 1, 0);
66 send(&ack
, sizeof(ack
));
68 if (coreid
== 0xFFFFF) // system control register space
70 uint64_t scr
= sim
->get_scr(regno
);
71 send(&scr
, sizeof(scr
));
75 assert(coreid
< sim
->num_cores());
76 uint64_t old_val
= sim
->procs
[coreid
]->get_pcr(regno
);
77 send(&old_val
, sizeof(old_val
));
79 if (regno
== PCR_TOHOST
)
80 sim
->procs
[coreid
]->state
.tohost
= 0;
82 if (hdr
.cmd
== HTIF_CMD_WRITE_CONTROL_REG
)
85 memcpy(&new_val
, p
.get_payload(), sizeof(new_val
));
86 if (regno
== PCR_RESET
)
88 if (reset
&& !(new_val
& 1))
90 sim
->procs
[coreid
]->reset(new_val
& 1);
92 else if (regno
== PCR_FROMHOST
&& old_val
!= 0)
93 ; // ignore host writes to fromhost if target hasn't yet consumed
95 sim
->procs
[coreid
]->set_pcr(regno
, new_val
);
105 bool htif_isasim_t::done()
109 return !sim
->running();