target/arm: ISR_EL1 bits track virtual interrupts if IMO/FMO set
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
This commit is contained in:
parent
9d1bab337c
commit
636540e9c4
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue