Skip to content

Commit 6c26482

Browse files
hoshinolinajannau
authored andcommitted
KVM: arm64: Expose TSO capability to guests and context switch
Signed-off-by: Asahi Lina <[email protected]>
1 parent b34abfb commit 6c26482

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

arch/arm64/include/asm/kvm_emulate.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ 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_ACTLR_VIRT) ||
85+
alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE)
86+
))
87+
vcpu->arch.hcr_el2 &= ~HCR_TACR;
8388

8489
/*
8590
* 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 = 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: 16 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)
@@ -147,6 +150,12 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
147150
ctxt_sys_reg(ctxt, SP_EL1) = read_sysreg(sp_el1);
148151
ctxt_sys_reg(ctxt, ELR_EL1) = read_sysreg_el1(SYS_ELR);
149152
ctxt_sys_reg(ctxt, SPSR_EL1) = read_sysreg_el1(SYS_SPSR);
153+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
154+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
155+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_ACTLR_EL12);
156+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
157+
ctxt_sys_reg(ctxt, ACTLR_EL1) = read_sysreg_s(SYS_IMP_APL_ACTLR_EL12);
158+
}
150159
}
151160

152161
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
@@ -226,6 +235,13 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt,
226235
write_sysreg(ctxt_sys_reg(ctxt, PAR_EL1), par_el1);
227236
write_sysreg(ctxt_sys_reg(ctxt, TPIDR_EL1), tpidr_el1);
228237

238+
if (IS_ENABLED(CONFIG_ARM64_ACTLR_STATE)) {
239+
if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT))
240+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_ACTLR_EL12);
241+
else if (alternative_has_cap_unlikely(ARM64_HAS_ACTLR_VIRT_APPLE))
242+
write_sysreg_s(ctxt_sys_reg(ctxt, ACTLR_EL1), SYS_IMP_APL_ACTLR_EL12);
243+
}
244+
229245
if (ctxt_has_mte(ctxt)) {
230246
write_sysreg_el1(ctxt_sys_reg(ctxt, TFSR_EL1), SYS_TFSR);
231247
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)