Browse Source

Merge pull request #2056 from binno/remove_shift_in_vstopi

Don't shift enabled bits of interrupt in vstopi csrs
pull/2059/head
Andrew Waterman 9 months ago
committed by GitHub
parent
commit
eff659cd43
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      riscv/csrs.cc

6
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 iprio = get_field(hvictl, HVICTL_IPRIO);
reg_t enabled_interrupts = state->mip->read() & state->mie->read() & state->hideleg->read(); 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 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 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; reg_t identity, priority;
if (vti) { if (vti) {
if (!(enabled_interrupts & MIP_SEIP) && iid == IRQ_S_EXT) reg_t interrupts = enabled_interrupts >> 1; // VSSIP -> SSIP, etc
if (!(interrupts & MIP_SEIP) && iid == IRQ_S_EXT)
return 0; return 0;
identity = ((enabled_interrupts & MIP_SEIP) && (iid == IRQ_S_EXT || dpr)) ? IRQ_S_EXT : iid; identity = ((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); priority = (identity == IRQ_S_EXT) ? virtual_sei_priority : ((iprio != 0 || !dpr) ? iprio : 255);
} else { } else {
if (!enabled_interrupts) if (!enabled_interrupts)

Loading…
Cancel
Save