Skip to content

Commit 1ab4e4d

Browse files
committed
AIA: include hypervisor interrupts in HS stopi
1 parent e60129b commit 1ab4e4d

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

riscv/csr_init.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
155155
add_hypervisor_csr(CSR_VSIP, vsip);
156156
add_supervisor_csr(CSR_SIP, sip);
157157
}
158-
add_hypervisor_csr(CSR_HIP, std::make_shared<mip_proxy_csr_t>(proc, CSR_HIP, hip_hie_accr));
158+
add_hypervisor_csr(CSR_HIP, hip = std::make_shared<mip_proxy_csr_t>(proc, CSR_HIP, hip_hie_accr));
159159
hvip = std::make_shared<hvip_csr_t>(proc, CSR_HVIP, 0);
160160
if (xlen == 32 && proc->extension_enabled_const(EXT_SSAIA)) {
161161
add_hypervisor_csr(CSR_HVIP, std::make_shared<rv32_low_csr_t>(proc, CSR_HVIP, hvip));
@@ -176,7 +176,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
176176
add_hypervisor_csr(CSR_VSIE, vsie);
177177
add_supervisor_csr(CSR_SIE, sie);
178178
}
179-
add_hypervisor_csr(CSR_HIE, std::make_shared<mie_proxy_csr_t>(proc, CSR_HIE, hip_hie_accr));
179+
add_hypervisor_csr(CSR_HIE, hie = std::make_shared<mie_proxy_csr_t>(proc, CSR_HIE, hip_hie_accr));
180180

181181
add_supervisor_csr(CSR_MEDELEG, medeleg = std::make_shared<medeleg_csr_t>(proc, CSR_MEDELEG));
182182
mideleg = std::make_shared<mideleg_csr_t>(proc, CSR_MIDELEG);

riscv/csrs.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2132,7 +2132,11 @@ void nonvirtual_stopi_csr_t::verify_permissions(insn_t insn, bool write) const {
21322132
}
21332133

21342134
reg_t nonvirtual_stopi_csr_t::read() const noexcept {
2135-
reg_t enabled_interrupts = state->nonvirtual_sip->read() & state->nonvirtual_sie->read() & ~state->hideleg->read();
2135+
reg_t enabled_interrupts = state->nonvirtual_sip->read() & state->nonvirtual_sie->read();
2136+
// include hypervisor interrupts for HS stopi
2137+
enabled_interrupts |= state->hip->read() & state->hie->read();
2138+
// mask out delegated interrupts
2139+
enabled_interrupts &= ~state->hideleg->read();
21362140
if (!enabled_interrupts)
21372141
return 0; // no enabled pending interrupt to S-mode
21382142

riscv/processor.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ struct state_t
133133
csr_t_p hgatp;
134134
csr_t_p hgeie;
135135
csr_t_p hgeip;
136+
csr_t_p hip;
137+
csr_t_p hie;
136138
hvip_csr_t_p hvip;
137139
sstatus_csr_t_p sstatus;
138140
vsstatus_csr_t_p vsstatus;

0 commit comments

Comments
 (0)