Skip to content

Commit 493da2b

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: nv: Handle CPACR_EL1 traps
Handle CPACR_EL1 accesses when running a VHE guest. In order to limit the cost of the emulation, implement it ass a shallow exit. In the other cases: - this is a nVHE L1 which will write to memory, and we don't trap - this is a L2 guest: * the L1 has CPTR_EL2.TCPAC==0, and the L2 has direct register access * the L1 has CPTR_EL2.TCPAC==1, and the L2 will trap, but the handling is defered to the general handling for forwarding Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 1785f02 commit 493da2b

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

arch/arm64/kvm/hyp/vhe/switch.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,40 @@ static void kvm_hyp_save_fpsimd_host(struct kvm_vcpu *vcpu)
266266
__fpsimd_save_state(*host_data_ptr(fpsimd_state));
267267
}
268268

269+
static bool kvm_hyp_handle_cpacr_el1(struct kvm_vcpu *vcpu, u64 *exit_code)
270+
{
271+
u64 esr = kvm_vcpu_get_esr(vcpu);
272+
int rt;
273+
274+
if (!is_hyp_ctxt(vcpu) || esr_sys64_to_sysreg(esr) != SYS_CPACR_EL1)
275+
return false;
276+
277+
rt = kvm_vcpu_sys_get_rt(vcpu);
278+
279+
if ((esr & ESR_ELx_SYS64_ISS_DIR_MASK) == ESR_ELx_SYS64_ISS_DIR_READ) {
280+
vcpu_set_reg(vcpu, rt, __vcpu_sys_reg(vcpu, CPTR_EL2));
281+
} else {
282+
vcpu_write_sys_reg(vcpu, vcpu_get_reg(vcpu, rt), CPTR_EL2);
283+
__activate_cptr_traps(vcpu);
284+
}
285+
286+
__kvm_skip_instr(vcpu);
287+
288+
return true;
289+
}
290+
291+
static bool kvm_hyp_handle_sysreg_vhe(struct kvm_vcpu *vcpu, u64 *exit_code)
292+
{
293+
if (kvm_hyp_handle_cpacr_el1(vcpu, exit_code))
294+
return true;
295+
296+
return kvm_hyp_handle_sysreg(vcpu, exit_code);
297+
}
298+
269299
static const exit_handler_fn hyp_exit_handlers[] = {
270300
[0 ... ESR_ELx_EC_MAX] = NULL,
271301
[ESR_ELx_EC_CP15_32] = kvm_hyp_handle_cp15_32,
272-
[ESR_ELx_EC_SYS64] = kvm_hyp_handle_sysreg,
302+
[ESR_ELx_EC_SYS64] = kvm_hyp_handle_sysreg_vhe,
273303
[ESR_ELx_EC_SVE] = kvm_hyp_handle_fpsimd,
274304
[ESR_ELx_EC_FP_ASIMD] = kvm_hyp_handle_fpsimd,
275305
[ESR_ELx_EC_IABT_LOW] = kvm_hyp_handle_iabt_low,

0 commit comments

Comments
 (0)