lkml.org 
[lkml]   [2020]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 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 256869c9f37b..cecd0eca66c7 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1092,7 +1092,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 3fb1703f32f8..3e6d79593b8d 100644
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -3934,12 +3934,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 c3441e7e5a87..a1ff4d7a310b 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 8665e7609040..53fe34fd1a7f 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -3795,7 +3795,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();
    @@ -5794,7 +5794,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-12-10 18:17    [W:4.374 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site