|
@@ -1642,8 +1642,14 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst,
|
|
|
|
|
|
preempt_disable();
|
|
|
if (KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG0) {
|
|
|
- if (kvm_mips_host_tlb_lookup(vcpu, va) < 0)
|
|
|
- kvm_mips_handle_kseg0_tlb_fault(va, vcpu);
|
|
|
+ if (kvm_mips_host_tlb_lookup(vcpu, va) < 0 &&
|
|
|
+ kvm_mips_handle_kseg0_tlb_fault(va, vcpu)) {
|
|
|
+ kvm_err("%s: handling mapped kseg0 tlb fault for %lx, vcpu: %p, ASID: %#lx\n",
|
|
|
+ __func__, va, vcpu, read_c0_entryhi());
|
|
|
+ er = EMULATE_FAIL;
|
|
|
+ preempt_enable();
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
} else if ((KVM_GUEST_KSEGX(va) < KVM_GUEST_KSEG0) ||
|
|
|
KVM_GUEST_KSEGX(va) == KVM_GUEST_KSEG23) {
|
|
|
int index;
|
|
@@ -1680,12 +1686,18 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst,
|
|
|
run, vcpu);
|
|
|
preempt_enable();
|
|
|
goto dont_update_pc;
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * We fault an entry from the guest tlb to the
|
|
|
- * shadow host TLB
|
|
|
- */
|
|
|
- kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb);
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ * We fault an entry from the guest tlb to the
|
|
|
+ * shadow host TLB
|
|
|
+ */
|
|
|
+ if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb)) {
|
|
|
+ kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n",
|
|
|
+ __func__, va, index, vcpu,
|
|
|
+ read_c0_entryhi());
|
|
|
+ er = EMULATE_FAIL;
|
|
|
+ preempt_enable();
|
|
|
+ goto done;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
@@ -2659,7 +2671,12 @@ enum emulation_result kvm_mips_handle_tlbmiss(u32 cause,
|
|
|
* OK we have a Guest TLB entry, now inject it into the
|
|
|
* shadow host TLB
|
|
|
*/
|
|
|
- kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb);
|
|
|
+ if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb)) {
|
|
|
+ kvm_err("%s: handling mapped seg tlb fault for %lx, index: %u, vcpu: %p, ASID: %#lx\n",
|
|
|
+ __func__, va, index, vcpu,
|
|
|
+ read_c0_entryhi());
|
|
|
+ er = EMULATE_FAIL;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|