Skip to content

Commit bf4616e

Browse files
committed
AIA: eidelivery does not gate *topei registers
1 parent 2a5e00a commit bf4616e

File tree

3 files changed

+3
-4
lines changed

3 files changed

+3
-4
lines changed

riscv/csrs.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2259,7 +2259,7 @@ reg_t hgeip_csr_t::read() const noexcept {
22592259
// scan through all VGEINs
22602260
reg_t v = 0;
22612261
for (auto &i: proc->imsic->vs) {
2262-
if (i.second->topei())
2262+
if (i.second->delivery() && i.second->topei())
22632263
v |= reg_t(1) << i.first;
22642264
}
22652265
return v;

riscv/imsic.cc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ imsic_file_t::imsic_file_t(processor_t* const proc, reg_t mip_mask, size_t num_r
4848
}
4949

5050
reg_t imsic_file_t::topei() {
51-
if (eidelivery->read() != 1)
52-
return 0;
5351
reg_t thd = eithreshold->read();
5452
for (size_t i = 0; i < IMSIC_NUM_EI_REGS; i++) {
5553
reg_t ints = eip[i]->read() & eie[i]->read();
@@ -81,7 +79,7 @@ void imsic_file_t::pendei(reg_t intr) {
8179
}
8280

8381
void imsic_file_t::update_mip() {
84-
reg_t iid = topei();
82+
reg_t iid = eidelivery->read() ? topei() : 0;
8583
if (v) {
8684
// Privileged 9.2.4: Register hgeie selects the subset of guest external interrupts that cause a supervisor-level (HS-level) guest external interrupt.
8785
bool sgeip = proc->get_state()->hgeie->read() & proc->get_state()->hgeip->read();

riscv/imsic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class imsic_file_t {
4444
void claimei(reg_t intr);
4545
void pendei(reg_t intr);
4646
void update_mip();
47+
bool delivery() { return eidelivery->read(); }
4748
csr_t_p get_reg(reg_t reg) { return csrmap.count(reg) ? csrmap[reg] : nullptr; }
4849
csrmap_t csrmap;
4950

0 commit comments

Comments
 (0)