Re: [PATCH] arm64: Clear VTCR_EL2 in __init_el2_stage2()

From: Anshuman Khandual

Date: Mon Mar 16 2026 - 22:46:59 EST


On 13/03/26 3:29 PM, Mark Rutland wrote:
> On Fri, Mar 13, 2026 at 05:38:57AM +0000, Anshuman Khandual wrote:
>> Clear VTCR_EL2 along with VTTBR_EL2 register in __init_el2_stage2(), which
>> ensures that MMU stage-2 translation remain disabled.
>
> As Marc noted, that's not true -- whether stage 2 is enabled is governed
> entirely by HCR_EL2.VM.
> > The only reason to initialize VTCR_EL2 here would be if some field in
> VTCR_EL2 applies when stage 2 is *disabled*.

Understood. Something similar to VTTBR_EL2.VMID field which
gets into tagged TLB entries for EL0/EL1 translation regime
even when stage-2 is not enabled via HCR_EL2_VM.

But wondering if VTTBR_EL2.VMID gets cleaned up should not
it also be followed by a "tlbi vmalls12e1 --> dsb --> isb"
sequence to clear existing stale TLB entries ?

>
>> Although clearing out VTTBR_EL2 probably should have been sufficient
>> but adding VTCR_EL2 improves overall safety.
>
> It's unhelpful to send patches like this with unclear or non-existent
> rationale, and vague statements about what the patch might do. Was there

The commit message could have been more detailed and explicit
about its rationale. Although the intent here was to ensure
improved safety during S2 MMU context initialization.

> some specific reason to send this? e.g.
>
> * Did you have any specific reason to believe that setting some field in
> VTCR_EL2 was necessary? e.g. is there some misleading documentation,
> or comment elsewhere in the kernel?
>
> * Are you trying to fix some problem you've encountered, but haven't
> managed to debug?
>
> * Was this purely from inspection?

This was from code inspection while navigating S2 MMU context
initialization and management.

>
> Mark.
>
>> Cc: Catalin Marinas <catalin.marinas@xxxxxxx>
>> Cc: Will Deacon <will@xxxxxxxxxx>
>> Cc: Marc Zyngier <maz@xxxxxxxxxx>
>> Cc: Oliver Upton <oupton@xxxxxxxxxx>
>> Cc: Mark Rutland <mark.rutland@xxxxxxx>
>> Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
>> Cc: linux-kernel@xxxxxxxxxxxxxxx
>> Signed-off-by: Anshuman Khandual <anshuman.khandual@xxxxxxx>
>> ---
>> arch/arm64/include/asm/el2_setup.h | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/arch/arm64/include/asm/el2_setup.h b/arch/arm64/include/asm/el2_setup.h
>> index 85f4c1615472..2c88033591bb 100644
>> --- a/arch/arm64/include/asm/el2_setup.h
>> +++ b/arch/arm64/include/asm/el2_setup.h
>> @@ -189,6 +189,7 @@
>> /* Stage-2 translation */
>> .macro __init_el2_stage2
>> msr vttbr_el2, xzr
>> + msr vtcr_el2, xzr
>> .endm
>>
>> /* GICv3 system register access */
>> --
>> 2.30.2
>>