]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Use the in-context stage-1 in __kvm_find_s1_desc_level()
authorOliver Upton <oliver.upton@linux.dev>
Fri, 26 Sep 2025 22:42:46 +0000 (15:42 -0700)
committerMarc Zyngier <maz@kernel.org>
Mon, 13 Oct 2025 13:17:03 +0000 (14:17 +0100)
Running the external_aborts selftest at EL2 leads to an ugly splat due
to the stage-1 MMU being disabled for the walked context, owing to the
fact that __kvm_find_s1_desc_level() is hardcoded to the EL1&0 regime.

Select the appropriate translation regime for the stage-1 walk based on
the current vCPU context.

Fixes: b8e625167a32 ("KVM: arm64: Add S1 IPA to page table level walker")
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/at.c

index 20bb9af125b173bc02443a0c8c8d4b508b838dc4..e2e06ec8a67b477051bbf609b6b89ef8f7e54d3e 100644 (file)
@@ -1602,13 +1602,17 @@ int __kvm_find_s1_desc_level(struct kvm_vcpu *vcpu, u64 va, u64 ipa, int *level)
                        .fn     = match_s1_desc,
                        .priv   = &dm,
                },
-               .regime = TR_EL10,
                .as_el0 = false,
                .pan    = false,
        };
        struct s1_walk_result wr = {};
        int ret;
 
+       if (is_hyp_ctxt(vcpu))
+               wi.regime = vcpu_el2_e2h_is_set(vcpu) ? TR_EL20 : TR_EL2;
+       else
+               wi.regime = TR_EL10;
+
        ret = setup_s1_walk(vcpu, &wi, &wr, va);
        if (ret)
                return ret;