All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 00/14] KVM: arm64: Support FEAT_PMUv3 on Apple hardware
@ 2024-12-03 19:32 Oliver Upton
  2024-12-03 19:32 ` [RFC PATCH 01/14] drivers/perf: apple_m1: Refactor event select/filter configuration Oliver Upton
                   ` (13 more replies)
  0 siblings, 14 replies; 21+ messages in thread
From: Oliver Upton @ 2024-12-03 19:32 UTC (permalink / raw)
  To: kvmarm
  Cc: Marc Zyngier, Joey Gouly, Suzuki K Poulose, Zenghui Yu,
	Mingwei Zhang, Colton Lewis, Raghavendra Rao Ananta,
	Catalin Marinas, Will Deacon, Mark Rutland, linux-arm-kernel,
	linux-kernel, Oliver Upton

One of the interesting features of some Apple M* parts is an IMPDEF trap
that routes EL1/EL0 accesses of the PMUv3 registers to EL2. This allows
a hypervisor to emulate an architectural PMUv3 on top of the IMPDEF PMU
hardware present in the CPU.

And if you squint, this _might_ look like a CPU erratum :-)

This series takes advantage of these IMPDEF traps to provide PMUv3 to
KVM guests. As a starting point, only expose the fixed CPU cycle counter
and no event counters. Conveniently, this is enough to get Windows
running as a KVM guest on Apple hardware.

I've tried to keep the deviation to a minimum by refactoring some of the
flows used for PMUv3, e.g. computing PMCEID from the arm_pmu bitmap
instead of reading hardware directly.

Sending this as an RFC as there are some obvious open Qs:

 - Does enabling PMUv3 meet the bar for allowing IMPDEF crap to slide
   into KVM?

   I certainly think the answer is 'yes', especially considering this
   enables Windows guests.

 - Do we want to support programmable event counters?

   I'm sitting on some extra patches to do this, which maps a few
   architectural event IDs into the PERF_TYPE_HARDWARE space, allowing
   the perf driver to select the right hardware event ID.

   Deciding on a sensible number of counters in this case is a bit of a
   mess, as the M* PMCs aren't entirely fungible (some events only work
   on specific counters).

Applies to 6.13-rc1. I've only enabled this for M2 as it is the hardware
I have, but it is extremely likely this feature works on other M* parts.

It is also very possible I've broken something for true PMUv3 hardware,
as I've only tested on the M2.

Oliver Upton (14):
  drivers/perf: apple_m1: Refactor event select/filter configuration
  drivers/perf: apple_m1: Support host/guest event filtering
  drivers/perf: apple_m1: Map generic branch events
  KVM: arm64: Compute PMCEID from arm_pmu's event bitmaps
  KVM: arm64: Always allow fixed cycle counter
  KVM: arm64: Use PERF_COUNT_HW_CPU_CYCLES for fixed cycle counter
  KVM: arm64: Use a cpucap to determine if system supports FEAT_PMUv3
  KVM: arm64: Drop kvm_arm_pmu_available static key
  KVM: arm64: Use guard() to cleanup usage of arm_pmus_lock
  KVM: arm64: Move PMUVer filtering into KVM code
  KVM: arm64: Compute synthetic sysreg ESR for Apple PMUv3 traps
  KVM: arm64: Advertise PMUv3 if IMPDEF traps are present
  KVM: arm64: Advertise 0 event counters for IMPDEF PMU
  arm64: Enable IMP DEF PMUv3 traps on Apple M2

 arch/arm64/include/asm/apple_m1_pmu.h   |   1 +
 arch/arm64/include/asm/cpufeature.h     |  28 +----
 arch/arm64/kernel/cpu_errata.c          |  38 ++++++
 arch/arm64/kernel/cpufeature.c          |  19 +++
 arch/arm64/kernel/image-vars.h          |   5 -
 arch/arm64/kvm/arm.c                    |   4 +-
 arch/arm64/kvm/hyp/include/hyp/switch.h |   4 +-
 arch/arm64/kvm/hyp/vhe/switch.c         |  22 ++++
 arch/arm64/kvm/pmu-emul.c               | 159 +++++++++++++++---------
 arch/arm64/kvm/pmu.c                    |  10 +-
 arch/arm64/tools/cpucaps                |   2 +
 drivers/perf/apple_m1_cpu_pmu.c         |  68 ++++++----
 include/kvm/arm_pmu.h                   |  15 +--
 13 files changed, 248 insertions(+), 127 deletions(-)


base-commit: 40384c840ea1944d7c5a392e8975ed088ecf0b37
-- 
2.39.5

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2024-12-10  9:49 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-03 19:32 [RFC PATCH 00/14] KVM: arm64: Support FEAT_PMUv3 on Apple hardware Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 01/14] drivers/perf: apple_m1: Refactor event select/filter configuration Oliver Upton
2024-12-05  3:32   ` kernel test robot
2024-12-03 19:32 ` [RFC PATCH 02/14] drivers/perf: apple_m1: Support host/guest event filtering Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 03/14] drivers/perf: apple_m1: Map generic branch events Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 04/14] KVM: arm64: Compute PMCEID from arm_pmu's event bitmaps Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 05/14] KVM: arm64: Always allow fixed cycle counter Oliver Upton
2024-12-03 21:32   ` Marc Zyngier
2024-12-03 22:32     ` Oliver Upton
2024-12-04  9:04       ` Marc Zyngier
2024-12-04 21:56         ` Oliver Upton
2024-12-10  9:49           ` Marc Zyngier
2024-12-03 19:32 ` [RFC PATCH 06/14] KVM: arm64: Use PERF_COUNT_HW_CPU_CYCLES for " Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 07/14] KVM: arm64: Use a cpucap to determine if system supports FEAT_PMUv3 Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 08/14] KVM: arm64: Drop kvm_arm_pmu_available static key Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 09/14] KVM: arm64: Use guard() to cleanup usage of arm_pmus_lock Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 10/14] KVM: arm64: Move PMUVer filtering into KVM code Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 11/14] KVM: arm64: Compute synthetic sysreg ESR for Apple PMUv3 traps Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 12/14] KVM: arm64: Advertise PMUv3 if IMPDEF traps are present Oliver Upton
2024-12-03 19:32 ` [RFC PATCH 13/14] KVM: arm64: Advertise 0 event counters for IMPDEF PMU Oliver Upton
2024-12-03 19:34 ` [RFC PATCH 14/14] arm64: Enable IMP DEF PMUv3 traps on Apple M2 Oliver Upton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.