Skip to content

Commit 1fcbc13

Browse files
asahilinajannau
authored andcommitted
fixup! KVM: arm64: Expose TSO capability to guests and context switch
1 parent f7850ca commit 1fcbc13

File tree

4 files changed

+45
-8
lines changed

4 files changed

+45
-8
lines changed

arch/arm64/include/asm/kvm_emulate.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
8080
{
8181
if (!vcpu_has_run_once(vcpu))
8282
vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS;
83-
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) &&
84-
alternative_has_cap_unlikely(ARM64_HAS_TSO_APPLE))
83+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) && (
84+
alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT) ||
85+
alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE)
86+
))
8587
vcpu->arch.hcr_el2 &= ~HCR_TACR;
8688

8789
/*

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 = SCOPE_LOCAL_CPU | ARM64_CPUCAP_PERMITTED_FOR_LATE_CPU,
103+
.matches = has_apple_actlr_virt_impdef,
104+
},
105+
{
106+
.desc = "ACTLR virtualization (architectural?)",
107+
.capability = ARM64_HAS_ACTLR_VIRT,
108+
.type = SCOPE_LOCAL_CPU | ARM64_CPUCAP_PERMITTED_FOR_LATE_CPU,
109+
.matches = has_apple_actlr_virt,
110+
},
85111
{},
86112
};
87113

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

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

1919
#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)
2021

2122
static inline void __sysreg_save_common_state(struct kvm_cpu_context *ctxt)
2223
{
@@ -103,9 +104,12 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
103104
ctxt_sys_reg(ctxt, SP_EL1) = read_sysreg(sp_el1);
104105
ctxt_sys_reg(ctxt, ELR_EL1) = read_sysreg_el1(SYS_ELR);
105106
ctxt_sys_reg(ctxt, SPSR_EL1) = read_sysreg_el1(SYS_SPSR);
106-
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) &&
107-
alternative_has_cap_unlikely(ARM64_HAS_TSO_APPLE))
108-
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_IMP_APL_ACTLR_EL12);
107+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
108+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
109+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_ACTLR_EL12);
110+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
111+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_IMP_APL_ACTLR_EL12);
112+
}
109113
}
110114

111115
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
@@ -176,9 +180,12 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt)
176180
write_sysreg(ctxt_sys_reg(ctxt, PAR_EL1), par_el1);
177181
write_sysreg(ctxt_sys_reg(ctxt, TPIDR_EL1), tpidr_el1);
178182

179-
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) &&
180-
alternative_has_cap_unlikely(ARM64_HAS_TSO_APPLE))
181-
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_IMP_APL_ACTLR_EL12);
183+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
184+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
185+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_ACTLR_EL12);
186+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
187+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_IMP_APL_ACTLR_EL12);
188+
}
182189

183190
if (ctxt_has_mte(ctxt)) {
184191
write_sysreg_el1(ctxt_sys_reg(ctxt, TFSR_EL1), SYS_TFSR);

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)