lkml.org 
[lkml]   [2019]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 52/56] KVM: x86: Emulate MSR_IA32_ARCH_CAPABILITIES on AMD hosts
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Sean Christopherson <sean.j.christopherson@intel.com>

    commit 0cf9135b773bf32fba9dd8e6699c1b331ee4b749 upstream.

    The CPUID flag ARCH_CAPABILITIES is unconditioinally exposed to host
    userspace for all x86 hosts, i.e. KVM advertises ARCH_CAPABILITIES
    regardless of hardware support under the pretense that KVM fully
    emulates MSR_IA32_ARCH_CAPABILITIES. Unfortunately, only VMX hosts
    handle accesses to MSR_IA32_ARCH_CAPABILITIES (despite KVM_GET_MSRS
    also reporting MSR_IA32_ARCH_CAPABILITIES for all hosts).

    Move the MSR_IA32_ARCH_CAPABILITIES handling to common x86 code so
    that it's emulated on AMD hosts.

    Fixes: 1eaafe91a0df4 ("kvm: x86: IA32_ARCH_CAPABILITIES is always supported")
    Cc: stable@vger.kernel.org
    Reported-by: Xiaoyao Li <xiaoyao.li@linux.intel.com>
    Cc: Jim Mattson <jmattson@google.com>
    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/include/asm/kvm_host.h | 1 +
    arch/x86/kvm/vmx.c | 14 --------------
    arch/x86/kvm/x86.c | 12 ++++++++++++
    3 files changed, 13 insertions(+), 14 deletions(-)

    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -487,6 +487,7 @@ struct kvm_vcpu_arch {
    bool tpr_access_reporting;
    u64 ia32_xss;
    u64 microcode_version;
    + u64 arch_capabilities;

    /*
    * Paging state of the vcpu
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -714,7 +714,6 @@ struct vcpu_vmx {
    u64 msr_guest_kernel_gs_base;
    #endif

    - u64 arch_capabilities;
    u64 spec_ctrl;

    u32 vm_entry_controls_shadow;
    @@ -3209,12 +3208,6 @@ static int vmx_get_msr(struct kvm_vcpu *

    msr_info->data = to_vmx(vcpu)->spec_ctrl;
    break;
    - case MSR_IA32_ARCH_CAPABILITIES:
    - if (!msr_info->host_initiated &&
    - !guest_cpuid_has_arch_capabilities(vcpu))
    - return 1;
    - msr_info->data = to_vmx(vcpu)->arch_capabilities;
    - break;
    case MSR_IA32_SYSENTER_CS:
    msr_info->data = vmcs_read32(GUEST_SYSENTER_CS);
    break;
    @@ -3376,11 +3369,6 @@ static int vmx_set_msr(struct kvm_vcpu *
    vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD,
    MSR_TYPE_W);
    break;
    - case MSR_IA32_ARCH_CAPABILITIES:
    - if (!msr_info->host_initiated)
    - return 1;
    - vmx->arch_capabilities = data;
    - break;
    case MSR_IA32_CR_PAT:
    if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
    if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
    @@ -5468,8 +5456,6 @@ static int vmx_vcpu_setup(struct vcpu_vm
    ++vmx->nmsrs;
    }

    - vmx->arch_capabilities = kvm_get_arch_capabilities();
    -
    vm_exit_controls_init(vmx, vmcs_config.vmexit_ctrl);

    /* 22.2.1, 20.8.1 */
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -2197,6 +2197,11 @@ int kvm_set_msr_common(struct kvm_vcpu *
    if (msr_info->host_initiated)
    vcpu->arch.microcode_version = data;
    break;
    + case MSR_IA32_ARCH_CAPABILITIES:
    + if (!msr_info->host_initiated)
    + return 1;
    + vcpu->arch.arch_capabilities = data;
    + break;
    case MSR_EFER:
    return set_efer(vcpu, data);
    case MSR_K7_HWCR:
    @@ -2473,6 +2478,12 @@ int kvm_get_msr_common(struct kvm_vcpu *
    case MSR_IA32_UCODE_REV:
    msr_info->data = vcpu->arch.microcode_version;
    break;
    + case MSR_IA32_ARCH_CAPABILITIES:
    + if (!msr_info->host_initiated &&
    + !guest_cpuid_has_arch_capabilities(vcpu))
    + return 1;
    + msr_info->data = vcpu->arch.arch_capabilities;
    + break;
    case MSR_MTRRcap:
    case 0x200 ... 0x2ff:
    return kvm_mtrr_get_msr(vcpu, msr_info->index, &msr_info->data);
    @@ -7672,6 +7683,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu
    {
    int r;

    + vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
    kvm_vcpu_mtrr_init(vcpu);
    r = vcpu_load(vcpu);
    if (r)

    \
     
     \ /
      Last update: 2019-04-01 19:29    [W:5.025 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site