12 htif_isasim_t::htif_isasim_t(sim_t
* _sim
, const std::vector
<std::string
>& args
)
13 : htif_pthread_t(args
), sim(_sim
), reset(true), seqno(1)
17 void htif_isasim_t::tick()
19 do tick_once(); while (reset
);
22 void htif_isasim_t::tick_once()
25 recv(&hdr
, sizeof(hdr
));
27 char buf
[hdr
.get_packet_size()];
28 memcpy(buf
, &hdr
, sizeof(hdr
));
29 recv(buf
+ sizeof(hdr
), hdr
.get_payload_size());
32 assert(hdr
.seqno
== seqno
);
36 case HTIF_CMD_READ_MEM
:
38 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, hdr
.data_size
, 0);
39 send(&ack
, sizeof(ack
));
41 uint64_t buf
[hdr
.data_size
];
42 for (size_t i
= 0; i
< hdr
.data_size
; i
++)
43 buf
[i
] = sim
->mmu
->load_uint64((hdr
.addr
+i
)*HTIF_DATA_ALIGN
);
44 send(buf
, hdr
.data_size
* sizeof(buf
[0]));
47 case HTIF_CMD_WRITE_MEM
:
49 const uint64_t* buf
= (const uint64_t*)p
.get_payload();
50 for (size_t i
= 0; i
< hdr
.data_size
; i
++)
51 sim
->mmu
->store_uint64((hdr
.addr
+i
)*HTIF_DATA_ALIGN
, buf
[i
]);
53 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, 0, 0);
54 send(&ack
, sizeof(ack
));
57 case HTIF_CMD_READ_CONTROL_REG
:
58 case HTIF_CMD_WRITE_CONTROL_REG
:
60 reg_t coreid
= hdr
.addr
>> 20;
61 reg_t regno
= hdr
.addr
& ((1<<20)-1);
62 assert(hdr
.data_size
== 1);
64 packet_header_t
ack(HTIF_CMD_ACK
, seqno
, 1, 0);
65 send(&ack
, sizeof(ack
));
67 if (coreid
== 0xFFFFF) // system control register space
69 uint64_t pcr
= sim
->get_scr(regno
);
70 send(&pcr
, sizeof(pcr
));
74 assert(coreid
< sim
->num_cores());
75 uint64_t pcr
= sim
->procs
[coreid
]->get_pcr(regno
);
76 send(&pcr
, sizeof(pcr
));
78 if (regno
== PCR_TOHOST
)
79 sim
->procs
[coreid
]->tohost
= 0;
81 if (hdr
.cmd
== HTIF_CMD_WRITE_CONTROL_REG
)
84 memcpy(&val
, p
.get_payload(), sizeof(val
));
85 if (regno
== PCR_RESET
)
88 sim
->procs
[coreid
]->reset(reset
);
92 sim
->procs
[coreid
]->set_pcr(regno
, val
);
103 void htif_isasim_t::stop()