KVM: x86/pmu: Reject userspace attempts to set reserved GLOBAL_STATUS bits
authorLike Xu <likexu@tencent.com>
Sat, 3 Jun 2023 01:10:49 +0000 (18:10 -0700)
committerSean Christopherson <seanjc@google.com>
Wed, 7 Jun 2023 00:31:44 +0000 (17:31 -0700)
Reject userspace writes to MSR_CORE_PERF_GLOBAL_STATUS that attempt to set
reserved bits.  Allowing userspace to stuff reserved bits doesn't harm KVM
itself, but it's architecturally wrong and the guest can't clear the
unsupported bits, e.g. makes the guest's PMI handler very confused.

Signed-off-by: Like Xu <likexu@tencent.com>
[sean: rewrite changelog to avoid use of #GP, rebase on name change]
Link: https://lore.kernel.org/r/20230603011058.1038821-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/vmx/pmu_intel.c

index edcf8670eb4ed53064e006159fd8b98e586d4d13..efd113f24c1b43295751d113c7cb135295801526 100644 (file)
@@ -402,6 +402,9 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                if (!msr_info->host_initiated)
                        return 1; /* RO MSR */
 
+               if (data & pmu->global_status_mask)
+                       return 1;
+
                pmu->global_status = data;
                break;
        case MSR_CORE_PERF_GLOBAL_CTRL: