Commit 69c9176c authored by Jintack Lim's avatar Jintack Lim Committed by Oliver Upton
Browse files

KVM: arm64: nv: Respect virtual HCR_EL2.TWx setting



Forward exceptions due to WFI or WFE instructions to the virtual EL2 if
they are not coming from the virtual EL2 and virtual HCR_EL2.TWx is set.

Signed-off-by: default avatarJintack Lim <jintack.lim@linaro.org>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20250225172930.1850838-12-maz@kernel.org


Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent 201c8d40
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -275,6 +275,19 @@ static __always_inline u64 kvm_vcpu_get_esr(const struct kvm_vcpu *vcpu)
	return vcpu->arch.fault.esr_el2;
}

static inline bool guest_hyp_wfx_traps_enabled(const struct kvm_vcpu *vcpu)
{
	u64 esr = kvm_vcpu_get_esr(vcpu);
	bool is_wfe = !!(esr & ESR_ELx_WFx_ISS_WFE);
	u64 hcr_el2 = __vcpu_sys_reg(vcpu, HCR_EL2);

	if (!vcpu_has_nv(vcpu) || vcpu_is_el2(vcpu))
		return false;

	return ((is_wfe && (hcr_el2 & HCR_TWE)) ||
		(!is_wfe && (hcr_el2 & HCR_TWI)));
}

static __always_inline int kvm_vcpu_get_condition(const struct kvm_vcpu *vcpu)
{
	u64 esr = kvm_vcpu_get_esr(vcpu);
+5 −1
Original line number Diff line number Diff line
@@ -129,8 +129,12 @@ static int kvm_handle_fpasimd(struct kvm_vcpu *vcpu)
static int kvm_handle_wfx(struct kvm_vcpu *vcpu)
{
	u64 esr = kvm_vcpu_get_esr(vcpu);
	bool is_wfe = !!(esr & ESR_ELx_WFx_ISS_WFE);

	if (esr & ESR_ELx_WFx_ISS_WFE) {
	if (guest_hyp_wfx_traps_enabled(vcpu))
		return kvm_inject_nested_sync(vcpu, kvm_vcpu_get_esr(vcpu));

	if (is_wfe) {
		trace_kvm_wfx_arm64(*vcpu_pc(vcpu), true);
		vcpu->stat.wfe_exit_stat++;
	} else {