Skip to content

Commit 217285a

Browse files
committed
AIA: replace iprio with reserve ranges in add_ireg_proxy
aia_ireg_proxy_csr_t ignores writes and reads 0 by default
1 parent a4b0841 commit 217285a

File tree

3 files changed

+10
-30
lines changed

3 files changed

+10
-30
lines changed

riscv/csr_init.cc

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,12 @@ void state_t::add_csr(reg_t addr, const csr_t_p& csr)
1212
#define add_supervisor_csr(addr, csr) add_const_ext_csr('S', addr, csr)
1313
#define add_hypervisor_csr(addr, csr) add_ext_csr('H', addr, csr)
1414

15-
void state_t::add_ireg_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg)
15+
void state_t::add_ireg_proxy(sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg, aia_ireg_proxy_csr_t_p aia_proxy)
1616
{
17-
// This assumes xlen is always max_xlen, which is true today (see
18-
// mstatus_csr_t::unlogged_write()):
19-
auto xlen = proc->get_isa().get_max_xlen();
20-
21-
const reg_t iprio0_addr = 0x30;
22-
for (int i=0; i<16; i+=2) {
23-
csr_t_p iprio = std::make_shared<aia_csr_t>(proc, iprio0_addr + i, 0, 0);
24-
if (xlen == 32) {
25-
ireg->add_ireg_proxy(iprio0_addr + i, std::make_shared<rv32_low_csr_t>(proc, iprio0_addr + i, iprio));
26-
ireg->add_ireg_proxy(iprio0_addr + i + 1, std::make_shared<rv32_high_csr_t>(proc, iprio0_addr + i + 1, iprio));
27-
} else {
28-
ireg->add_ireg_proxy(iprio0_addr + i, iprio);
29-
}
30-
}
17+
// reserved range RAZ/WI
18+
ireg->add_ireg_proxy(0x71, aia_proxy);
19+
for (int i = 0x73; i <= 0x7f; i++)
20+
ireg->add_ireg_proxy(i, aia_proxy);
3121
}
3222

3323
void state_t::csr_init(processor_t* const proc, reg_t max_isa)
@@ -416,7 +406,6 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
416406

417407
sscsrind_reg_csr_t::sscsrind_reg_csr_t_p mireg;
418408
add_csr(CSR_MIREG, mireg = std::make_shared<sscsrind_reg_csr_t>(proc, CSR_MIREG, miselect));
419-
add_ireg_proxy(proc, mireg);
420409
const reg_t mireg_csrs[] = { CSR_MIREG2, CSR_MIREG3, CSR_MIREG4, CSR_MIREG5, CSR_MIREG6 };
421410
for (auto csr : mireg_csrs)
422411
add_csr(csr, std::make_shared<sscsrind_reg_csr_t>(proc, csr, miselect));
@@ -427,10 +416,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
427416
auto aia_mireg = std::make_shared<aia_ireg_proxy_csr_t>(proc, CSR_MIREG, miselect);
428417
for (auto &csr : *aia_mireg->get_csrmap())
429418
mireg->add_ireg_proxy(csr.first, aia_mireg);
430-
// reserved range RAZ/WI
431-
mireg->add_ireg_proxy(0x71, aia_mireg);
432-
for (int i = 0x73; i <= 0x7f; i++)
433-
mireg->add_ireg_proxy(i, aia_mireg);
419+
add_ireg_proxy(mireg, aia_mireg);
434420
}
435421
}
436422

@@ -445,7 +431,6 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
445431
add_hypervisor_csr(CSR_VSIREG, vsireg);
446432

447433
auto sireg = std::make_shared<sscsrind_reg_csr_t>(proc, CSR_SIREG, siselect);
448-
add_ireg_proxy(proc, sireg);
449434
add_supervisor_csr(CSR_SIREG, std::make_shared<virtualized_indirect_csr_t>(proc, sireg, vsireg));
450435

451436
const reg_t vsireg_csrs[] = { CSR_VSIREG2, CSR_VSIREG3, CSR_VSIREG4, CSR_VSIREG5, CSR_VSIREG6 };
@@ -515,18 +500,12 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
515500
// csrmaps of vs files are the same as vgein = 1
516501
for (auto &csr : *aia_vsireg->get_csrmap(1))
517502
vsireg->add_ireg_proxy(csr.first, aia_vsireg);
518-
// reserved range RAZ/WI
519-
vsireg->add_ireg_proxy(0x71, aia_vsireg);
520-
for (int i = 0x73; i <= 0x7f; i++)
521-
vsireg->add_ireg_proxy(i, aia_vsireg);
503+
add_ireg_proxy(vsireg, aia_vsireg);
522504

523505
auto aia_sireg = std::make_shared<aia_ireg_proxy_csr_t>(proc, CSR_SIREG, siselect);
524506
for (auto &csr : *aia_sireg->get_csrmap())
525507
sireg->add_ireg_proxy(csr.first, aia_sireg);
526-
// reserved range RAZ/WI
527-
sireg->add_ireg_proxy(0x71, aia_sireg);
528-
for (int i = 0x73; i <= 0x7f; i++)
529-
sireg->add_ireg_proxy(i, aia_sireg);
508+
add_ireg_proxy(sireg, aia_sireg);
530509
}
531510

532511
}

riscv/csrs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,7 @@ class aia_ireg_proxy_csr_t: public csr_t {
10291029
bool vs;
10301030
csrmap_t_p csrmap;
10311031
};
1032+
typedef std::shared_ptr<aia_ireg_proxy_csr_t> aia_ireg_proxy_csr_t_p;
10321033

10331034
class imsic_file_t;
10341035
typedef std::shared_ptr<imsic_file_t> imsic_file_t_p;

riscv/processor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ typedef std::vector<std::tuple<reg_t, uint64_t, uint8_t>> commit_log_mem_t;
7171
// architectural state of a RISC-V hart
7272
struct state_t
7373
{
74-
void add_ireg_proxy(processor_t* const proc, sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg);
74+
void add_ireg_proxy(sscsrind_reg_csr_t::sscsrind_reg_csr_t_p ireg, aia_ireg_proxy_csr_t_p aia_proxy);
7575
void reset(processor_t* const proc, reg_t max_isa);
7676
void add_csr(reg_t addr, const csr_t_p& csr);
7777

0 commit comments

Comments
 (0)