lkml.org 
[lkml]   [2024]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 129/130] RFC: KVM: x86: Add x86 callback to check cpuid
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    The x86 backend should check the consistency of KVM_SET_CPUID2 because it
    has its constraint. Add a callback for it. The backend code will come as
    another patch.

    Suggested-by: Sean Christopherson <seanjc@google.com>
    Link: https://lore.kernel.org/lkml/ZDiGpCkXOcCm074O@google.com/
    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/include/asm/kvm-x86-ops.h | 2 ++
    arch/x86/include/asm/kvm_host.h | 1 +
    arch/x86/kvm/cpuid.c | 20 ++++++++++++--------
    3 files changed, 15 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-x86-ops.h
    index 85c04aad6ab3..3a7140129855 100644
    --- a/arch/x86/include/asm/kvm-x86-ops.h
    +++ b/arch/x86/include/asm/kvm-x86-ops.h
    @@ -20,6 +20,8 @@ KVM_X86_OP(hardware_disable)
    KVM_X86_OP(hardware_unsetup)
    KVM_X86_OP_OPTIONAL_RET0(offline_cpu)
    KVM_X86_OP(has_emulated_msr)
    +/* TODO: Once all backend implemented this op, remove _OPTIONAL_RET0. */
    +KVM_X86_OP_OPTIONAL_RET0(vcpu_check_cpuid)
    KVM_X86_OP(vcpu_after_set_cpuid)
    KVM_X86_OP(is_vm_type_supported)
    KVM_X86_OP_OPTIONAL(max_vcpus);
    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index 920fb771246b..e4d40e31fc31 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1638,6 +1638,7 @@ struct kvm_x86_ops {
    void (*hardware_unsetup)(void);
    int (*offline_cpu)(void);
    bool (*has_emulated_msr)(struct kvm *kvm, u32 index);
    + int (*vcpu_check_cpuid)(struct kvm_vcpu *vcpu, struct kvm_cpuid_entry2 *e2, int nent);
    void (*vcpu_after_set_cpuid)(struct kvm_vcpu *vcpu);

    bool (*is_vm_type_supported)(unsigned long vm_type);
    diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
    index 8cdcd6f406aa..b57006943247 100644
    --- a/arch/x86/kvm/cpuid.c
    +++ b/arch/x86/kvm/cpuid.c
    @@ -136,6 +136,7 @@ static int kvm_check_cpuid(struct kvm_vcpu *vcpu,
    {
    struct kvm_cpuid_entry2 *best;
    u64 xfeatures;
    + int r;

    /*
    * The existing code assumes virtual address is 48-bit or 57-bit in the
    @@ -155,15 +156,18 @@ static int kvm_check_cpuid(struct kvm_vcpu *vcpu,
    * enabling in the FPU, e.g. to expand the guest XSAVE state size.
    */
    best = cpuid_entry2_find(entries, nent, 0xd, 0);
    - if (!best)
    - return 0;
    -
    - xfeatures = best->eax | ((u64)best->edx << 32);
    - xfeatures &= XFEATURE_MASK_USER_DYNAMIC;
    - if (!xfeatures)
    - return 0;
    + if (best) {
    + xfeatures = best->eax | ((u64)best->edx << 32);
    + xfeatures &= XFEATURE_MASK_USER_DYNAMIC;
    + if (xfeatures) {
    + r = fpu_enable_guest_xfd_features(&vcpu->arch.guest_fpu,
    + xfeatures);
    + if (r)
    + return r;
    + }
    + }

    - return fpu_enable_guest_xfd_features(&vcpu->arch.guest_fpu, xfeatures);
    + return static_call(kvm_x86_vcpu_check_cpuid)(vcpu, entries, nent);
    }

    /* Check whether the supplied CPUID data is equal to what is already set for the vCPU. */
    --
    2.25.1

    \
     
     \ /
      Last update: 2024-05-27 15:21    [W:4.032 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site