Signed-off-by: Richard Henderson <richard.hender...@linaro.org> --- target/arm/helper.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/target/arm/helper.c b/target/arm/helper.c index 3dde778369..7a817b7e28 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -2893,6 +2893,15 @@ static void vmsa_tcr_el12_write(CPUARMState *env, const ARMCPRegInfo *ri, raw_write(env, ri, value); } +static void flush_if_asid_change(CPUARMState *env, uint64_t old, + uint64_t new, unsigned mask) +{ + /* The ASID or VMID is in bits [63:48]. */ + if ((old ^ new) >> 48) { + tlb_flush_by_mmuidx(env_cpu(env), mask); + } +} + static void vmsa_ttbr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) { @@ -2914,12 +2923,11 @@ static void vmsa_tcr_ttbr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri, * TCR_EL2.A1 to know if this is really the TTBRx_EL2 that * holds the active ASID, only checking the field that might. */ - if (extract64(raw_read(env, ri) ^ value, 48, 16) && - (arm_hcr_el2_eff(env) & HCR_E2H)) { - uint16_t mask = ARMMMUIdxBit_E20_2 | - ARMMMUIdxBit_E20_2_PAN | - ARMMMUIdxBit_E20_0; - tlb_flush_by_mmuidx(env_cpu(env), mask); + if (arm_hcr_el2_eff(env) & HCR_E2H) { + flush_if_asid_change(env, raw_read(env, ri), value, + ARMMMUIdxBit_E20_2 | + ARMMMUIdxBit_E20_2_PAN | + ARMMMUIdxBit_E20_0); } raw_write(env, ri, value); } @@ -2927,16 +2935,11 @@ static void vmsa_tcr_ttbr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri, static void vttbr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) { - ARMCPU *cpu = env_archcpu(env); - CPUState *cs = CPU(cpu); - /* * A change in VMID to the stage2 page table (Stage2) invalidates * the stage2 and combined stage 1&2 tlbs (EL10_1 and EL10_0). */ - if (extract64(raw_read(env, ri) ^ value, 48, 16) != 0) { - tlb_flush_by_mmuidx(cs, alle1_tlbmask(env)); - } + flush_if_asid_change(env, raw_read(env, ri), value, alle1_tlbmask(env)); raw_write(env, ri, value); } -- 2.43.0