KVM: x86: Use guest MAXPHYADDR from CPUID.0x8000_0008 iff TDP is enabled
authorSean Christopherson <seanjc@google.com>
Wed, 23 Jun 2021 23:05:46 +0000 (16:05 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jul 2021 14:17:48 +0000 (16:17 +0200)
commit 4bf48e3c0aafd32b960d341c4925b48f416f14a5 upstream.

Ignore the guest MAXPHYADDR reported by CPUID.0x8000_0008 if TDP, i.e.
NPT, is disabled, and instead use the host's MAXPHYADDR.  Per AMD'S APM:

  Maximum guest physical address size in bits. This number applies only
  to guests using nested paging. When this field is zero, refer to the
  PhysAddrSize field for the maximum guest physical address size.

Fixes: 24c82e576b78 ("KVM: Sanitize cpuid")
Cc: stable@vger.kernel.org
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210623230552.4027702-2-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/cpuid.c

index 6ec1cfd0addd89c0b2919a20153744c4ebabc2d3..7e1ab0e0f3f2f98777ecd95574141e3b00b1e564 100644 (file)
@@ -649,8 +649,14 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
                unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
                unsigned phys_as = entry->eax & 0xff;
 
-               if (!g_phys_as)
+               /*
+                * Use bare metal's MAXPHADDR if the CPU doesn't report guest
+                * MAXPHYADDR separately, or if TDP (NPT) is disabled, as the
+                * guest version "applies only to guests using nested paging".
+                */
+               if (!g_phys_as || !tdp_enabled)
                        g_phys_as = phys_as;
+
                entry->eax = g_phys_as | (virt_as << 8);
                entry->edx = 0;
                /*