|
@@ -1430,6 +1430,22 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Check for a cache maintenance operation. Since we
|
|
|
+ * ended-up here, we know it is outside of any memory
|
|
|
+ * slot. But we can't find out if that is for a device,
|
|
|
+ * or if the guest is just being stupid. The only thing
|
|
|
+ * we know for sure is that this range cannot be cached.
|
|
|
+ *
|
|
|
+ * So let's assume that the guest is just being
|
|
|
+ * cautious, and skip the instruction.
|
|
|
+ */
|
|
|
+ if (kvm_vcpu_dabt_is_cm(vcpu)) {
|
|
|
+ kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
|
|
+ ret = 1;
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* The IPA is reported as [MAX:12], so we need to
|
|
|
* complement it with the bottom 12 bits from the
|