aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2025-08-28 00:51:38 -0700
committerGitHub <noreply@github.com>2025-08-28 00:51:38 -0700
commit9a46080b52b40c7df6dc85aed730c31b077049e3 (patch)
treee913f3183ad22f07dc15f04ceb8bfd9c20a44dbc
parenteff659cd43d7eafb7f3559bceed2540eabb31c50 (diff)
parentfaeecd8d72b447c363f32c27fc9a0aa6f577e21e (diff)
downloadspike-9a46080b52b40c7df6dc85aed730c31b077049e3.zip
spike-9a46080b52b40c7df6dc85aed730c31b077049e3.tar.gz
spike-9a46080b52b40c7df6dc85aed730c31b077049e3.tar.bz2
Merge pull request #2062 from binno/revert_vstopi_change
Revert "Don't shift enabled bits of interrupt in vstopi csrs"
-rw-r--r--riscv/csrs.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc
index a0a4698..76f600d 100644
--- a/riscv/csrs.cc
+++ b/riscv/csrs.cc
@@ -2173,16 +2173,16 @@ reg_t vstopi_csr_t::read() const noexcept {
reg_t iprio = get_field(hvictl, HVICTL_IPRIO);
reg_t enabled_interrupts = state->mip->read() & state->mie->read() & state->hideleg->read();
+ enabled_interrupts >>= 1; // VSSIP -> SSIP, etc
reg_t vgein = get_field(state->hstatus->read(), HSTATUS_VGEIN);
reg_t virtual_sei_priority = (vgein == 0 && iid == IRQ_S_EXT && iprio != 0) ? iprio : 255; // vstopi.IPRIO is 255 for priority number 256
reg_t identity, priority;
if (vti) {
- reg_t interrupts = enabled_interrupts >> 1; // VSSIP -> SSIP, etc
- if (!(interrupts & MIP_SEIP) && iid == IRQ_S_EXT)
+ if (!(enabled_interrupts & MIP_SEIP) && iid == IRQ_S_EXT)
return 0;
- identity = ((interrupts & MIP_SEIP) && (iid == IRQ_S_EXT || dpr)) ? IRQ_S_EXT : iid;
+ identity = ((enabled_interrupts & MIP_SEIP) && (iid == IRQ_S_EXT || dpr)) ? IRQ_S_EXT : iid;
priority = (identity == IRQ_S_EXT) ? virtual_sei_priority : ((iprio != 0 || !dpr) ? iprio : 255);
} else {
if (!enabled_interrupts)