lkml.org 
[lkml]   [2019]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 23/24] KVM: x86/pmu: do not mask the value that is written to fixed PMUs
    Date
    From: Paolo Bonzini <pbonzini@redhat.com>

    [ Upstream commit 2924b52117b2812e9633d5ea337333299166d373 ]

    According to the SDM, for MSR_IA32_PERFCTR0/1 "the lower-order 32 bits of
    each MSR may be written with any value, and the high-order 8 bits are
    sign-extended according to the value of bit 31", but the fixed counters
    in real hardware are limited to the width of the fixed counters ("bits
    beyond the width of the fixed-function counter are reserved and must be
    written as zeros"). Fix KVM to do the same.

    Reported-by: Nadav Amit <nadav.amit@gmail.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/kvm/pmu_intel.c | 13 ++++++++-----
    1 file changed, 8 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/kvm/pmu_intel.c b/arch/x86/kvm/pmu_intel.c
    index 5ab4a364348e..2729131fe9bf 100644
    --- a/arch/x86/kvm/pmu_intel.c
    +++ b/arch/x86/kvm/pmu_intel.c
    @@ -235,11 +235,14 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    }
    break;
    default:
    - if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) ||
    - (pmc = get_fixed_pmc(pmu, msr))) {
    - if (!msr_info->host_initiated)
    - data = (s64)(s32)data;
    - pmc->counter += data - pmc_read_counter(pmc);
    + if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) {
    + if (msr_info->host_initiated)
    + pmc->counter = data;
    + else
    + pmc->counter = (s32)data;
    + return 0;
    + } else if ((pmc = get_fixed_pmc(pmu, msr))) {
    + pmc->counter = data;
    return 0;
    } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {
    if (data == pmc->eventsel)
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-06-05 01:28    [W:4.307 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site