|
@@ -5217,7 +5217,7 @@ static int make_mmu_pages_available(struct kvm_vcpu *vcpu)
|
|
|
int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code,
|
|
|
void *insn, int insn_len)
|
|
|
{
|
|
|
- int r, emulation_type = EMULTYPE_ALLOW_RETRY;
|
|
|
+ int r, emulation_type = 0;
|
|
|
enum emulation_result er;
|
|
|
bool direct = vcpu->arch.mmu.direct_map;
|
|
|
|
|
@@ -5230,10 +5230,8 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code,
|
|
|
r = RET_PF_INVALID;
|
|
|
if (unlikely(error_code & PFERR_RSVD_MASK)) {
|
|
|
r = handle_mmio_page_fault(vcpu, cr2, direct);
|
|
|
- if (r == RET_PF_EMULATE) {
|
|
|
- emulation_type = 0;
|
|
|
+ if (r == RET_PF_EMULATE)
|
|
|
goto emulate;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
if (r == RET_PF_INVALID) {
|
|
@@ -5260,8 +5258,16 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- if (mmio_info_in_cache(vcpu, cr2, direct))
|
|
|
- emulation_type = 0;
|
|
|
+ /*
|
|
|
+ * vcpu->arch.mmu.page_fault returned RET_PF_EMULATE, but we can still
|
|
|
+ * optimistically try to just unprotect the page and let the processor
|
|
|
+ * re-execute the instruction that caused the page fault. Do not allow
|
|
|
+ * retrying MMIO emulation, as it's not only pointless but could also
|
|
|
+ * cause us to enter an infinite loop because the processor will keep
|
|
|
+ * faulting on the non-existent MMIO address.
|
|
|
+ */
|
|
|
+ if (!mmio_info_in_cache(vcpu, cr2, direct))
|
|
|
+ emulation_type = EMULTYPE_ALLOW_RETRY;
|
|
|
emulate:
|
|
|
/*
|
|
|
* On AMD platforms, under certain conditions insn_len may be zero on #NPF.
|