Skip to content

Commit 6d384aa

Browse files
committed
AIA: refactor APLIC init
1 parent c3109e9 commit 6d384aa

File tree

4 files changed

+64
-27
lines changed

4 files changed

+64
-27
lines changed

riscv/aplic.cc

Lines changed: 39 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,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)

riscv/devices.h

Lines changed: 10 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;
@@ -192,6 +192,14 @@ class aplic_t : public abstract_device_t, public abstract_interrupt_controller_t
192192
void update_interrupt(uint32_t id);
193193
void update_interrupt_masked(uint32_t idx, uint32_t mask);
194194
};
195+
class aplic_m_t : public aplic_t {
196+
public:
197+
aplic_m_t(const simif_t* simif, aplic_t *parent) : aplic_t(simif, parent) {}
198+
};
199+
class aplic_s_t : public aplic_t {
200+
public:
201+
aplic_s_t(const simif_t* simif, aplic_t *parent) : aplic_t(simif, parent) {}
202+
};
195203

196204
class ns16550_t : public abstract_device_t {
197205
public:

riscv/sim.cc

Lines changed: 13 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, {}},
125126
{plic_factory, {}},
126127
{imsic_mmio_factory, {}},
127-
{aplic_factory, {}},
128+
{aplic_m_factory, {}},
129+
{aplic_s_factory, {}},
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;
@@ -313,6 +300,15 @@ sim_t::sim_t(const cfg_t *cfg, bool halted,
313300
assert(!plic);
314301
plic = std::static_pointer_cast<plic_t>(dev_ptr);
315302
}
303+
304+
if (dynamic_cast<aplic_m_t*>(&*dev_ptr)) {
305+
assert(!aplic_m);
306+
aplic_m = std::static_pointer_cast<aplic_m_t>(dev_ptr);
307+
}
308+
if (dynamic_cast<aplic_s_t*>(&*dev_ptr)) {
309+
assert(!aplic_s);
310+
aplic_s = std::static_pointer_cast<aplic_s_t>(dev_ptr);
311+
}
316312
}
317313
}
318314
}

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_m_t> aplic_m;
77+
std::shared_ptr<aplic_s_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)