KVM: x86: Correct adjustment of KVM_CPUID_FEATURES
Subsystems (5)
v2 cover KVM: x86: Correct adjustment of KVM_CPUID_FEATURES
v2: Pre-requisite patch from Sean.
Paul Durrant (1):
KVM: x86: Make sure KVM_CPUID_FEATURES really are KVM_CPUID_FEATURES
Sean Christopherson (1):
KVM: x86: Add helper to consolidate core logic of SET_CPUID{2} flows
arch/x86/include/asm/kvm_host.h | 1 + arch/x86/include/asm/processor.h | 5 +- arch/x86/include/uapi/asm/kvm_para.h | 1 + arch/x86/kernel/kvm.c | 2 +- arch/x86/kvm/cpuid.c | 93 +++++++++++++++++++--------- 5 files changed, 71 insertions(+), 31 deletions(-)
---
Cc: Paolo Bonzini <[email protected]>
Cc: Vitaly Kuznetsov <[email protected]>
Cc: Wanpeng Li <[email protected]>
Cc: Jim Mattson <[email protected]>
Cc: Joerg Roedel <[email protected]>
PATCH v2 1/2 KVM: x86: Add helper to consolidate core logic of SET_CPUID{2} flows
From: Sean Christopherson <[email protected]>
Move the core logic of SET_CPUID and SET_CPUID2 to a common helper, the only difference between the two ioctls() is the format of the userspace struct. A future fix will add yet more code to the core logic.
No functional change intended.
---
Cc: Paolo Bonzini <[email protected]>
Cc: Vitaly Kuznetsov <[email protected]>
Cc: Wanpeng Li <[email protected]>
Cc: Jim Mattson <[email protected]>
Cc: Joerg Roedel <[email protected]>
v2:
- New in v2
--- arch/x86/kvm/cpuid.c | 47 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 23 deletions(-)
arch/x86/kvm/cpuid.c +24 -23
@@ -239,6 +239,25 @@ u64 kvm_vcpu_reserved_gpa_bits_raw(struct kvm_vcpu *vcpu)return rsvd_bits (cpuid_maxphyaddr (vcpu),63 ); } +static int kvm_set_cpuid (struct kvm_vcpu *vcpu,struct kvm_cpuid_entry2 *e2, +int nent) +{ +int r; + + r =kvm_check_cpuid (e2, nent); +if (r) +return r; + +kvfree (vcpu->arch.cpuid_entries); + vcpu->arch.cpuid_entries = e2; + vcpu->arch.cpuid_nent = nent; + +kvm_update_cpuid_runtime (vcpu); +kvm_vcpu_after_set_cpuid (vcpu); + +return 0 ; +} +/* when an old userspace process fills a new kernel module */ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid *cpuid,
@@ -275,18 +294,9 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, e2[i].padding[2 ] =0 ; } - r =kvm_check_cpuid (e2, cpuid->nent); -if (r) { + r =kvm_set_cpuid (vcpu, e2, cpuid->nent); +if (r)kvfree (e2); - goto out_free_cpuid; - } - -kvfree (vcpu->arch.cpuid_entries); - vcpu->arch.cpuid_entries = e2; - vcpu->arch.cpuid_nent = cpuid->nent; - -kvm_update_cpuid_runtime (vcpu); -kvm_vcpu_after_set_cpuid (vcpu); out_free_cpuid:kvfree (e);
@@ -310,20 +320,11 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,return PTR_ERR (e2); } - r =kvm_check_cpuid (e2, cpuid->nent); -if (r) { + r =kvm_set_cpuid (vcpu, e2, cpuid->nent); +if (r)kvfree (e2); -return r; - } -kvfree (vcpu->arch.cpuid_entries); - vcpu->arch.cpuid_entries = e2; - vcpu->arch.cpuid_nent = cpuid->nent; - -kvm_update_cpuid_runtime (vcpu); -kvm_vcpu_after_set_cpuid (vcpu); - -return 0 ; +return r; } int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
Signature · 1 line
2.20.1
PATCH v2 2/2 KVM: x86: Make sure KVM_CPUID_FEATURES really are KVM_CPUID_FEATURES
In reply to Paul DurrantCurrently when kvm_update_cpuid_runtime() runs, it assumes that the KVM_CPUID_FEATURES leaf is located at 0x40000001. This is not true, however, if Hyper-V support is enabled. In this case the KVM leaves will be offset.
This patch introdues as new 'kvm_cpuid_base' field into struct kvm_vcpu_arch to track the location of the KVM leaves and function kvm_update_kvm_cpuid_base() (called from kvm_set_cpuid()) to locate the leaves using the 'KVMKVMKVM\0\0\0' signature (which is now given a definition in kvm_para.h). Adjustment of KVM_CPUID_FEATURES will hence now target the correct leaf.
NOTE: A new for_each_possible_hypervisor_cpuid_base() macro is intoduced
into processor.h to avoid having duplicate code for the iteration over possible hypervisor base leaves.
---
Cc: Paolo Bonzini <[email protected]>
Cc: Sean Christopherson <[email protected]>
Cc: Vitaly Kuznetsov <[email protected]>
Cc: Wanpeng Li <[email protected]>
Cc: Jim Mattson <[email protected]>
Cc: Joerg Roedel <[email protected]>
v2:
- Added new for_each_possible_hypervisor_cpuid_base() macro
- Added KVM_SIGNATURE definition
- Other amendments as requested by Sean
--- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/include/asm/processor.h | 5 ++- arch/x86/include/uapi/asm/kvm_para.h | 1 + arch/x86/kernel/kvm.c | 2 +- arch/x86/kvm/cpuid.c | 46 ++++++++++++++++++++++++---- 5 files changed, 47 insertions(+), 8 deletions(-)
arch/x86/include/asm/kvm_host.h +1 -0
@@ -725,6 +725,7 @@ struct kvm_vcpu_arch {int cpuid_nent;struct kvm_cpuid_entry2 *cpuid_entries; +u32 kvm_cpuid_base;u64 reserved_gpa_bits;int maxphyaddr;
arch/x86/include/asm/processor.h +4 -1
@@ -807,11 +807,14 @@ static inline u32 amd_get_nodes_per_socket(void) { return 0; }static inline u32 amd_get_highest_perf (void ) {return 0 ; }#endif +#define for_each_possible_hypervisor_cpuid_base (function) \ + for (function = 0x40000000; function < 0x40010000; function += 0x100) +static inline uint32_t hypervisor_cpuid_base (const char *sig,uint32_t leaves) {uint32_t base, eax, signature[3 ]; -for (base =0x40000000 ; base <0x40010000 ; base +=0x100 ) { +for_each_possible_hypervisor_cpuid_base (base) {cpuid (base, &eax, &signature[0 ], &signature[1 ], &signature[2 ]); if (!memcmp(sig, signature, 12) &&
arch/x86/include/uapi/asm/kvm_para.h +1 -0
@@ -8,6 +8,7 @@* should be used to determine that a VM is running under KVM. */ #define KVM_CPUID_SIGNATURE 0x40000000 +#define KVM_SIGNATURE "KVMKVMKVM\0\0\0"/* This CPUID returns two feature bitmaps in eax, edx. Before enabling * a particular paravirtualization, the appropriate feature bit should
arch/x86/kernel/kvm.c +1 -1
@@ -755,7 +755,7 @@ static noinline uint32_t __kvm_cpuid_base(void)return 0 ;/* So we don't blow up on old processors */ if (boot_cpu_has (X86_FEATURE_HYPERVISOR )) -return hypervisor_cpuid_base ("KVMKVMKVM\0\0\0" ,0 ); +return hypervisor_cpuid_base (KVM_SIGNATURE ,0 );return 0 ; }
arch/x86/kvm/cpuid.c +40 -6
72 lines not on this page · raw message
Signature · 1 line
2.20.1
Quoted 14 lines · Paul Durrant
v2: Pre-requisite patch from Sean.
Paul Durrant (1):
KVM: x86: Make sureKVM_CPUID_FEATURESreally areKVM_CPUID_FEATURESSean Christopherson (1):
KVM: x86: Add helper to consolidate core logic of SET_CPUID{2} flowsarch/x86/include/asm/kvm_host.h | 1 + arch/x86/include/asm/processor.h | 5 +- arch/x86/include/uapi/asm/kvm_para.h | 1 + arch/x86/kernel/kvm.c | 2 +- arch/x86/kvm/cpuid.c | 93 +++++++++++++++++++--------- 5 files changed, 71 insertions(+), 31 deletions(-)
Quoted 7 lines
---
Cc: Paolo Bonzini <[email protected]>
Cc: Vitaly Kuznetsov <[email protected]>
Cc: Wanpeng Li <[email protected]>
Cc: Jim Mattson <[email protected]>
Cc: Joerg Roedel <[email protected]>
Queued, thanks.
Paolo