]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: nv: Fix handling of XN[0] when !FEAT_XNX
authorOliver Upton <oupton@kernel.org>
Tue, 2 Jun 2026 16:59:00 +0000 (09:59 -0700)
committerMarc Zyngier <maz@kernel.org>
Fri, 5 Jun 2026 13:07:06 +0000 (14:07 +0100)
XN has already been extracted from its bitfield position so using
FIELD_PREP() on the mask that clears XN[0] is completely broken, having
the effect of unconditionally granting execute permissions...

Fix the obvious mistake by manipulating the right bit.

Cc: stable@vger.kernel.org
Fixes: d93febe2ed2e ("KVM: arm64: nv: Forward FEAT_XNX permissions to the shadow stage-2")
Reviewed-by: Wei-Lin Chang <weilin.chang@arm.com>
Signed-off-by: Oliver Upton <oupton@kernel.org>
Link: https://patch.msgid.link/20260602165901.52800-2-oupton@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_nested.h

index dc2957662ff204d43ba9ead49a2db01542bf4b5b..cdf3e8422ea126daf83bd6fd03d283e9c4c0cc76 100644 (file)
@@ -132,7 +132,7 @@ static inline bool kvm_s2_trans_exec_el0(struct kvm *kvm, struct kvm_s2_trans *t
        u8 xn = FIELD_GET(KVM_PTE_LEAF_ATTR_HI_S2_XN, trans->desc);
 
        if (!kvm_has_xnx(kvm))
-               xn &= FIELD_PREP(KVM_PTE_LEAF_ATTR_HI_S2_XN, 0b10);
+               xn &= 0b10;
 
        switch (xn) {
        case 0b00:
@@ -148,7 +148,7 @@ static inline bool kvm_s2_trans_exec_el1(struct kvm *kvm, struct kvm_s2_trans *t
        u8 xn = FIELD_GET(KVM_PTE_LEAF_ATTR_HI_S2_XN, trans->desc);
 
        if (!kvm_has_xnx(kvm))
-               xn &= FIELD_PREP(KVM_PTE_LEAF_ATTR_HI_S2_XN, 0b10);
+               xn &= 0b10;
 
        switch (xn) {
        case 0b00: