unsigned long entrylo1,
                                   int flush_dcache_mask);
 extern void kvm_mips_flush_host_tlb(int skip_kseg0);
-extern int kvm_mips_host_tlb_inv(struct kvm_vcpu *vcpu, unsigned long entryhi);
+extern int kvm_mips_host_tlb_inv(struct kvm_vcpu *vcpu, unsigned long entryhi,
+                                bool user, bool kernel);
 
 extern int kvm_mips_guest_tlb_lookup(struct kvm_vcpu *vcpu,
                                     unsigned long entryhi);
 
         * Probe the shadow host TLB for the entry being overwritten, if one
         * matches, invalidate it
         */
-       kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi);
+       kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi, user, true);
 
        /* Invalidate the whole ASID on other CPUs */
        cpu = smp_processor_id();
        struct mips_coproc *cop0 = vcpu->arch.cop0;
        unsigned long entryhi = (vcpu->arch.host_cp0_badvaddr & VPN2_MASK) |
                        (kvm_read_c0_guest_entryhi(cop0) & KVM_ENTRYHI_ASID);
+       bool kernel = KVM_GUEST_KERNEL_MODE(vcpu);
        int index;
 
        /* If address not in the guest TLB, then we are in trouble */
        index = kvm_mips_guest_tlb_lookup(vcpu, entryhi);
        if (index < 0) {
                /* XXXKYMA Invalidate and retry */
-               kvm_mips_host_tlb_inv(vcpu, vcpu->arch.host_cp0_badvaddr);
+               kvm_mips_host_tlb_inv(vcpu, vcpu->arch.host_cp0_badvaddr,
+                                     !kernel, kernel);
                kvm_err("%s: host got TLBMOD for %#lx but entry not present in Guest TLB\n",
                     __func__, entryhi);
                kvm_mips_dump_guest_tlbs(vcpu);
 
 }
 EXPORT_SYMBOL_GPL(kvm_mips_host_tlb_lookup);
 
-int kvm_mips_host_tlb_inv(struct kvm_vcpu *vcpu, unsigned long va)
+static int _kvm_mips_host_tlb_inv(unsigned long entryhi)
 {
        int idx;
-       unsigned long flags, old_entryhi;
-
-       local_irq_save(flags);
-
-       old_entryhi = read_c0_entryhi();
 
-       write_c0_entryhi((va & VPN2_MASK) | kvm_mips_get_user_asid(vcpu));
+       write_c0_entryhi(entryhi);
        mtc0_tlbw_hazard();
 
        tlb_probe();
                tlbw_use_hazard();
        }
 
+       return idx;
+}
+
+int kvm_mips_host_tlb_inv(struct kvm_vcpu *vcpu, unsigned long va,
+                         bool user, bool kernel)
+{
+       int idx_user, idx_kernel;
+       unsigned long flags, old_entryhi;
+
+       local_irq_save(flags);
+
+       old_entryhi = read_c0_entryhi();
+
+       if (user)
+               idx_user = _kvm_mips_host_tlb_inv((va & VPN2_MASK) |
+                                                 kvm_mips_get_user_asid(vcpu));
+       if (kernel)
+               idx_kernel = _kvm_mips_host_tlb_inv((va & VPN2_MASK) |
+                                               kvm_mips_get_kernel_asid(vcpu));
+
        write_c0_entryhi(old_entryhi);
        mtc0_tlbw_hazard();
 
        local_irq_restore(flags);
 
-       if (idx >= 0)
-               kvm_debug("%s: Invalidated entryhi %#lx @ idx %d\n", __func__,
-                         (va & VPN2_MASK) | kvm_mips_get_user_asid(vcpu), idx);
+       if (user && idx_user >= 0)
+               kvm_debug("%s: Invalidated guest user entryhi %#lx @ idx %d\n",
+                         __func__, (va & VPN2_MASK) |
+                                   kvm_mips_get_user_asid(vcpu), idx_user);
+       if (kernel && idx_kernel >= 0)
+               kvm_debug("%s: Invalidated guest kernel entryhi %#lx @ idx %d\n",
+                         __func__, (va & VPN2_MASK) |
+                                   kvm_mips_get_kernel_asid(vcpu), idx_kernel);
 
        return 0;
 }