Skip to content

Commit d8f44f1

Browse files
hoshinolinajannau
authored andcommitted
fixup! KVM: arm64: Expose TSO capability to guests and context switch
1 parent 738e811 commit d8f44f1

4 files changed

Lines changed: 45 additions & 8 deletions

File tree

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 bool ctxt_has_s1poe(struct kvm_cpu_context *ctxt);
2223

@@ -123,9 +124,12 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
123124
ctxt_sys_reg(ctxt, SP_EL1) = read_sysreg(sp_el1);
124125
ctxt_sys_reg(ctxt, ELR_EL1) = read_sysreg_el1(SYS_ELR);
125126
ctxt_sys_reg(ctxt, SPSR_EL1) = read_sysreg_el1(SYS_SPSR);
126-
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) &&
127-
alternative_has_cap_unlikely(ARM64_HAS_TSO_APPLE))
128-
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_IMP_APL_ACTLR_EL12);
127+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
128+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
129+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_ACTLR_EL12);
130+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
131+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_IMP_APL_ACTLR_EL12);
132+
}
129133
}
130134

131135
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
@@ -203,9 +207,12 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt)
203207
write_sysreg(ctxt_sys_reg(ctxt, PAR_EL1), par_el1);
204208
write_sysreg(ctxt_sys_reg(ctxt, TPIDR_EL1), tpidr_el1);
205209

206-
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE) &&
207-
alternative_has_cap_unlikely(ARM64_HAS_TSO_APPLE))
208-
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_IMP_APL_ACTLR_EL12);
210+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
211+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
212+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_ACTLR_EL12);
213+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
214+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_IMP_APL_ACTLR_EL12);
215+
}
209216

210217
if (ctxt_has_mte(ctxt)) {
211218
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)