lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 598/717] KVM: x86: reinstate vendor-agnostic check on SPEC_CTRL cpuid bits
    Date
    From: Paolo Bonzini <pbonzini@redhat.com>

    commit 39485ed95d6b83b62fa75c06c2c4d33992e0d971 upstream.

    Until commit e7c587da1252 ("x86/speculation: Use synthetic bits for
    IBRS/IBPB/STIBP"), KVM was testing both Intel and AMD CPUID bits before
    allowing the guest to write MSR_IA32_SPEC_CTRL and MSR_IA32_PRED_CMD.
    Testing only Intel bits on VMX processors, or only AMD bits on SVM
    processors, fails if the guests are created with the "opposite" vendor
    as the host.

    While at it, also tweak the host CPU check to use the vendor-agnostic
    feature bit X86_FEATURE_IBPB, since we only care about the availability
    of the MSR on the host here and not about specific CPUID bits.

    Fixes: e7c587da1252 ("x86/speculation: Use synthetic bits for IBRS/IBPB/STIBP")
    Cc: stable@vger.kernel.org
    Reported-by: Denis V. Lunev <den@openvz.org>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/kvm/cpuid.h | 14 ++++++++++++++
    arch/x86/kvm/svm/svm.c | 14 ++++----------
    arch/x86/kvm/vmx/vmx.c | 8 ++++----
    3 files changed, 22 insertions(+), 14 deletions(-)

    --- a/arch/x86/kvm/cpuid.h
    +++ b/arch/x86/kvm/cpuid.h
    @@ -264,6 +264,20 @@ static inline int guest_cpuid_stepping(s
    return x86_stepping(best->eax);
    }

    +static inline bool guest_has_spec_ctrl_msr(struct kvm_vcpu *vcpu)
    +{
    + return (guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL) ||
    + guest_cpuid_has(vcpu, X86_FEATURE_AMD_STIBP) ||
    + guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBRS) ||
    + guest_cpuid_has(vcpu, X86_FEATURE_AMD_SSBD));
    +}
    +
    +static inline bool guest_has_pred_cmd_msr(struct kvm_vcpu *vcpu)
    +{
    + return (guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL) ||
    + guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBPB));
    +}
    +
    static inline bool supports_cpuid_fault(struct kvm_vcpu *vcpu)
    {
    return vcpu->arch.msr_platform_info & MSR_PLATFORM_INFO_CPUID_FAULT;
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -2543,10 +2543,7 @@ static int svm_get_msr(struct kvm_vcpu *
    break;
    case MSR_IA32_SPEC_CTRL:
    if (!msr_info->host_initiated &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL) &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_STIBP) &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBRS) &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_SSBD))
    + !guest_has_spec_ctrl_msr(vcpu))
    return 1;

    msr_info->data = svm->spec_ctrl;
    @@ -2630,10 +2627,7 @@ static int svm_set_msr(struct kvm_vcpu *
    break;
    case MSR_IA32_SPEC_CTRL:
    if (!msr->host_initiated &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL) &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_STIBP) &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBRS) &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_SSBD))
    + !guest_has_spec_ctrl_msr(vcpu))
    return 1;

    if (kvm_spec_ctrl_test_value(data))
    @@ -2658,12 +2652,12 @@ static int svm_set_msr(struct kvm_vcpu *
    break;
    case MSR_IA32_PRED_CMD:
    if (!msr->host_initiated &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_AMD_IBPB))
    + !guest_has_pred_cmd_msr(vcpu))
    return 1;

    if (data & ~PRED_CMD_IBPB)
    return 1;
    - if (!boot_cpu_has(X86_FEATURE_AMD_IBPB))
    + if (!boot_cpu_has(X86_FEATURE_IBPB))
    return 1;
    if (!data)
    break;
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -1826,7 +1826,7 @@ static int vmx_get_msr(struct kvm_vcpu *
    break;
    case MSR_IA32_SPEC_CTRL:
    if (!msr_info->host_initiated &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL))
    + !guest_has_spec_ctrl_msr(vcpu))
    return 1;

    msr_info->data = to_vmx(vcpu)->spec_ctrl;
    @@ -2028,7 +2028,7 @@ static int vmx_set_msr(struct kvm_vcpu *
    break;
    case MSR_IA32_SPEC_CTRL:
    if (!msr_info->host_initiated &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL))
    + !guest_has_spec_ctrl_msr(vcpu))
    return 1;

    if (kvm_spec_ctrl_test_value(data))
    @@ -2063,12 +2063,12 @@ static int vmx_set_msr(struct kvm_vcpu *
    goto find_uret_msr;
    case MSR_IA32_PRED_CMD:
    if (!msr_info->host_initiated &&
    - !guest_cpuid_has(vcpu, X86_FEATURE_SPEC_CTRL))
    + !guest_has_pred_cmd_msr(vcpu))
    return 1;

    if (data & ~PRED_CMD_IBPB)
    return 1;
    - if (!boot_cpu_has(X86_FEATURE_SPEC_CTRL))
    + if (!boot_cpu_has(X86_FEATURE_IBPB))
    return 1;
    if (!data)
    break;

    \
     
     \ /
      Last update: 2020-12-28 15:43    [W:2.318 / U:0.524 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site