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(). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180724115950.17316-2-peter.maydell@linaro.org
This commit is contained in:
parent
a3f0ecfd4e
commit
2ccf0fef63
@ -2261,13 +2261,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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user