lkml.org 
[lkml]   [2020]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 25/34] KVM: SVM: Do not report support for SMM for an SEV-ES guest
    Date
    From: Tom Lendacky <thomas.lendacky@amd.com>

    SEV-ES guests do not currently support SMM. Update the has_emulated_msr()
    kvm_x86_ops function to take a struct kvm parameter so that the capability
    can be reported at a VM level.

    Since this op is also called during KVM initialization and before a struct
    kvm instance is available, comments will be added to each implementation
    of has_emulated_msr() to indicate the kvm parameter can be null.

    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    ---
    arch/x86/include/asm/kvm_host.h | 2 +-
    arch/x86/kvm/svm/svm.c | 11 ++++++++++-
    arch/x86/kvm/vmx/vmx.c | 6 +++++-
    arch/x86/kvm/x86.c | 4 ++--
    4 files changed, 18 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index bd7169de7bcb..51343c7e69fb 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1091,7 +1091,7 @@ struct kvm_x86_ops {
    void (*hardware_disable)(void);
    void (*hardware_unsetup)(void);
    bool (*cpu_has_accelerated_tpr)(void);
    - bool (*has_emulated_msr)(u32 index);
    + bool (*has_emulated_msr)(struct kvm *kvm, u32 index);
    void (*vcpu_after_set_cpuid)(struct kvm_vcpu *vcpu);

    unsigned int vm_size;
    diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
    index fb529d5cb36d..b8167a889d8d 100644
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -3922,12 +3922,21 @@ static bool svm_cpu_has_accelerated_tpr(void)
    return false;
    }

    -static bool svm_has_emulated_msr(u32 index)
    +/*
    + * The kvm parameter can be NULL (module initialization, or invocation before
    + * VM creation). Be sure to check the kvm parameter before using it.
    + */
    +static bool svm_has_emulated_msr(struct kvm *kvm, u32 index)
    {
    switch (index) {
    case MSR_IA32_MCG_EXT_CTL:
    case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
    return false;
    + case MSR_IA32_SMBASE:
    + /* SEV-ES guests do not support SMM, so report false */
    + if (kvm && sev_es_guest(kvm))
    + return false;
    + break;
    default:
    break;
    }
    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index 47b8357b9751..006d91dca695 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -6399,7 +6399,11 @@ static void vmx_handle_exit_irqoff(struct kvm_vcpu *vcpu)
    handle_exception_nmi_irqoff(vmx);
    }

    -static bool vmx_has_emulated_msr(u32 index)
    +/*
    + * The kvm parameter can be NULL (module initialization, or invocation before
    + * VM creation). Be sure to check the kvm parameter before using it.
    + */
    +static bool vmx_has_emulated_msr(struct kvm *kvm, u32 index)
    {
    switch (index) {
    case MSR_IA32_SMBASE:
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 647d9e47195a..aecd931f46be 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -3777,7 +3777,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
    * fringe case that is not enabled except via specific settings
    * of the module parameters.
    */
    - r = kvm_x86_ops.has_emulated_msr(MSR_IA32_SMBASE);
    + r = kvm_x86_ops.has_emulated_msr(kvm, MSR_IA32_SMBASE);
    break;
    case KVM_CAP_VAPIC:
    r = !kvm_x86_ops.cpu_has_accelerated_tpr();
    @@ -5789,7 +5789,7 @@ static void kvm_init_msr_list(void)
    }

    for (i = 0; i < ARRAY_SIZE(emulated_msrs_all); i++) {
    - if (!kvm_x86_ops.has_emulated_msr(emulated_msrs_all[i]))
    + if (!kvm_x86_ops.has_emulated_msr(NULL, emulated_msrs_all[i]))
    continue;

    emulated_msrs[num_emulated_msrs++] = emulated_msrs_all[i];
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-11-09 23:30    [W:3.105 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site