Backport patches from upstream to fix the issue I8K8XV of PMU. Signed-off-by: Yuan Zhang <zhangyuan162@huawei.com>
90 lines
3.2 KiB
Diff
90 lines
3.2 KiB
Diff
From 6a416c5efa3ce99f5f0f7e9c603b42b0e047481c Mon Sep 17 00:00:00 2001
|
|
From: Andrew Murray <andrew.murray@arm.com>
|
|
Date: Tue, 28 Nov 2023 15:46:33 +0800
|
|
Subject: [PATCH 2/2] KVM: arm64: limit PMU version to PMUv3 for ARMv8.1
|
|
|
|
mainline inclusion
|
|
from mainline-v5.7-rc1
|
|
commit c854188ea01062f5a5fd7f05658feb1863774eaa
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8K8XV
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c854188ea01062f5a5fd7f05658feb1863774eaa
|
|
|
|
-----------------------------------
|
|
|
|
commit c854188ea01062f5a5fd7f05658feb1863774eaa upstream.
|
|
|
|
We currently expose the PMU version of the host to the guest via
|
|
emulation of the DFR0_EL1 and AA64DFR0_EL1 debug feature registers.
|
|
However many of the features offered beyond PMUv3 for 8.1 are not
|
|
supported in KVM. Examples of this include support for the PMMIR
|
|
registers (added in PMUv3 for ARMv8.4) and 64-bit event counters
|
|
added in (PMUv3 for ARMv8.5).
|
|
|
|
Let's trap the Debug Feature Registers in order to limit
|
|
PMUVer/PerfMon in the Debug Feature Registers to PMUv3 for ARMv8.1
|
|
to avoid unexpected behaviour.
|
|
|
|
Both ID_AA64DFR0.PMUVer and ID_DFR0.PerfMon follow the "Alternative ID
|
|
scheme used for the Performance Monitors Extension version" where 0xF
|
|
means an IMPLEMENTATION DEFINED PMU is implemented, and values 0x0-0xE
|
|
are treated as with an unsigned field (with 0x0 meaning no PMU is
|
|
present). As we don't expect to expose an IMPLEMENTATION DEFINED PMU,
|
|
and our cap is below 0xF, we can treat these fields as unsigned when
|
|
applying the cap.
|
|
|
|
Signed-off-by: Andrew Murray <andrew.murray@arm.com>
|
|
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
|
|
[Mark: make field names consistent, use perfmon cap]
|
|
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
|
|
Signed-off-by: Will Deacon <will@kernel.org>
|
|
Signed-off-by: zhangyuan <zhangyuan162@huawei.com>
|
|
---
|
|
arch/arm64/include/asm/sysreg.h | 6 ++++++
|
|
arch/arm64/kvm/sys_regs.c | 10 ++++++++++
|
|
2 files changed, 16 insertions(+)
|
|
|
|
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
|
|
index de4c31f073bb..041100c28cab 100644
|
|
--- a/arch/arm64/include/asm/sysreg.h
|
|
+++ b/arch/arm64/include/asm/sysreg.h
|
|
@@ -637,6 +637,12 @@
|
|
#define ID_AA64DFR0_TRACEVER_SHIFT 4
|
|
#define ID_AA64DFR0_DEBUGVER_SHIFT 0
|
|
|
|
+#define ID_AA64DFR0_PMUVER_8_1 0x4
|
|
+
|
|
+#define ID_DFR0_PERFMON_SHIFT 24
|
|
+
|
|
+#define ID_DFR0_PERFMON_8_1 0x4
|
|
+
|
|
#define ID_AA64DFR0_PMSVER_8_2 0x1
|
|
#define ID_AA64DFR0_PMSVER_8_3 0x2
|
|
|
|
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
|
|
index 25caa9ec95e4..cc824a208684 100644
|
|
--- a/arch/arm64/kvm/sys_regs.c
|
|
+++ b/arch/arm64/kvm/sys_regs.c
|
|
@@ -1082,6 +1082,16 @@ static u64 read_id_reg(struct kvm_vcpu *vcpu,
|
|
kvm_debug("LORegions unsupported for guests, suppressing\n");
|
|
|
|
val &= ~(0xfUL << ID_AA64MMFR1_LOR_SHIFT);
|
|
+ } else if (id == SYS_ID_AA64DFR0_EL1) {
|
|
+ /* Limit guests to PMUv3 for ARMv8.1 */
|
|
+ val = cpuid_feature_cap_perfmon_field(val,
|
|
+ ID_AA64DFR0_PMUVER_SHIFT,
|
|
+ ID_AA64DFR0_PMUVER_8_1);
|
|
+ } else if (id == SYS_ID_DFR0_EL1) {
|
|
+ /* Limit guests to PMUv3 for ARMv8.1 */
|
|
+ val = cpuid_feature_cap_perfmon_field(val,
|
|
+ ID_DFR0_PERFMON_SHIFT,
|
|
+ ID_DFR0_PERFMON_8_1);
|
|
}
|
|
|
|
return val;
|
|
--
|
|
2.33.0
|
|
|