|
@@ -704,6 +704,7 @@ static int kvm_trap_emul_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|
|
{
|
|
|
struct mm_struct *kern_mm = &vcpu->arch.guest_kernel_mm;
|
|
|
struct mm_struct *user_mm = &vcpu->arch.guest_user_mm;
|
|
|
+ struct mm_struct *mm;
|
|
|
|
|
|
/* Allocate new kernel and user ASIDs if needed */
|
|
|
|
|
@@ -733,10 +734,9 @@ static int kvm_trap_emul_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
|
|
* on the mode of the Guest (Kernel/User)
|
|
|
*/
|
|
|
if (current->flags & PF_VCPU) {
|
|
|
- if (KVM_GUEST_KERNEL_MODE(vcpu))
|
|
|
- write_c0_entryhi(cpu_asid(cpu, kern_mm));
|
|
|
- else
|
|
|
- write_c0_entryhi(cpu_asid(cpu, user_mm));
|
|
|
+ mm = KVM_GUEST_KERNEL_MODE(vcpu) ? kern_mm : user_mm;
|
|
|
+ write_c0_entryhi(cpu_asid(cpu, mm));
|
|
|
+ TLBMISS_HANDLER_SETUP_PGD(mm->pgd);
|
|
|
kvm_mips_suspend_mm(cpu);
|
|
|
ehb();
|
|
|
}
|
|
@@ -757,6 +757,7 @@ static int kvm_trap_emul_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
|
|
|
get_new_mmu_context(current->mm, cpu);
|
|
|
}
|
|
|
write_c0_entryhi(cpu_asid(cpu, current->mm));
|
|
|
+ TLBMISS_HANDLER_SETUP_PGD(current->mm->pgd);
|
|
|
kvm_mips_resume_mm(cpu);
|
|
|
ehb();
|
|
|
}
|
|
@@ -821,6 +822,7 @@ static int kvm_trap_emul_vcpu_run(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
|
|
asid_version_mask(cpu)))
|
|
|
get_new_mmu_context(current->mm, cpu);
|
|
|
write_c0_entryhi(cpu_asid(cpu, current->mm));
|
|
|
+ TLBMISS_HANDLER_SETUP_PGD(current->mm->pgd);
|
|
|
kvm_mips_resume_mm(cpu);
|
|
|
|
|
|
htw_start();
|