From: Oliver Upton <oliver.upton@linux.dev>
To: kvmarm@lists.linux.dev
Cc: Marc Zyngier <maz@kernel.org>, Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Mingwei Zhang <mizhang@google.com>,
Colton Lewis <coltonlewis@google.com>,
Raghavendra Rao Ananta <rananta@google.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Janne Grunau <j@jannau.net>,
Oliver Upton <oliver.upton@linux.dev>
Subject: [PATCH v3 09/14] KVM: arm64: Compute synthetic sysreg ESR for Apple PMUv3 traps
Date: Wed, 5 Mar 2025 12:26:36 -0800 [thread overview]
Message-ID: <20250305202641.428114-10-oliver.upton@linux.dev> (raw)
In-Reply-To: <20250305202641.428114-1-oliver.upton@linux.dev>
Apple M* CPUs provide an IMPDEF trap for PMUv3 sysregs, where ESR_EL2.EC
is a reserved value (0x3F) and a sysreg-like ISS is reported in
AFSR1_EL2.
Compute a synthetic ESR for these PMUv3 traps, giving the illusion of
something architectural to the rest of KVM.
Tested-by: Janne Grunau <j@jannau.net>
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
---
arch/arm64/kvm/hyp/vhe/switch.c | 22 ++++++++++++++++++++++
arch/arm64/tools/cpucaps | 1 +
2 files changed, 23 insertions(+)
diff --git a/arch/arm64/kvm/hyp/vhe/switch.c b/arch/arm64/kvm/hyp/vhe/switch.c
index 647737d6e8d0..731a0378ed13 100644
--- a/arch/arm64/kvm/hyp/vhe/switch.c
+++ b/arch/arm64/kvm/hyp/vhe/switch.c
@@ -527,6 +527,25 @@ static bool kvm_hyp_handle_sysreg_vhe(struct kvm_vcpu *vcpu, u64 *exit_code)
return kvm_hyp_handle_sysreg(vcpu, exit_code);
}
+static bool kvm_hyp_handle_impdef(struct kvm_vcpu *vcpu, u64 *exit_code)
+{
+ u64 iss;
+
+ if (!cpus_have_final_cap(ARM64_WORKAROUND_PMUV3_IMPDEF_TRAPS))
+ return false;
+
+ /*
+ * Compute a synthetic ESR for a sysreg trap. Conveniently, AFSR1_EL2
+ * is populated with a correct ISS for a sysreg trap. These fruity
+ * parts are 64bit only, so unconditionally set IL.
+ */
+ iss = ESR_ELx_ISS(read_sysreg_s(SYS_AFSR1_EL2));
+ vcpu->arch.fault.esr_el2 = FIELD_PREP(ESR_ELx_EC_MASK, ESR_ELx_EC_SYS64) |
+ FIELD_PREP(ESR_ELx_ISS_MASK, iss) |
+ ESR_ELx_IL;
+ return false;
+}
+
static const exit_handler_fn hyp_exit_handlers[] = {
[0 ... ESR_ELx_EC_MAX] = NULL,
[ESR_ELx_EC_CP15_32] = kvm_hyp_handle_cp15_32,
@@ -538,6 +557,9 @@ static const exit_handler_fn hyp_exit_handlers[] = {
[ESR_ELx_EC_WATCHPT_LOW] = kvm_hyp_handle_watchpt_low,
[ESR_ELx_EC_ERET] = kvm_hyp_handle_eret,
[ESR_ELx_EC_MOPS] = kvm_hyp_handle_mops,
+
+ /* Apple shenanigans */
+ [0x3F] = kvm_hyp_handle_impdef,
};
static inline bool fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code)
diff --git a/arch/arm64/tools/cpucaps b/arch/arm64/tools/cpucaps
index ee4316cb3690..772c1b008e43 100644
--- a/arch/arm64/tools/cpucaps
+++ b/arch/arm64/tools/cpucaps
@@ -105,6 +105,7 @@ WORKAROUND_CAVIUM_TX2_219_TVM
WORKAROUND_CLEAN_CACHE
WORKAROUND_DEVICE_LOAD_ACQUIRE
WORKAROUND_NVIDIA_CARMEL_CNP
+WORKAROUND_PMUV3_IMPDEF_TRAPS
WORKAROUND_QCOM_FALKOR_E1003
WORKAROUND_QCOM_ORYON_CNTVOFF
WORKAROUND_REPEAT_TLBI
--
2.39.5
next prev parent reply other threads:[~2025-03-05 20:27 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-05 20:26 [PATCH v3 00/14] KVM: arm64: FEAT_PMUv3 on Apple hardware Oliver Upton
2025-03-05 20:26 ` [PATCH v3 01/14] drivers/perf: apple_m1: Refactor event select/filter configuration Oliver Upton
2025-03-05 20:26 ` [PATCH v3 02/14] drivers/perf: apple_m1: Support host/guest event filtering Oliver Upton
2025-03-05 20:26 ` [PATCH v3 03/14] KVM: arm64: Compute PMCEID from arm_pmu's event bitmaps Oliver Upton
2025-03-05 20:26 ` [PATCH v3 04/14] KVM: arm64: Always support SW_INCR PMU event Oliver Upton
2025-03-05 20:26 ` [PATCH v3 05/14] KVM: arm64: Use a cpucap to determine if system supports FEAT_PMUv3 Oliver Upton
2025-03-06 20:49 ` kernel test robot
2025-03-05 20:26 ` [PATCH v3 06/14] KVM: arm64: Drop kvm_arm_pmu_available static key Oliver Upton
2025-03-05 20:26 ` [PATCH v3 07/14] KVM: arm64: Use guard() to cleanup usage of arm_pmus_lock Oliver Upton
2025-03-05 20:26 ` [PATCH v3 08/14] KVM: arm64: Move PMUVer filtering into KVM code Oliver Upton
2025-03-05 20:26 ` Oliver Upton [this message]
2025-03-05 20:26 ` [PATCH v3 10/14] KVM: arm64: Advertise PMUv3 if IMPDEF traps are present Oliver Upton
2025-03-05 20:26 ` [PATCH v3 11/14] KVM: arm64: Remap PMUv3 events onto hardware Oliver Upton
2025-03-05 20:26 ` [PATCH v3 12/14] drivers/perf: apple_m1: Provide helper for mapping PMUv3 events Oliver Upton
2025-03-05 20:30 ` [PATCH v3 13/14] KVM: arm64: Provide 1 event counter on IMPDEF hardware Oliver Upton
2025-03-05 20:30 ` [PATCH v3 14/14] arm64: Enable IMP DEF PMUv3 traps on Apple M* Oliver Upton
2025-03-10 13:13 ` [PATCH v3 00/14] KVM: arm64: FEAT_PMUv3 on Apple hardware Marc Zyngier
2025-03-11 23:44 ` Oliver Upton
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=20250305202641.428114-10-oliver.upton@linux.dev \
--to=oliver.upton@linux.dev \
--cc=catalin.marinas@arm.com \
--cc=coltonlewis@google.com \
--cc=j@jannau.net \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=mizhang@google.com \
--cc=rananta@google.com \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.com \
/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 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.