kvm: x86: Return LA57 feature based on hardware capability

Previously, 'commit 372fddf70904 ("x86/mm: Introduce the 'no5lvl' kernel
parameter")' cleared X86_FEATURE_LA57 in boot_cpu_data, if Linux chooses
to not run in 5-level paging mode. Yet boot_cpu_data is queried by
do_cpuid_ent() as the host capability later when creating vcpus, and Qemu
will not be able to detect this feature and create VMs with LA57 feature.

As discussed earlier, VMs can still benefit from extended linear address
width, e.g. to enhance features like ASLR. So we would like to fix this,
by return the true hardware capability when Qemu queries.

Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by Yu Zhang and committed by Paolo Bonzini 511da98d ad7dc69a

Changed files
+4
arch
x86
kvm
+4
arch/x86/kvm/cpuid.c
··· 335 335 unsigned f_xsaves = kvm_x86_ops->xsaves_supported() ? F(XSAVES) : 0; 336 336 unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0; 337 337 unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0; 338 + unsigned f_la57 = 0; 338 339 339 340 /* cpuid 1.edx */ 340 341 const u32 kvm_cpuid_1_edx_x86_features = ··· 490 489 // TSC_ADJUST is emulated 491 490 entry->ebx |= F(TSC_ADJUST); 492 491 entry->ecx &= kvm_cpuid_7_0_ecx_x86_features; 492 + f_la57 = entry->ecx & F(LA57); 493 493 cpuid_mask(&entry->ecx, CPUID_7_ECX); 494 + /* Set LA57 based on hardware capability. */ 495 + entry->ecx |= f_la57; 494 496 entry->ecx |= f_umip; 495 497 /* PKU is not yet implemented for shadow paging. */ 496 498 if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE))