Signed-off-by: Richard Henderson <richard.henderson@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