Message ID | 20200201185218.24473-41-sean.j.christopherson@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: Introduce KVM cpu caps | expand |
Sean Christopherson <sean.j.christopherson@intel.com> writes: > Use the recently introduced KVM CPU caps to propagate VMX-only (kernel) > settings to supported CPUID flags. > > No functional change intended. > > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> > --- > arch/x86/kvm/vmx/vmx.c | 51 ++++++++++++++++++++++++------------------ > 1 file changed, 29 insertions(+), 22 deletions(-) > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index 11b9c1e7e520..bae915431c72 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -7102,37 +7102,42 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) > static void vmx_set_supported_cpuid(struct kvm_cpuid_entry2 *entry) > { > switch (entry->function) { > - case 0x1: > - if (nested) > - cpuid_entry_set(entry, X86_FEATURE_VMX); > - break; > case 0x7: > - if (boot_cpu_has(X86_FEATURE_MPX) && kvm_mpx_supported()) > - cpuid_entry_set(entry, X86_FEATURE_MPX); > - if (boot_cpu_has(X86_FEATURE_INVPCID) && cpu_has_vmx_invpcid()) > - cpuid_entry_set(entry, X86_FEATURE_INVPCID); > - if (boot_cpu_has(X86_FEATURE_INTEL_PT) && > - vmx_pt_mode_is_host_guest()) > - cpuid_entry_set(entry, X86_FEATURE_INTEL_PT); > if (vmx_umip_emulated()) > cpuid_entry_set(entry, X86_FEATURE_UMIP); > - > - /* PKU is not yet implemented for shadow paging. */ > - if (enable_ept && boot_cpu_has(X86_FEATURE_PKU) && > - boot_cpu_has(X86_FEATURE_OSPKE)) > - cpuid_entry_set(entry, X86_FEATURE_PKU); > - break; > - case 0x80000001: > - if (!cpu_has_vmx_rdtscp()) > - cpuid_entry_clear(entry, X86_FEATURE_RDTSCP); > - if (enable_ept && !cpu_has_vmx_ept_1g_page()) > - cpuid_entry_clear(entry, X86_FEATURE_GBPAGES); > break; > default: > break; > } > } > Same comment as for svm: I think someone may not understand what goes where, i.e. the separation between vmx_set_supported_cpuid() and vmx_set_cpu_caps(). > +static __init void vmx_set_cpu_caps(void) > +{ > + /* CPUID 0x1 */ > + if (nested) > + kvm_cpu_cap_set(X86_FEATURE_VMX); > + > + /* CPUID 0x7 */ > + if (boot_cpu_has(X86_FEATURE_MPX) && kvm_mpx_supported()) > + kvm_cpu_cap_set(X86_FEATURE_MPX); > + if (boot_cpu_has(X86_FEATURE_INVPCID) && cpu_has_vmx_invpcid()) > + kvm_cpu_cap_set(X86_FEATURE_INVPCID); > + if (boot_cpu_has(X86_FEATURE_INTEL_PT) && > + vmx_pt_mode_is_host_guest()) > + kvm_cpu_cap_set(X86_FEATURE_INTEL_PT); > + > + /* PKU is not yet implemented for shadow paging. */ > + if (enable_ept && boot_cpu_has(X86_FEATURE_PKU) && > + boot_cpu_has(X86_FEATURE_OSPKE)) > + kvm_cpu_cap_set(X86_FEATURE_PKU); > + > + /* CPUID 0x80000001 */ > + if (!cpu_has_vmx_rdtscp()) > + kvm_cpu_cap_clear(X86_FEATURE_RDTSCP); > + if (enable_ept && !cpu_has_vmx_ept_1g_page()) > + kvm_cpu_cap_clear(X86_FEATURE_GBPAGES); > +} > + > static void vmx_request_immediate_exit(struct kvm_vcpu *vcpu) > { > to_vmx(vcpu)->req_immediate_exit = true; > @@ -7750,6 +7755,8 @@ static __init int hardware_setup(void) > return r; > } > > + vmx_set_cpu_caps(); > + > r = alloc_kvm_area(); > if (r) > nested_vmx_hardware_unsetup(); Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 11b9c1e7e520..bae915431c72 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -7102,37 +7102,42 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) static void vmx_set_supported_cpuid(struct kvm_cpuid_entry2 *entry) { switch (entry->function) { - case 0x1: - if (nested) - cpuid_entry_set(entry, X86_FEATURE_VMX); - break; case 0x7: - if (boot_cpu_has(X86_FEATURE_MPX) && kvm_mpx_supported()) - cpuid_entry_set(entry, X86_FEATURE_MPX); - if (boot_cpu_has(X86_FEATURE_INVPCID) && cpu_has_vmx_invpcid()) - cpuid_entry_set(entry, X86_FEATURE_INVPCID); - if (boot_cpu_has(X86_FEATURE_INTEL_PT) && - vmx_pt_mode_is_host_guest()) - cpuid_entry_set(entry, X86_FEATURE_INTEL_PT); if (vmx_umip_emulated()) cpuid_entry_set(entry, X86_FEATURE_UMIP); - - /* PKU is not yet implemented for shadow paging. */ - if (enable_ept && boot_cpu_has(X86_FEATURE_PKU) && - boot_cpu_has(X86_FEATURE_OSPKE)) - cpuid_entry_set(entry, X86_FEATURE_PKU); - break; - case 0x80000001: - if (!cpu_has_vmx_rdtscp()) - cpuid_entry_clear(entry, X86_FEATURE_RDTSCP); - if (enable_ept && !cpu_has_vmx_ept_1g_page()) - cpuid_entry_clear(entry, X86_FEATURE_GBPAGES); break; default: break; } } +static __init void vmx_set_cpu_caps(void) +{ + /* CPUID 0x1 */ + if (nested) + kvm_cpu_cap_set(X86_FEATURE_VMX); + + /* CPUID 0x7 */ + if (boot_cpu_has(X86_FEATURE_MPX) && kvm_mpx_supported()) + kvm_cpu_cap_set(X86_FEATURE_MPX); + if (boot_cpu_has(X86_FEATURE_INVPCID) && cpu_has_vmx_invpcid()) + kvm_cpu_cap_set(X86_FEATURE_INVPCID); + if (boot_cpu_has(X86_FEATURE_INTEL_PT) && + vmx_pt_mode_is_host_guest()) + kvm_cpu_cap_set(X86_FEATURE_INTEL_PT); + + /* PKU is not yet implemented for shadow paging. */ + if (enable_ept && boot_cpu_has(X86_FEATURE_PKU) && + boot_cpu_has(X86_FEATURE_OSPKE)) + kvm_cpu_cap_set(X86_FEATURE_PKU); + + /* CPUID 0x80000001 */ + if (!cpu_has_vmx_rdtscp()) + kvm_cpu_cap_clear(X86_FEATURE_RDTSCP); + if (enable_ept && !cpu_has_vmx_ept_1g_page()) + kvm_cpu_cap_clear(X86_FEATURE_GBPAGES); +} + static void vmx_request_immediate_exit(struct kvm_vcpu *vcpu) { to_vmx(vcpu)->req_immediate_exit = true; @@ -7750,6 +7755,8 @@ static __init int hardware_setup(void) return r; } + vmx_set_cpu_caps(); + r = alloc_kvm_area(); if (r) nested_vmx_hardware_unsetup();
Use the recently introduced KVM CPU caps to propagate VMX-only (kernel) settings to supported CPUID flags. No functional change intended. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> --- arch/x86/kvm/vmx/vmx.c | 51 ++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 22 deletions(-)