KVM: arm64: Handle data and instruction external aborts the same way
authorWill Deacon <will@kernel.org>
Wed, 29 Jul 2020 10:28:19 +0000 (11:28 +0100)
committerMarc Zyngier <maz@kernel.org>
Thu, 30 Jul 2020 15:02:37 +0000 (16:02 +0100)
If the guest generates a synchronous external abort which is not handled
by the host, we inject it back into the guest as a virtual SError, but
only if the original fault was reported on the data side. Instruction
faults are reported as "Unsupported FSC", causing the vCPU run loop to
bail with -EFAULT.

Although synchronous external aborts from a guest are pretty unusual,
treat them the same regardless of whether they are taken as data or
instruction aborts by EL2.

Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Quentin Perret <qperret@google.com>
Link: https://lore.kernel.org/r/20200729102821.23392-3-will@kernel.org
arch/arm64/kvm/mmu.c

index 8004f1f689469b047bf451423ec42ed956ff303f..14c6a9df5c9f4cd5cf8d5d7fb7262ce725fde956 100644 (file)
@@ -2079,13 +2079,10 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run)
                 * For RAS the host kernel may handle this abort.
                 * There is no need to pass the error into the guest.
                 */
-               if (!kvm_handle_guest_sea(fault_ipa, kvm_vcpu_get_esr(vcpu)))
-                       return 1;
-
-               if (unlikely(!is_iabt)) {
+               if (kvm_handle_guest_sea(fault_ipa, kvm_vcpu_get_esr(vcpu)))
                        kvm_inject_vabt(vcpu);
-                       return 1;
-               }
+
+               return 1;
        }
 
        trace_kvm_guest_fault(*vcpu_pc(vcpu), kvm_vcpu_get_esr(vcpu),