Skip to content

Commit

Permalink
target/arm: ISR_EL1 bits track virtual interrupts if IMO/FMO set
Browse files Browse the repository at this point in the history
The A/I/F bits in ISR_EL1 should track the virtual interrupt
status, not the physical interrupt status, if the associated
HCR_EL2.AMO/IMO/FMO bit is set. Implement this, rather than
always showing the physical interrupt status.

We don't currently implement anything to do with external
aborts, so this applies only to the I and F bits (though it
ought to be possible for the outer guest to present a virtual
external abort to the inner guest, even if QEMU doesn't
emulate physical external aborts, so there is missing
functionality in this area).

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20181012144235.19646-6-peter.maydell@linaro.org
  • Loading branch information
pm215 committed Oct 24, 2018
1 parent 9d1bab3 commit 636540e
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions target/arm/helper.c
Expand Up @@ -1329,12 +1329,26 @@ static uint64_t isr_read(CPUARMState *env, const ARMCPRegInfo *ri)
CPUState *cs = ENV_GET_CPU(env);
uint64_t ret = 0;

if (cs->interrupt_request & CPU_INTERRUPT_HARD) {
ret |= CPSR_I;
if (arm_hcr_el2_imo(env)) {
if (cs->interrupt_request & CPU_INTERRUPT_VIRQ) {
ret |= CPSR_I;
}
} else {
if (cs->interrupt_request & CPU_INTERRUPT_HARD) {
ret |= CPSR_I;
}
}
if (cs->interrupt_request & CPU_INTERRUPT_FIQ) {
ret |= CPSR_F;

if (arm_hcr_el2_fmo(env)) {
if (cs->interrupt_request & CPU_INTERRUPT_VFIQ) {
ret |= CPSR_F;
}
} else {
if (cs->interrupt_request & CPU_INTERRUPT_FIQ) {
ret |= CPSR_F;
}
}

/* External aborts are not possible in QEMU so A bit is always clear */
return ret;
}
Expand Down

0 comments on commit 636540e

Please sign in to comment.