FROMGIT: KVM: arm64: Fix host's ZCR_EL2 restore on nVHE
We re-enter the EL1 host with CPTR_EL2.TZ set in order to be able to lazily restore ZCR_EL2 when required. However, the same CPTR_EL2 configuration also leads to trapping when ZCR_EL2 is accessed from EL2. Duh! Clear CPTR_EL2.TZ *before* writing to ZCR_EL2. Fixes: beed09067b42 ("KVM: arm64: Trap host SVE accesses when the FPSIMD state is dirty") Reported-by: Will Deacon <will@kernel.org> Signed-off-by: Marc Zyngier <maz@kernel.org> (cherry picked from commit 5b08709313718e95ba06ef49aa82f964a605bd9c git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git next) Signed-off-by: Will Deacon <willdeacon@google.com> Bug: 178098380 Test: atest VirtualizationHostTestCases on an EL2-enabled device Change-Id: Iea1c43f91edc32d176e351b80fd860d5f473fa19
This commit is contained in:

committed by
Quentin Perret

parent
b0671cd753
commit
6f00446c76
@@ -242,8 +242,9 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)
|
|||||||
handle_host_smc(host_ctxt);
|
handle_host_smc(host_ctxt);
|
||||||
break;
|
break;
|
||||||
case ESR_ELx_EC_SVE:
|
case ESR_ELx_EC_SVE:
|
||||||
sve_cond_update_zcr_vq(ZCR_ELx_LEN_MASK, SYS_ZCR_EL2);
|
|
||||||
sysreg_clear_set(cptr_el2, CPTR_EL2_TZ, 0);
|
sysreg_clear_set(cptr_el2, CPTR_EL2_TZ, 0);
|
||||||
|
isb();
|
||||||
|
sve_cond_update_zcr_vq(ZCR_ELx_LEN_MASK, SYS_ZCR_EL2);
|
||||||
break;
|
break;
|
||||||
case ESR_ELx_EC_IABT_LOW:
|
case ESR_ELx_EC_IABT_LOW:
|
||||||
fallthrough;
|
fallthrough;
|
||||||
|
Reference in New Issue
Block a user