]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Fix EL2 S1 XN handling for hVHE setups
authorMarc Zyngier <maz@kernel.org>
Wed, 10 Dec 2025 17:30:19 +0000 (17:30 +0000)
committerOliver Upton <oupton@kernel.org>
Thu, 8 Jan 2026 20:50:48 +0000 (12:50 -0800)
The current XN implementation is tied to the EL2 translation regime,
and fall flat on its face with the EL2&0 one that is used for hVHE,
as the permission bit for privileged execution is a different one.

Fixes: 6537565fd9b7f ("KVM: arm64: Adjust EL2 stage-1 leaf AP bits when ARM64_KVM_HVHE is set")
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Fuad Tabba <tabba@google.com>
Link: https://msgid.link/20251210173024.561160-2-maz@kernel.org
Signed-off-by: Oliver Upton <oupton@kernel.org>
arch/arm64/include/asm/kvm_pgtable.h

index fc02de43c68dd88b9beb8bd7a758af614328a958..be68b89692065a2c56972f6a7ec0c025d8eeda99 100644 (file)
@@ -87,7 +87,15 @@ typedef u64 kvm_pte_t;
 
 #define KVM_PTE_LEAF_ATTR_HI_SW                GENMASK(58, 55)
 
-#define KVM_PTE_LEAF_ATTR_HI_S1_XN     BIT(54)
+#define __KVM_PTE_LEAF_ATTR_HI_S1_XN   BIT(54)
+#define __KVM_PTE_LEAF_ATTR_HI_S1_UXN  BIT(54)
+#define __KVM_PTE_LEAF_ATTR_HI_S1_PXN  BIT(53)
+
+#define KVM_PTE_LEAF_ATTR_HI_S1_XN                                     \
+       ({ cpus_have_final_cap(ARM64_KVM_HVHE) ?                        \
+                       (__KVM_PTE_LEAF_ATTR_HI_S1_UXN |                \
+                        __KVM_PTE_LEAF_ATTR_HI_S1_PXN) :               \
+                       __KVM_PTE_LEAF_ATTR_HI_S1_XN; })
 
 #define KVM_PTE_LEAF_ATTR_HI_S2_XN     GENMASK(54, 53)