lkml.org 
[lkml]   [2018]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 088/136] KVM: vmx: Inject #GP on invalid PAT CR
    3.16.54-rc1 review patch.  If anyone has any objections, please let me know.

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

    From: Nadav Amit <namit@cs.technion.ac.il>

    commit 4566654bb9be9e8864df417bb72ceee5136b6a6a upstream.

    Guest which sets the PAT CR to invalid value should get a #GP. Currently, if
    vmx supports loading PAT CR during entry, then the value is not checked. This
    patch makes the required check in that case.

    Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    arch/x86/kvm/vmx.c | 2 ++
    arch/x86/kvm/x86.c | 5 +++--
    arch/x86/kvm/x86.h | 2 ++
    3 files changed, 7 insertions(+), 2 deletions(-)

    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -2599,6 +2599,8 @@ static int vmx_set_msr(struct kvm_vcpu *
    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))
    + return 1;
    vmcs_write64(GUEST_IA32_PAT, data);
    vcpu->arch.pat = data;
    break;
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -1742,7 +1742,7 @@ static bool valid_mtrr_type(unsigned t)
    return t < 8 && (1 << t) & 0x73; /* 0, 1, 4, 5, 6 */
    }

    -static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
    +bool kvm_mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
    {
    int i;

    @@ -1768,12 +1768,13 @@ static bool mtrr_valid(struct kvm_vcpu *
    /* variable MTRRs */
    return valid_mtrr_type(data & 0xff);
    }
    +EXPORT_SYMBOL_GPL(kvm_mtrr_valid);

    static int set_msr_mtrr(struct kvm_vcpu *vcpu, u32 msr, u64 data)
    {
    u64 *p = (u64 *)&vcpu->arch.mtrr_state.fixed_ranges;

    - if (!mtrr_valid(vcpu, msr, data))
    + if (!kvm_mtrr_valid(vcpu, msr, data))
    return 1;

    if (msr == MSR_MTRRdefType) {
    --- a/arch/x86/kvm/x86.h
    +++ b/arch/x86/kvm/x86.h
    @@ -132,6 +132,8 @@ int kvm_write_guest_virt_system(struct x
    gva_t addr, void *val, unsigned int bytes,
    struct x86_exception *exception);

    +bool kvm_mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data);
    +
    #define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \
    | XSTATE_BNDREGS | XSTATE_BNDCSR)
    extern u64 host_xcr0;
    \
     
     \ /
      Last update: 2018-02-11 05:45    [W:4.439 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site