Skip to content

Commit f04fb60

Browse files
committed
AIA: refactor APLIC init
1 parent dcda77b commit f04fb60

File tree

4 files changed

+53
-27
lines changed

4 files changed

+53
-27
lines changed

riscv/aplic.cc

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
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
@@ -39,7 +40,7 @@
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

114115
void 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,33 @@ 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+
typedef aplic_t aplic_m_t;
302+
typedef aplic_t aplic_s_t;
303+
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)
291304
{
305+
reg_t aplic_m_base, aplic_s_base;
306+
if (fdt_parse_aplic(fdt, &aplic_m_base, &aplic_s_base, "riscv,aplic") == 0) {
307+
if (aplic_m_base) {
308+
*base = aplic_m_base;
309+
return new aplic_t(sim, nullptr);
310+
}
311+
}
292312
return nullptr;
293313
}
294314

295-
REGISTER_DEVICE(aplic, aplic_parse_from_fdt, aplic_generate_dts)
315+
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)
316+
{
317+
reg_t aplic_m_base, aplic_s_base;
318+
if (fdt_parse_aplic(fdt, &aplic_m_base, &aplic_s_base, "riscv,aplic") == 0) {
319+
if (aplic_s_base) {
320+
*base = aplic_s_base;
321+
auto *ptr = new aplic_t(sim, sim->aplic_m.get());
322+
if (sim->aplic_m)
323+
sim->aplic_m->set_child(ptr);
324+
return ptr;
325+
}
326+
}
327+
return nullptr;
328+
}
329+
REGISTER_DEVICE(aplic_m, aplic_m_parse_from_fdt, aplic_m_generate_dts)
330+
REGISTER_DEVICE(aplic_s, aplic_s_parse_from_fdt, aplic_s_generate_dts)

riscv/devices.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class plic_t : public abstract_device_t, public abstract_interrupt_controller_t
162162
#define APLIC_MAX_DEVICES 1024
163163
class aplic_t : public abstract_device_t, public abstract_interrupt_controller_t {
164164
public:
165-
aplic_t(std::vector<processor_t*>&, aplic_t *parent);
165+
aplic_t(const simif_t*, aplic_t *parent);
166166
bool load(reg_t addr, size_t len, uint8_t* bytes);
167167
bool store(reg_t addr, size_t len, const uint8_t* bytes);
168168
void set_interrupt_level(uint32_t id, int lvl);
@@ -172,7 +172,7 @@ class aplic_t : public abstract_device_t, public abstract_interrupt_controller_t
172172
bool delegated(uint32_t id);
173173
uint32_t get_deleg_mask(uint32_t idx);
174174
private:
175-
std::vector<processor_t*>& procs;
175+
const simif_t *simif;
176176
class aplic_t *parent;
177177
class aplic_t *child;
178178
uint32_t domaincfg;

riscv/sim.cc

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ const size_t sim_t::INTERLEAVE;
3535

3636
extern device_factory_t* clint_factory;
3737
extern device_factory_t* plic_factory;
38-
extern device_factory_t* aplic_factory;
38+
extern device_factory_t* aplic_m_factory;
39+
extern device_factory_t* aplic_s_factory;
3940
extern device_factory_t* ns16550_factory;
4041
extern device_factory_t* imsic_mmio_factory;
4142

@@ -124,7 +125,8 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
124125
{clint_factory, {}}, // clint must be element 0
125126
{plic_factory, {}}, // plic must be element 1
126127
{imsic_mmio_factory, {}},
127-
{aplic_factory, {}},
128+
{aplic_m_factory, {}}, // must be element 3
129+
{aplic_s_factory, {}}, // must be element 4
128130
{ns16550_factory, {}}};
129131
device_factories.insert(device_factories.end(),
130132
plugin_device_factories.begin(),
@@ -278,21 +280,6 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
278280
}
279281
}
280282

281-
// create aplic
282-
reg_t aplic_m_base, aplic_s_base;
283-
if (fdt_parse_aplic(fdt, &aplic_m_base, &aplic_s_base, "riscv,aplic") == 0) {
284-
if (aplic_m_base) {
285-
aplic_m.reset(new aplic_t(procs, nullptr));
286-
bus.add_device(aplic_m_base, aplic_m.get());
287-
}
288-
if (aplic_s_base) {
289-
aplic_s.reset(new aplic_t(procs, aplic_m.get()));
290-
bus.add_device(aplic_s_base, aplic_s.get());
291-
if (aplic_m)
292-
aplic_m->set_child(aplic_s.get());
293-
}
294-
}
295-
296283
// must be located after procs/harts are set (devices might use sim_t get_* member functions)
297284
for (size_t i = 0; i < device_factories.size(); i++) {
298285
const device_factory_t* factory = device_factories[i].first;
@@ -308,6 +295,10 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
308295
clint = std::static_pointer_cast<clint_t>(dev_ptr);
309296
else if (i == 1) // plic_factory
310297
plic = std::static_pointer_cast<plic_t>(dev_ptr);
298+
else if (i == 3) // aplic_m_factory
299+
aplic_m = std::static_pointer_cast<aplic_t>(dev_ptr);
300+
else if (i == 4) // aplic_s_factory
301+
aplic_s = std::static_pointer_cast<aplic_t>(dev_ptr);
311302
}
312303
}
313304
}

riscv/sim.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class sim_t : public htif_t, public simif_t
7373
static const size_t INSNS_PER_RTC_TICK = 100; // 10 MHz clock for 1 BIPS core
7474
static const size_t CPU_HZ = 1000000000; // 1GHz CPU
7575

76+
std::shared_ptr<aplic_t> aplic_m;
77+
std::shared_ptr<aplic_t> aplic_s;
7678
private:
7779
const cfg_t * const cfg;
7880
std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
@@ -85,8 +87,6 @@ class sim_t : public htif_t, public simif_t
8587
std::vector<std::shared_ptr<abstract_device_t>> devices;
8688
std::shared_ptr<clint_t> clint;
8789
std::shared_ptr<plic_t> plic;
88-
std::shared_ptr<aplic_t> aplic_m;
89-
std::shared_ptr<aplic_t> aplic_s;
9090
bus_t bus;
9191
log_file_t log_file;
9292

0 commit comments

Comments
 (0)