33#include " processor.h"
44#include " arith.h"
55#include " sim.h"
6+ #include " dts.h"
67
78#define DOMAINCFG 0x0
89#define SOURCECFG_BASE 0x4
3940#define TARGET_GUEST_MASK 0x3f000
4041#define TARGET_EIID_MASK 0x7ff
4142
42- aplic_t ::aplic_t (std::vector< processor_t *>& procs , aplic_t *parent) : procs(procs ), parent(parent), child(nullptr ), domaincfg((0x80 << 24 ) | DOMAINCFG_DM_MASK), sourcecfg(), mmsiaddrcfgh(MMSIADDRCFGH_L_MASK), ie(), target(), level(), genmsi(0 ), deleg_mask()
43+ aplic_t ::aplic_t (const simif_t *simif , aplic_t *parent) : simif(simif ), parent(parent), child(nullptr ), domaincfg((0x80 << 24 ) | DOMAINCFG_DM_MASK), sourcecfg(), mmsiaddrcfgh(MMSIADDRCFGH_L_MASK), ie(), target(), level(), genmsi(0 ), deleg_mask()
4344{
4445}
4546
@@ -113,10 +114,12 @@ void aplic_t::set_interrupt_level(uint32_t id, int lvl)
113114
114115void aplic_t::send_msi (uint32_t proc_id, uint32_t guest, uint32_t eiid)
115116{
116- if (!eiid || proc_id >= procs.size ())
117+ auto &procs = simif->get_harts ();
118+ auto it = procs.find (proc_id);
119+ if (!eiid || it == procs.end ())
117120 return ;
118121
119- auto proc = procs[proc_id] ;
122+ processor_t * proc = it-> second ;
120123 if (!parent) {
121124 proc->imsic ->m ->pendei (eiid);
122125 } else if (guest) {
@@ -255,7 +258,7 @@ bool aplic_t::store(reg_t addr, size_t len, const uint8_t* bytes)
255258 return true ;
256259}
257260
258- std::string aplic_generate_dts (const sim_t * sim, const std::vector<std::string>& sargs UNUSED)
261+ std::string aplic_m_generate_dts (const sim_t * sim, const std::vector<std::string>& sargs UNUSED)
259262{
260263 auto cfg = sim->get_cfg ();
261264 isa_parser_t isa (cfg.isa , cfg.priv );
@@ -273,6 +276,14 @@ std::string aplic_generate_dts(const sim_t* sim, const std::vector<std::string>&
273276 " compatible = \" riscv,aplic\" ;\n "
274277 " };\n " ;
275278 }
279+ return s.str ();
280+ }
281+
282+ std::string aplic_s_generate_dts (const sim_t * sim, const std::vector<std::string>& sargs UNUSED)
283+ {
284+ auto cfg = sim->get_cfg ();
285+ isa_parser_t isa (cfg.isa , cfg.priv );
286+ std::stringstream s;
276287 if (isa.extension_enabled (EXT_SSAIA)) {
277288 s << std::hex
278289 << " APLIC_S: aplic@" << APLIC_S_BASE << " {\n "
@@ -287,9 +298,31 @@ std::string aplic_generate_dts(const sim_t* sim, const std::vector<std::string>&
287298 return s.str ();
288299}
289300
290- aplic_t * aplic_parse_from_fdt (const void * fdt, const sim_t * sim, reg_t * base, const std::vector<std::string>& sargs UNUSED)
301+ aplic_m_t * aplic_m_parse_from_fdt (const void * fdt, const sim_t * sim, reg_t * base, const std::vector<std::string>& sargs UNUSED)
291302{
303+ reg_t aplic_m_base, aplic_s_base;
304+ if (fdt_parse_aplic (fdt, &aplic_m_base, &aplic_s_base, " riscv,aplic" ) == 0 ) {
305+ if (aplic_m_base) {
306+ *base = aplic_m_base;
307+ return new aplic_m_t (sim, nullptr );
308+ }
309+ }
292310 return nullptr ;
293311}
294312
295- REGISTER_DEVICE (aplic, aplic_parse_from_fdt, aplic_generate_dts)
313+ aplic_s_t * aplic_s_parse_from_fdt (const void * fdt, const sim_t * sim, reg_t * base, const std::vector<std::string>& sargs UNUSED)
314+ {
315+ reg_t aplic_m_base, aplic_s_base;
316+ if (fdt_parse_aplic (fdt, &aplic_m_base, &aplic_s_base, " riscv,aplic" ) == 0 ) {
317+ if (aplic_s_base) {
318+ *base = aplic_s_base;
319+ auto *ptr = new aplic_s_t (sim, sim->aplic_m .get ());
320+ if (sim->aplic_m )
321+ sim->aplic_m ->set_child (ptr);
322+ return ptr;
323+ }
324+ }
325+ return nullptr ;
326+ }
327+ REGISTER_DEVICE (aplic_m, aplic_m_parse_from_fdt, aplic_m_generate_dts)
328+ REGISTER_DEVICE(aplic_s, aplic_s_parse_from_fdt, aplic_s_generate_dts)
0 commit comments