On 12/6/18 7:49 AM, Peter Maydell wrote: >> + uint64_t hcr = arm_hcr_el2_eff(env); >> + if (hcr & HCR_E2H) { >> + hcr &= HCR_TLOR; >> + } else { >> + hcr &= HCR_TGE | HCR_TLOR; > This doesn't make sense to me
The logic is backward. What I was after was if (hcr & HCR_E2H) { hcr &= HCR_TGE | HCR_TLOR; } else { hcr &= HCR_TLOR; } if (hcr == HCR_TLOR) { trap to el2. } I.e. swap the then and else condition. This takes care of the two rules -- If (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 0 && HCR_EL2.TLOR == 1, then accesses at EL1 are trapped to EL2. -- If (SCR_EL3.NS == 1 || SCR_EL3.EEL2 == 1) && IsUsingAArch64(EL2) && HCR_EL2.E2H == 1 && HCR_EL2.TGE == 0 && HCR_EL2.TLOR == 1, then accesses at EL1 are trapped to EL2. r~