]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: nv: Inject SEA TTW when desc update can't write to GPA
authorOliver Upton <oupton@kernel.org>
Tue, 2 Jun 2026 23:54:48 +0000 (16:54 -0700)
committerMarc Zyngier <maz@kernel.org>
Wed, 3 Jun 2026 20:06:43 +0000 (21:06 +0100)
Similar to the handling of descriptor reads, inject an SEA during TTW
when the descriptor access fails for reasons other than a race, such as
a read-only memslot or a bad HVA.

Fixes: bff8aa213dee ("KVM: arm64: Implement HW access flag management in stage-1 SW PTW")
Fixes: e4c7dfac2f1a ("KVM: arm64: nv: Implement HW access flag management in stage-2 SW PTW")
Signed-off-by: Oliver Upton <oupton@kernel.org>
Link: https://patch.msgid.link/20260602235450.103057-4-oupton@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/at.c
arch/arm64/kvm/nested.c

index 9f8f0ae8e86e84c3e36f6b77d6b06f7bd3a8d2b6..119a603e636e8190b0a528c8d4056cec030b2fbd 100644 (file)
@@ -521,8 +521,12 @@ static int walk_s1(struct kvm_vcpu *vcpu, struct s1_walk_info *wi,
                }
 
                ret = kvm_swap_s1_desc(vcpu, ipa, desc, new_desc, wi);
-               if (ret)
+               if (ret == -EAGAIN)
                        return ret;
+               if (ret) {
+                       fail_s1_walk(wr, ESR_ELx_FSC_SEA_TTW(level), false);
+                       return ret;
+               }
 
                desc = new_desc;
        }
index d0545144eaac6eb4b1d6a6843b38151596e588d8..f8d3f3a723282cc65511e8ca883cf9698d261943 100644 (file)
@@ -352,8 +352,13 @@ static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa,
 
        if (new_desc != desc) {
                ret = swap_guest_s2_desc(vcpu, paddr, desc, new_desc, wi);
-               if (ret)
+               if (ret == -EAGAIN)
                        return ret;
+               if (ret) {
+                       out->esr = ESR_ELx_FSC_SEA_TTW(level);
+                       out->desc = desc;
+                       return 1;
+               }
 
                desc = new_desc;
        }