]> git.apps.os.sepia.ceph.com Git - ceph-client.git/commitdiff
KVM: arm64: nv: fix VNCR TLB ASID match logic for non-Global entries
authorGeonha Lee <w1nsom3gna@korea.ac.kr>
Wed, 3 Sep 2025 15:04:21 +0000 (00:04 +0900)
committerOliver Upton <oliver.upton@linux.dev>
Wed, 10 Sep 2025 09:56:19 +0000 (02:56 -0700)
kvm_vncr_tlb_lookup() is supposed to return true when the cached VNCR
TLB entry is valid for the current context. For non-Global entries, that
means the entry’s ASID must match the current ASID.

The current code returns true when the ASIDs do *not* match, which
inverts the logic. This is a potential vulnerability:

- Valid entries are ignored and we fall back to kvm_translate_vncr(),
  hurting performance.
- Mismatched entries are treated as permission faults (-EPERM) instead
  of triggering a fresh translation.
- This can also cause stale translations to be (wrongly) considered
  valid across address spaces.

Flip the predicate so non-Global entries only hit when ASIDs match.

Special credit to Team 0xB6 for reporting: DongHa Lee, Gyujeong Jin,
Daehyeon Ko, Geonha Lee, Hyungyu Oh, and Jaewon Yang.

Signed-off-by: Geonha Lee <w1nsom3gna@korea.ac.kr>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20250903150421.90752-1-w1nsom3gna@korea.ac.kr
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/nested.c

index 77db81bae86f9b1b4f34d63069a3bdebf03190ef..24eab94d7d7f4cd15104ade6fe081f5971f23543 100644 (file)
@@ -1276,7 +1276,7 @@ static bool kvm_vncr_tlb_lookup(struct kvm_vcpu *vcpu)
                    !(tcr & TCR_ASID16))
                        asid &= GENMASK(7, 0);
 
-               return asid != vt->wr.asid;
+               return asid == vt->wr.asid;
        }
 
        return true;