Skip to content

Commit f35abcb

Browse files
Fuad TabbaMarc Zyngier
authored andcommitted
KVM: arm64: Trap MTE access and discovery when MTE is disabled
If MTE is not supported by the hardware, or is disabled in the kernel configuration (`CONFIG_ARM64_MTE=n`) or command line (`arm64.nomte`), the kernel stops advertising MTE to userspace and avoids using MTE instructions. However, this is a software-level disable only. When MTE hardware is present and enabled by EL3 firmware, leaving `HCR_EL2.ATA` set allows the host to execute MTE instructions (STG, LDG, etc.) and access allocation tags in physical memory. Prevent this by clearing `HCR_EL2.ATA` when MTE is disabled. Remove it from the `HCR_HOST_NVHE_FLAGS` default, and conditionally set it in `cpu_prepare_hyp_mode()` only when `system_supports_mte()` returns true. This causes MTE instructions to trap to EL2 when `HCR_EL2.ATA` is cleared. Additionally, set `HCR_EL2.TID5` when MTE is disabled. This traps reads of `GMID_EL1` (Multiple tag transfer ID register) to EL2, preventing the discovery of MTE parameters (such as tag block size) when the feature is suppressed. Early boot code in `head.S` temporarily keeps `HCR_ATA` set to avoid special-casing initialization paths. This is safe because this code executes before untrusted code runs and will clear `HCR_ATA` if MTE is disabled. Signed-off-by: Fuad Tabba <tabba@google.com> Link: https://patch.msgid.link/20260122112218.531948-3-tabba@google.com Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent c103c2d commit f35abcb

3 files changed

Lines changed: 8 additions & 2 deletions

File tree

arch/arm64/include/asm/kvm_arm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
HCR_BSU_IS | HCR_FB | HCR_TACR | \
102102
HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW | HCR_TLOR | \
103103
HCR_FMO | HCR_IMO | HCR_PTW | HCR_TID3 | HCR_TID1)
104-
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK | HCR_ATA)
104+
#define HCR_HOST_NVHE_FLAGS (HCR_RW | HCR_API | HCR_APK)
105105
#define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC)
106106
#define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H | HCR_AMO | HCR_IMO | HCR_FMO)
107107

arch/arm64/kernel/head.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ SYM_INNER_LABEL(init_el2, SYM_L_LOCAL)
299299
isb
300300
0:
301301

302-
init_el2_hcr HCR_HOST_NVHE_FLAGS
302+
init_el2_hcr HCR_HOST_NVHE_FLAGS | HCR_ATA
303303
init_el2_state
304304

305305
/* Hypervisor stub */

arch/arm64/kvm/arm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2044,6 +2044,12 @@ static void __init cpu_prepare_hyp_mode(int cpu, u32 hyp_va_bits)
20442044
params->hcr_el2 = HCR_HOST_NVHE_PROTECTED_FLAGS;
20452045
else
20462046
params->hcr_el2 = HCR_HOST_NVHE_FLAGS;
2047+
2048+
if (system_supports_mte())
2049+
params->hcr_el2 |= HCR_ATA;
2050+
else
2051+
params->hcr_el2 |= HCR_TID5;
2052+
20472053
if (cpus_have_final_cap(ARM64_KVM_HVHE))
20482054
params->hcr_el2 |= HCR_E2H;
20492055
params->vttbr = params->vtcr = 0;

0 commit comments

Comments
 (0)