On Sat, 1 Feb 2020 at 19:29, Richard Henderson
<richard.hender...@linaro.org> wrote:
>
> Reviewed-by: Peter Maydell <peter.mayd...@linaro.org>
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
> ---
> v5: Flush all EL2 regimes with TLBI ALLE2 (pmm).
> ---
>  target/arm/helper.c | 34 +++++++++++++++++++++++++++-------
>  1 file changed, 27 insertions(+), 7 deletions(-)

> +static int vae2_tlbmask(CPUARMState *env)
> +{
> +    if (arm_hcr_el2_eff(env) & HCR_E2H) {
> +        return ARMMMUIdxBit_E20_0 | ARMMMUIdxBit_E20_2;
> +    } else {
> +        return ARMMMUIdxBit_E2;
> +    }
> +}

The TLBI VAE2 docs say the TLB entry has to be invalidated if:
 * The entry would be required to translate the specified VA using
   the EL2 or the EL2&0 translation regime.

and this isn't conditional on whether HCR_EL2.E2H is 0 or 1.
So given that we don't flush all TLBs when E2H is changed,
I think we need to always flush all of
 ARMMMUIdxBit_E20_0 | ARMMMUIdxBit_E20_2 | ARMMMUIdxBit_E2
here.

That would make this the same as alle2_tlbmask, which
seems logically correct, since the difference between
TLBI VAE2 and TLBI_ALLE2 is that the former specifies
a VA+ASID (and the ASID should matter if E2H==1 and
be ignored if E2H==0), not which translation regimes
they affect. e2_tlbmask() is probably a better name than
alle2_tlbmask(), in that case.

thanks
-- PMM

Reply via email to