Skip to content

Commit 02dd33e

Browse files
committed
KVM: arm64: Context switch SCTLR2_ELx when advertised to the guest
Restore SCTLR2_EL1 with the correct value for the given context when FEAT_SCTLR2 is advertised to the guest. Reviewed-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 81fbef1 commit 02dd33e

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,17 @@ static inline bool ctxt_has_ras(struct kvm_cpu_context *ctxt)
120120
return kvm_has_ras(kern_hyp_va(vcpu->kvm));
121121
}
122122

123+
static inline bool ctxt_has_sctlr2(struct kvm_cpu_context *ctxt)
124+
{
125+
struct kvm_vcpu *vcpu;
126+
127+
if (!cpus_have_final_cap(ARM64_HAS_SCTLR2))
128+
return false;
129+
130+
vcpu = ctxt_to_vcpu(ctxt);
131+
return kvm_has_sctlr2(kern_hyp_va(vcpu->kvm));
132+
}
133+
123134
static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
124135
{
125136
ctxt_sys_reg(ctxt, SCTLR_EL1) = read_sysreg_el1(SYS_SCTLR);
@@ -158,6 +169,9 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
158169
ctxt_sys_reg(ctxt, SP_EL1) = read_sysreg(sp_el1);
159170
ctxt_sys_reg(ctxt, ELR_EL1) = read_sysreg_el1(SYS_ELR);
160171
ctxt_sys_reg(ctxt, SPSR_EL1) = read_sysreg_el1(SYS_SPSR);
172+
173+
if (ctxt_has_sctlr2(ctxt))
174+
ctxt_sys_reg(ctxt, SCTLR2_EL1) = read_sysreg_el1(SYS_SCTLR2);
161175
}
162176

163177
static inline void __sysreg_save_el2_return_state(struct kvm_cpu_context *ctxt)
@@ -268,6 +282,9 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt,
268282
write_sysreg(ctxt_sys_reg(ctxt, SP_EL1), sp_el1);
269283
write_sysreg_el1(ctxt_sys_reg(ctxt, ELR_EL1), SYS_ELR);
270284
write_sysreg_el1(ctxt_sys_reg(ctxt, SPSR_EL1), SYS_SPSR);
285+
286+
if (ctxt_has_sctlr2(ctxt))
287+
write_sysreg_el1(ctxt_sys_reg(ctxt, SCTLR2_EL1), SYS_SCTLR2);
271288
}
272289

273290
/* Read the VCPU state's PSTATE, but translate (v)EL2 to EL1. */

arch/arm64/kvm/hyp/vhe/sysreg-sr.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ static void __sysreg_save_vel2_state(struct kvm_vcpu *vcpu)
7777
__vcpu_assign_sys_reg(vcpu, SP_EL2, read_sysreg(sp_el1));
7878
__vcpu_assign_sys_reg(vcpu, ELR_EL2, read_sysreg_el1(SYS_ELR));
7979
__vcpu_assign_sys_reg(vcpu, SPSR_EL2, read_sysreg_el1(SYS_SPSR));
80+
81+
if (ctxt_has_sctlr2(&vcpu->arch.ctxt))
82+
__vcpu_assign_sys_reg(vcpu, SCTLR2_EL2, read_sysreg_el1(SYS_SCTLR2));
8083
}
8184

8285
static void __sysreg_restore_vel2_state(struct kvm_vcpu *vcpu)
@@ -139,6 +142,9 @@ static void __sysreg_restore_vel2_state(struct kvm_vcpu *vcpu)
139142
write_sysreg(__vcpu_sys_reg(vcpu, SP_EL2), sp_el1);
140143
write_sysreg_el1(__vcpu_sys_reg(vcpu, ELR_EL2), SYS_ELR);
141144
write_sysreg_el1(__vcpu_sys_reg(vcpu, SPSR_EL2), SYS_SPSR);
145+
146+
if (ctxt_has_sctlr2(&vcpu->arch.ctxt))
147+
write_sysreg_el1(__vcpu_sys_reg(vcpu, SCTLR2_EL2), SYS_SCTLR2);
142148
}
143149

144150
/*

0 commit comments

Comments
 (0)