target/arm: Mask virtual interrupts if HCR_EL2.TGE is set

If the "trap general exceptions" bit HCR_EL2.TGE is set, we
must mask all virtual interrupts (as per DDI0487C.a D1.14.3).
Implement this in arm_excp_unmasked().

Backports commit 2ccf0fef632f3d54b2cc9ea08f1e6904ff1f8df4 from qemu
This commit is contained in:
Peter Maydell 2018-08-16 06:38:50 -04:00 committed by Lioncash
parent 9d7deb2997
commit f0bf1160e4
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -2200,13 +2200,15 @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
break;
case EXCP_VFIQ:
if (secure || !(env->cp15.hcr_el2 & HCR_FMO)) {
if (secure || !(env->cp15.hcr_el2 & HCR_FMO)
|| (env->cp15.hcr_el2 & HCR_TGE)) {
/* VFIQs are only taken when hypervized and non-secure. */
return false;
}
return !(env->daif & PSTATE_F);
case EXCP_VIRQ:
if (secure || !(env->cp15.hcr_el2 & HCR_IMO)) {
if (secure || !(env->cp15.hcr_el2 & HCR_IMO)
|| (env->cp15.hcr_el2 & HCR_TGE)) {
/* VIRQs are only taken when hypervized and non-secure. */
return false;
}