4 #include <fesvr/htif-packet.h>
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
->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
->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 pcr
= sim
->get_scr(regno
);
71 send(&pcr
, sizeof(pcr
));
75 assert(coreid
< sim
->num_cores());
76 uint64_t pcr
= sim
->procs
[coreid
]->get_pcr(regno
);
77 send(&pcr
, sizeof(pcr
));
79 if (regno
== PCR_TOHOST
)
80 sim
->procs
[coreid
]->tohost
= 0;
82 if (hdr
.cmd
== HTIF_CMD_WRITE_CONTROL_REG
)
85 memcpy(&val
, p
.get_payload(), sizeof(val
));
86 if (regno
== PCR_RESET
)
89 sim
->procs
[coreid
]->reset(reset
);
93 sim
->procs
[coreid
]->set_pcr(regno
, val
);
104 void htif_isasim_t::stop()