[PATCH v1] KVM: arm64: Restore POR_EL0 access to host EL0
Joey Gouly
joey.gouly at arm.com
Thu Jun 4 03:54:34 PDT 2026
CPTR_EL2.E0POE was being cleared in __deactivate_cptr_traps_vhe(), which meant
that any accesses to POR_EL0 from host EL0 would trap and be reported to
userspace as an Illegal instruction. This would happen after running any VM,
regardless if it used POE or not.
Signed-off-by: Joey Gouly <joey.gouly at arm.com>
Link: https://sashiko.dev/#/patchset/20260602155430.2088142-1-maz@kernel.org?part=1
---
Tested by (paraphrased):
$ ./read_por_el0
$ ./lkvm run -f kvm-unit-tests/timer.flat
$ ./read_por_el0 # This gets "Illegal instruction"
Also ran the above flow in a nested VM.
arch/arm64/kvm/hyp/include/hyp/switch.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/include/hyp/switch.h
index 320cd45d49c5..e9b36a3b27bb 100644
--- a/arch/arm64/kvm/hyp/include/hyp/switch.h
+++ b/arch/arm64/kvm/hyp/include/hyp/switch.h
@@ -181,6 +181,8 @@ static inline void __deactivate_cptr_traps_vhe(struct kvm_vcpu *vcpu)
val |= CPACR_EL1_ZEN;
if (cpus_have_final_cap(ARM64_SME))
val |= CPACR_EL1_SMEN;
+ if (cpus_have_final_cap(ARM64_HAS_S1POE))
+ val |= CPACR_EL1_E0POE;
write_sysreg(val, cpacr_el1);
}
--
2.25.1
More information about the linux-arm-kernel
mailing list