[PATCH v3 07/28] KVM: arm64: Don't evaluate HCR_EL2.NV nor HFGITR_EL2.ERET on ERET fast path

Yao Yuan yaoyuan at linux.alibaba.com
Thu Jul 23 23:04:57 PDT 2026


On Wed, Jul 22, 2026 at 08:42:13AM +0800, Marc Zyngier wrote:
> We currently avoid using the ERET fast path if the guest has HCR_EL2.NV
> set. This is an odd check, as NV doesn't mean much if HCR_EL2.TGE==1.
>
> Similarly, evaluating HFGITR_EL2.ERET makes little sense, as
> this only applies to the nested context, while the ERET fast-path
> is purely for the benefit of L1.
>
> Replace these bizarre checks with is_nested_ctxt() which makes a lot
> more sense: if we are running an L2, the ERET trap must go to L1.
>
> Fixes: dd0717a998f77 ("KVM: arm64: nv: Fast-track 'InHost' exception returns")
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> ---
>  arch/arm64/kvm/hyp/vhe/switch.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm64/kvm/hyp/vhe/switch.c b/arch/arm64/kvm/hyp/vhe/switch.c
> index bbe9cebd3d9d5..684cebf23aa0e 100644
> --- a/arch/arm64/kvm/hyp/vhe/switch.c
> +++ b/arch/arm64/kvm/hyp/vhe/switch.c
> @@ -344,13 +344,15 @@ static bool kvm_hyp_handle_eret(struct kvm_vcpu *vcpu, u64 *exit_code)
>  	 * if this is a VHE guest hypervisor returning to its own
>  	 * userspace, or the hypervisor performing a local exception
>  	 * return. No need to save/restore registers, no need to
> -	 * switch S2 MMU. Just do the canonical ERET.
> +	 * switch S2 MMU. Just do the canonical ERET unless we are in
> +	 * nested context.
>  	 *
> -	 * Unless the trap has to be forwarded further down the line,
> -	 * of course...
> +	 * Note that this is made possible because KVM itself never traps
> +	 * ERET when running an L2. The consequence is that any ERET trap is
> +	 * the result of HCR_EL2 or HFGITR_EL2 programming by L1 for its own
> +	 * guest, and the exception must be forwarded to L1.

Yes, right.

Reviewed-by: Yuan Yao <yaoyuan at linux.alibaba.com>

>  	 */
> -	if ((__vcpu_sys_reg(vcpu, HCR_EL2) & HCR_NV) ||
> -	    (__vcpu_sys_reg(vcpu, HFGITR_EL2) & HFGITR_EL2_ERET))
> +	if (is_nested_ctxt(vcpu))
>  		return false;
>
>  	spsr = read_sysreg_el1(SYS_SPSR);
> --
> 2.47.3



More information about the linux-arm-kernel mailing list