mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
target/arm: Correctly implement handling of HCR_EL2.{VI, VF}
In commit8a0fc3a29f
we tried to implement HCR_EL2.{VI,VF}, but we got it wrong and had to revert it. In that commit we implemented them as simply tracking whether there is a pending virtual IRQ or virtual FIQ. This is not correct -- these bits cause a software-generated VIRQ/VFIQ, which is distinct from whether there is a hardware-generated VIRQ/VFIQ caused by the external interrupt controller. So we need to track separately the HCR_EL2 bit state and the external virq/vfiq line state, and OR the two together to get the actual pending VIRQ/VFIQ state. Fixes:8a0fc3a29f
Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20181109134731.11605-4-peter.maydell@linaro.org
This commit is contained in:
parent
ed89f078ff
commit
89430fc6f8
3 changed files with 83 additions and 3 deletions
|
@ -871,4 +871,22 @@ static inline const char *aarch32_mode_name(uint32_t psr)
|
|||
return cpu_mode_names[psr & 0xf];
|
||||
}
|
||||
|
||||
/**
|
||||
* arm_cpu_update_virq: Update CPU_INTERRUPT_VIRQ bit in cs->interrupt_request
|
||||
*
|
||||
* Update the CPU_INTERRUPT_VIRQ bit in cs->interrupt_request, following
|
||||
* a change to either the input VIRQ line from the GIC or the HCR_EL2.VI bit.
|
||||
* Must be called with the iothread lock held.
|
||||
*/
|
||||
void arm_cpu_update_virq(ARMCPU *cpu);
|
||||
|
||||
/**
|
||||
* arm_cpu_update_vfiq: Update CPU_INTERRUPT_VFIQ bit in cs->interrupt_request
|
||||
*
|
||||
* Update the CPU_INTERRUPT_VFIQ bit in cs->interrupt_request, following
|
||||
* a change to either the input VFIQ line from the GIC or the HCR_EL2.VF bit.
|
||||
* Must be called with the iothread lock held.
|
||||
*/
|
||||
void arm_cpu_update_vfiq(ARMCPU *cpu);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue