Skip to content

Commit f78a46d

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 c2de2bb commit f78a46d

2 files changed

Lines changed: 12 additions & 0 deletions

File tree

arch/arm64/include/asm/kvm_emulate.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ 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))
85+
vcpu->arch.hcr_el2 &= ~HCR_TACR;
8386

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

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
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+
1921
static inline void __sysreg_save_common_state(struct kvm_cpu_context *ctxt)
2022
{
2123
ctxt_sys_reg(ctxt, MDSCR_EL1) = read_sysreg(mdscr_el1);
@@ -101,6 +103,9 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
101103
ctxt_sys_reg(ctxt, SP_EL1) = read_sysreg(sp_el1);
102104
ctxt_sys_reg(ctxt, ELR_EL1) = read_sysreg_el1(SYS_ELR);
103105
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);
104109
}
105110

106111
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
@@ -171,6 +176,10 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt)
171176
write_sysreg(ctxt_sys_reg(ctxt, PAR_EL1), par_el1);
172177
write_sysreg(ctxt_sys_reg(ctxt, TPIDR_EL1), tpidr_el1);
173178

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);
182+
174183
if (ctxt_has_mte(ctxt)) {
175184
write_sysreg_el1(ctxt_sys_reg(ctxt, TFSR_EL1), SYS_TFSR);
176185
write_sysreg_s(ctxt_sys_reg(ctxt, TFSRE0_EL1), SYS_TFSRE0_EL1);

0 commit comments

Comments
 (0)