|
@@ -1454,25 +1454,6 @@ out:
|
|
kvm_set_pfn_accessed(pfn);
|
|
kvm_set_pfn_accessed(pfn);
|
|
}
|
|
}
|
|
|
|
|
|
-static bool is_abort_sea(unsigned long fault_status)
|
|
|
|
-{
|
|
|
|
- switch (fault_status) {
|
|
|
|
- case FSC_SEA:
|
|
|
|
- case FSC_SEA_TTW0:
|
|
|
|
- case FSC_SEA_TTW1:
|
|
|
|
- case FSC_SEA_TTW2:
|
|
|
|
- case FSC_SEA_TTW3:
|
|
|
|
- case FSC_SECC:
|
|
|
|
- case FSC_SECC_TTW0:
|
|
|
|
- case FSC_SECC_TTW1:
|
|
|
|
- case FSC_SECC_TTW2:
|
|
|
|
- case FSC_SECC_TTW3:
|
|
|
|
- return true;
|
|
|
|
- default:
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* kvm_handle_guest_abort - handles all 2nd stage aborts
|
|
* kvm_handle_guest_abort - handles all 2nd stage aborts
|
|
* @vcpu: the VCPU pointer
|
|
* @vcpu: the VCPU pointer
|
|
@@ -1498,20 +1479,21 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|
fault_status = kvm_vcpu_trap_get_fault_type(vcpu);
|
|
fault_status = kvm_vcpu_trap_get_fault_type(vcpu);
|
|
|
|
|
|
fault_ipa = kvm_vcpu_get_fault_ipa(vcpu);
|
|
fault_ipa = kvm_vcpu_get_fault_ipa(vcpu);
|
|
|
|
+ is_iabt = kvm_vcpu_trap_is_iabt(vcpu);
|
|
|
|
|
|
- /*
|
|
|
|
- * The host kernel will handle the synchronous external abort. There
|
|
|
|
- * is no need to pass the error into the guest.
|
|
|
|
- */
|
|
|
|
- if (is_abort_sea(fault_status)) {
|
|
|
|
|
|
+ /* Synchronous External Abort? */
|
|
|
|
+ if (kvm_vcpu_dabt_isextabt(vcpu)) {
|
|
|
|
+ /*
|
|
|
|
+ * For RAS the host kernel may handle this abort.
|
|
|
|
+ * There is no need to pass the error into the guest.
|
|
|
|
+ */
|
|
if (!handle_guest_sea(fault_ipa, kvm_vcpu_get_hsr(vcpu)))
|
|
if (!handle_guest_sea(fault_ipa, kvm_vcpu_get_hsr(vcpu)))
|
|
return 1;
|
|
return 1;
|
|
- }
|
|
|
|
|
|
|
|
- is_iabt = kvm_vcpu_trap_is_iabt(vcpu);
|
|
|
|
- if (unlikely(!is_iabt && kvm_vcpu_dabt_isextabt(vcpu))) {
|
|
|
|
- kvm_inject_vabt(vcpu);
|
|
|
|
- return 1;
|
|
|
|
|
|
+ if (unlikely(!is_iabt)) {
|
|
|
|
+ kvm_inject_vabt(vcpu);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
trace_kvm_guest_fault(*vcpu_pc(vcpu), kvm_vcpu_get_hsr(vcpu),
|
|
trace_kvm_guest_fault(*vcpu_pc(vcpu), kvm_vcpu_get_hsr(vcpu),
|