mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Chen, Zide" <zide.chen@intel.com>
To: Yosry Ahmed <yosry@kernel.org>, Jim Mattson <jmattson@google.com>
Cc: Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	kvm@vger.kernel.org, Andi Kleen <ak@linux.intel.com>,
	Stephane Eranian <eranian@google.com>,
	linux-kernel@vger.kernel.org, Mingwei Zhang <mizhang@google.com>,
	Das Sandipan <Sandipan.Das@amd.com>,
	Shukla Manali <Manali.Shukla@amd.com>,
	Dapeng Mi <dapeng1.mi@linux.intel.com>,
	Xudong Hao <xudong.hao@intel.com>
Subject: Re: [PATCH v2 11/16] KVM: x86/pmu: Emulate the GLOBAL_STATUS_SET and GLOBAL_INUSE MSRs
Date: Mon, 2 Nov 2026 11:38:53 -0600	[thread overview]
Message-ID: <3276824d-f6a0-455a-bf0c-703fc6d52cf1@intel.com> (raw)
In-Reply-To: <auUQgRVFASkWtkoK@google.com>



On 10/30/2026 5:13 PM, Yosry Ahmed wrote:
>>> @@ -865,6 +867,7 @@ int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>>         case MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR:
>>>         case MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_SET:
>>>         case MSR_CORE_PERF_GLOBAL_OVF_CTRL:
>>> +       case MSR_CORE_PERF_GLOBAL_STATUS_SET:
>>>                 msr_info->data = 0;
>>>                 break;
>>>         default:
>>> @@ -931,6 +934,12 @@ int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>>                 if (!msr_info->host_initiated)
>>>                         pmu->global_status &= ~data;
>>>                 break;
>>> +       case MSR_CORE_PERF_GLOBAL_STATUS_SET:
>>> +               if (data & pmu->global_status_rsvd)
>>> +                       return 1;
>>> +               if (!msr_info->host_initiated)
>>> +                       pmu->global_status |= data;
>>> +               break;
>>
>> According to Intel SDM Vol. 4, Table 2-2 ("IA-32 Architectural MSRs"),
>> IA32_PERF_GLOBAL_STATUS.CondChgd[bit 63] cannot be set by writing to
>> IA32_PERF_GLOBAL_STATUS_SET, because IA32_PERF_GLOBAL_STATUS_SET[bit 63] is
>> reserved.  In other words, it is not possible to save/restore
>> IA32_PERF_GLOBAL_STATUS when bit 63 is set.
>>
>> Because bit 63 is clear in pmu->global_status_rsvd:
>>
>> 1. An intercepted guest WRMSR(MSR_CORE_PERF_GLOBAL_STATUS_SET, BIT_ULL(63))
>>    succeeds instead of injecting #GP(0) and sets bit 63 in
>>    pmu->global_status.
>> 2. When bit 63 is set in pmu->global_status (whether it was set by
>>    kvm_pmu_set_msr() or by intel_mediated_pmu_put()), the next
>>    intel_mediated_pmu_load() will try to write an illegal value to
>>    MSR_CORE_PERF_GLOBAL_STATUS_SET. I don't think we get a #GP, because
>>    every wrmsr is "safe" these days, but the write will be ignored.
> 
> On SPR, it does produce a #GP that gets ignored (and logged) and the bit
> is not set.  Interestingly, on CLX, the write goes through and the bit
> is set. Didn't check other CPUs.

Good catch! I tested a few more CPUs (DMR/CWF/SRF/GNR/NVL/LNL), and all
of them #GP on writes that set bit 63.

However, SKX, CLX, and ICX accept writes with bit 63 set and do not
generate #GP. On those systems, bit 63 also becomes visible when reading
back GLOBAL_STATUS. This behavior is documented in their errata:

SKX95/CLX89/ICX166. Bit 63 of IA32_PERF_GLOBAL_STATUS_SET MSR (391H) is
reserved. Due to this erratum, setting the bit will not result in #GP.

SKX:
https://cdrdv2-public.intel.com/336065/336065_Intel%20Xeon%20Processor%20Scalable%20Family%20Public%20Specification%20Update_rev17.pdf

CLX:
https://cdrdv2-public.intel.com/338848/338848_2nd%20Gen%20Intel%C2%AE%20Xeon%C2%AE%20Scalable%20Processors%20Specification%20Update_Rev028US.pdf

ICX:
https://cdrdv2-public.intel.com/637780/637780_3rd_Gen_Xeon_Scalable_Spec_Update_026US.pdf

Given that SKX95/CLX89/ICX166 document this behavior as an erratum,
while SPR and newer CPUs appear to follow the SDM and #GP, should KVM
continue to inject #GP for writes that set bit 63?


>> OTOH, what about PerfMon v4 bits 58 (GLOBAL_STATUS_LBRS_FROZEN), 59
>> (GLOBAL_STATUS_COUNTERS_FROZEN), and 61 (GLOBAL_STATUS_OVF_UNCORE)?  Per
>> Intel SDM Vol. 4, Table 2-2, those bits are valid in
>> IA32_PERF_GLOBAL_STATUS, IA32_PERF_GLOBAL_STATUS_RESET, and
>> IA32_PERF_GLOBAL_STATUS_SET when CPUID.0AH:EAX[7:0] > 3.
>>
>> When those MSRs are passed through in mediated mode, the guest can set bits
>> 58, 59, or 61 in hardware via IA32_PERF_GLOBAL_STATUS_SET. Leaving those
>> bits set in pmu->global_status_rsvd for pmu->version >= 4 will break
>> KVM_SET_MSRS(MSR_CORE_PERF_GLOBAL_STATUS) as well as any intercepted guest
>> writes to GLOBAL_OVF_CTRL / GLOBAL_STATUS_SET.
>>
>> As I pointed out in patch 04/16, we can't pass through the PMU global
>> controls unless their reserved bits match hardware.
> 
> I think there are two other relevant (but pre-existing) problems here:
> 
> 1. GLOBAL_STATUS_TRACE_TOPAPMI_BIT can leak from the host into the
> guest. If a host PT PMI arrives while the guest context is loaded, bit
> 55 will be set for the guest, and the guest won't be able to clear it if
> OVF_CTRL is intercepted (it will #GP as it is reserved for the guest).
> Similarly, the value can't be restored through KVM_SET_MSRS.

I think mediated vPMU assumes that no host PMIs can be generated while
guest PMU state is loaded.

If PT state can leak into the guest via bit 55, similar leakage can also
occur for other status bits, e.g. when the guest exposes fewer
general-purpose or fixed counters than the host.

The scenario where both host and guest can be active simultaneously is
handled by the perfmon_mask case, where intel_mediated_pmu_{load,put}()
filter guest-owned status bits.

https://lore.kernel.org/kvm/20260821222002.54907-1-zide.chen@intel.com/T/#m90394fda6d71ed0dd539a579abfb0c1df1e044fe

> (I think the PMI may also be lost as LVTPC points at the mediated vPMU
> vector)
> 
> 2. On AMD, bit 58 and 59 have a similar problem. HW accepts those bits
> but they are reserved for the guest, so the guest can set them if
> GLOBAL_STATUS_SET is passed through, but userspace cannot restore them.

Right. That seems orthogonal to this series and could be addressed with
follow-up fixes.

  reply	other threads:[~2026-11-02 17:38 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-27 22:37 [PATCH] KVM: x86/pmu: Add mediated vPMU PerfMon v5 support Zide Chen
2026-08-27 22:37 ` [PATCH v2 01/16] KVM: x86/pmu: Remove redundant Perf Global Status MSR bit definitions Zide Chen
2026-09-01  2:07   ` Mi, Dapeng
2026-10-28 14:03   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 02/16] KVM: x86/pmu: Rename all_valid_pmc_idx to pmc_exists Zide Chen
2026-09-01  2:09   ` Mi, Dapeng
2026-10-28 14:04   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 03/16] KVM: x86/pmu: Rename reserved_bits to eventsel_rsvd in kvm_pmu Zide Chen
2026-09-01  2:17   ` Mi, Dapeng
2026-10-28 14:05   ` Jim Mattson
2026-11-02 13:53   ` Sandipan Das
2026-08-27 22:37 ` [PATCH v2 04/16] KVM: x86/pmu: Gate BUFFER_OVF reserved bit on guest DS Zide Chen
2026-09-01  2:30   ` Mi, Dapeng
2026-10-28 14:25   ` Jim Mattson
2026-10-28 19:05     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 05/16] KVM: x86/pmu: Add PMC bitmap accessor helpers Zide Chen
2026-09-01  2:43   ` Mi, Dapeng
2026-10-28 14:32   ` Jim Mattson
2026-10-28 17:24     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 06/16] KVM: x86/pmu: Drop nr_arch_{gp,fixed}_counters from kvm_pmu Zide Chen
2026-09-01  3:07   ` Mi, Dapeng
2026-10-28 14:49   ` Jim Mattson
2026-10-28 17:04     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 07/16] KVM: x86/pmu: Expose kvm_host_pmu to vendor modules Zide Chen
2026-09-01  3:08   ` Mi, Dapeng
2026-10-28 17:33   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 08/16] perf/x86: Plumb counter bitmap from x86_pmu to x86_pmu_cap Zide Chen
2026-10-28 17:39   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 09/16] KVM: x86/pmu: Switch to bitmask-based KVM PMU capabilities Zide Chen
2026-09-01  3:32   ` Mi, Dapeng
2026-10-28 17:57   ` Jim Mattson
2026-10-28 20:56     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 10/16] perf/x86: Remove num_counters_{gp,fixed} from x86_pmu_capability Zide Chen
2026-10-28 18:01   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 11/16] KVM: x86/pmu: Emulate the GLOBAL_STATUS_SET and GLOBAL_INUSE MSRs Zide Chen
2026-09-01  6:45   ` Mi, Dapeng
2026-09-01 14:20     ` Chen, Zide
2026-09-02  0:44       ` Mi, Dapeng
2026-10-28 21:24   ` Jim Mattson
2026-10-29 17:45     ` Chen, Zide
2026-10-30 11:55       ` Jim Mattson
2026-10-30 17:20         ` Chen, Zide
2026-10-30 18:23           ` Jim Mattson
2026-10-30 20:01             ` Chen, Zide
2026-10-30 22:13     ` Yosry Ahmed
2026-11-02 17:38       ` Chen, Zide [this message]
2026-11-02 18:32         ` Jim Mattson
2026-11-02 18:49         ` Yosry Ahmed
2026-11-02 21:29           ` Chen, Zide
2026-11-02 21:36             ` Yosry Ahmed
2026-11-02 22:13               ` Chen, Zide
2026-11-02 22:25                 ` Jim Mattson
2026-11-02 22:48                   ` Chen, Zide
2026-11-02 22:51                     ` Yosry Ahmed
2026-11-02 23:26                       ` Chen, Zide
2026-11-02 23:37                         ` Yosry Ahmed
2026-11-02 23:44                       ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 12/16] KVM: x86/pmu: Populate CPUID.0AH:ECX fixed-counter bitmap Zide Chen
2026-09-01  6:50   ` Mi, Dapeng
2026-10-28 21:29   ` Jim Mattson
2026-10-28 21:55     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 13/16] KVM: x86/pmu: Factor out fixed counter control bit calculation Zide Chen
2026-09-01  6:57   ` Mi, Dapeng
2026-10-28 21:30   ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 14/16] KVM: x86/pmu: Ignore AnyThread bit if CPUID.0AH:EDX[15] is set Zide Chen
2026-09-01  8:01   ` Mi, Dapeng
2026-10-28 21:50   ` Jim Mattson
2026-10-28 23:05     ` Chen, Zide
2026-10-28 23:09       ` Jim Mattson
2026-08-27 22:37 ` [PATCH v2 15/16] KVM: x86/pmu: Advertise PerfMon version 5 on Intel hosts Zide Chen
2026-10-28 21:59   ` Jim Mattson
2026-10-28 22:10     ` Chen, Zide
2026-08-27 22:37 ` [PATCH v2 16/16] KVM: selftests: Support fixed counters bitmap in pmu_counters_test Zide Chen
2026-08-29  9:30 ` [PATCH] KVM: x86/pmu: Add mediated vPMU PerfMon v5 support Peter Zijlstra
2026-10-19 19:15 ` [PATCH v2] " Chen, Zide

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3276824d-f6a0-455a-bf0c-703fc6d52cf1@intel.com \
    --to=zide.chen@intel.com \
    --cc=Manali.Shukla@amd.com \
    --cc=Sandipan.Das@amd.com \
    --cc=ak@linux.intel.com \
    --cc=dapeng1.mi@linux.intel.com \
    --cc=eranian@google.com \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mizhang@google.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=seanjc@google.com \
    --cc=xudong.hao@intel.com \
    --cc=yosry@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®