| From 4bf48e3c0aafd32b960d341c4925b48f416f14a5 Mon Sep 17 00:00:00 2001 |
| From: Sean Christopherson <seanjc@google.com> |
| Date: Wed, 23 Jun 2021 16:05:46 -0700 |
| Subject: KVM: x86: Use guest MAXPHYADDR from CPUID.0x8000_0008 iff TDP is enabled |
| |
| From: Sean Christopherson <seanjc@google.com> |
| |
| 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 | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kvm/cpuid.c |
| +++ b/arch/x86/kvm/cpuid.c |
| @@ -844,8 +844,14 @@ static inline int __do_cpuid_func(struct |
| 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; |
| cpuid_entry_override(entry, CPUID_8000_0008_EBX); |