Skip to content

Commit 9c5b7b5

Browse files
hoshinolinajannau
authored andcommitted
KVM: arm64: Expose TSO capability to guests and context switch
Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent e362041 commit 9c5b7b5

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

arch/arm64/include/asm/kvm_emulate.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
103103
{
104104
if (!vcpu_has_run_once(vcpu))
105105
vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS;
106+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) && (
107+
alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT) ||
108+
alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE)
109+
))
110+
vcpu->arch.hcr_el2 &= ~HCR_TACR;
106111

107112
/*
108113
* For non-FWB CPUs, we trap VM ops (HCR_EL2.TVM) until M+C

arch/arm64/kernel/cpufeature_impdef.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ static bool has_tso_fixed(const struct arm64_cpu_capabilities *entry, int scope)
6262
}
6363
#endif
6464

65+
static bool has_apple_actlr_virt_impdef(const struct arm64_cpu_capabilities *entry, int scope)
66+
{
67+
u64 midr = read_cpuid_id() & MIDR_CPU_MODEL_MASK;
68+
69+
return midr >= MIDR_APPLE_M1_ICESTORM && midr <= MIDR_APPLE_M1_FIRESTORM_MAX;
70+
}
71+
72+
static bool has_apple_actlr_virt(const struct arm64_cpu_capabilities *entry, int scope)
73+
{
74+
u64 midr = read_cpuid_id() & MIDR_CPU_MODEL_MASK;
75+
76+
return midr >= MIDR_APPLE_M2_BLIZZARD && midr <= MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, 0xfff);
77+
}
78+
6579
static const struct arm64_cpu_capabilities arm64_impdef_features[] = {
6680
#ifdef CONFIG_ARM64_MEMORY_MODEL_CONTROL
6781
{
@@ -82,6 +96,18 @@ static const struct arm64_cpu_capabilities arm64_impdef_features[] = {
8296
.matches = has_tso_fixed,
8397
},
8498
#endif
99+
{
100+
.desc = "ACTLR virtualization (IMPDEF, Apple)",
101+
.capability = ARM64_HAS_ACTLR_VIRT_APPLE,
102+
.type = ARM64_CPUCAP_EARLY_LOCAL_CPU_FEATURE,
103+
.matches = has_apple_actlr_virt_impdef,
104+
},
105+
{
106+
.desc = "ACTLR virtualization (architectural?)",
107+
.capability = ARM64_HAS_ACTLR_VIRT,
108+
.type = ARM64_CPUCAP_EARLY_LOCAL_CPU_FEATURE,
109+
.matches = has_apple_actlr_virt,
110+
},
85111
{},
86112
};
87113

arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
#include <asm/kvm_hyp.h>
1717
#include <asm/kvm_mmu.h>
1818

19+
#define SYS_IMP_APL_ACTLR_EL12 sys_reg(3, 6, 15, 14, 6)
20+
#define SYS_ACTLR_EL12 sys_reg(3, 5, 1, 0, 1)
21+
1922
static inline bool ctxt_has_s1poe(struct kvm_cpu_context *ctxt);
2023

2124
static inline struct kvm_vcpu *ctxt_to_vcpu(struct kvm_cpu_context *ctxt)
@@ -172,6 +175,13 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
172175

173176
if (ctxt_has_sctlr2(ctxt))
174177
ctxt_sys_reg(ctxt, SCTLR2_EL1) = read_sysreg_el1(SYS_SCTLR2);
178+
179+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
180+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
181+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_ACTLR_EL12);
182+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
183+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_IMP_APL_ACTLR_EL12);
184+
}
175185
}
176186

177187
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
@@ -256,6 +266,13 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt,
256266
write_sysreg(ctxt_sys_reg(ctxt, PAR_EL1), par_el1);
257267
write_sysreg(ctxt_sys_reg(ctxt, TPIDR_EL1), tpidr_el1);
258268

269+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
270+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
271+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_ACTLR_EL12);
272+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
273+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_IMP_APL_ACTLR_EL12);
274+
}
275+
259276
if (ctxt_has_mte(ctxt)) {
260277
write_sysreg_el1(ctxt_sys_reg(ctxt, TFSR_EL1), SYS_TFSR);
261278
write_sysreg_s(ctxt_sys_reg(ctxt, TFSRE0_EL1), SYS_TFSRE0_EL1);

arch/arm64/tools/cpucaps

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ BTI
88
# Unreliable: use system_supports_32bit_el0() instead.
99
HAS_32BIT_EL0_DO_NOT_USE
1010
HAS_32BIT_EL1
11+
HAS_ACTLR_VIRT
12+
HAS_ACTLR_VIRT_APPLE
1113
HAS_ADDRESS_AUTH
1214
HAS_ADDRESS_AUTH_ARCH_QARMA3
1315
HAS_ADDRESS_AUTH_ARCH_QARMA5

0 commit comments

Comments
 (0)