aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kvm
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2016-06-09 09:19:12 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2016-06-14 05:02:43 -0400
commit021df206354cf1e1d341b66dee19ac250c9dc37d (patch)
treef40cfb8ba29f0de187e9eced7ad255506067fd3b /arch/mips/kvm
parent9befad23ed3e2e178741cb84ac09c0ff45610537 (diff)
MIPS: KVM: Simplify even/odd TLB handling
When handling TLB faults in the guest KSeg0 region, a pair of physical addresses are read from the guest physical address map. However that process is rather convoluted with an if/then/else statement. Simplify it to just clear the lowest bit for the even entry and set the lowest bit for the odd entry. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Radim Krčmář <rkrcmar@redhat.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: linux-mips@linux-mips.org Cc: kvm@vger.kernel.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/mips/kvm')
-rw-r--r--arch/mips/kvm/mmu.c11
1 files changed, 2 insertions, 9 deletions
diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c
index d5ada83ec55c..9924c1d253a7 100644
--- a/arch/mips/kvm/mmu.c
+++ b/arch/mips/kvm/mmu.c
@@ -87,7 +87,6 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
87 kvm_pfn_t pfn0, pfn1; 87 kvm_pfn_t pfn0, pfn1;
88 unsigned long vaddr = 0; 88 unsigned long vaddr = 0;
89 unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; 89 unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
90 int even;
91 struct kvm *kvm = vcpu->kvm; 90 struct kvm *kvm = vcpu->kvm;
92 const int flush_dcache_mask = 0; 91 const int flush_dcache_mask = 0;
93 int ret; 92 int ret;
@@ -105,7 +104,6 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
105 kvm_mips_dump_host_tlbs(); 104 kvm_mips_dump_host_tlbs();
106 return -1; 105 return -1;
107 } 106 }
108 even = !(gfn & 0x1);
109 vaddr = badvaddr & (PAGE_MASK << 1); 107 vaddr = badvaddr & (PAGE_MASK << 1);
110 108
111 if (kvm_mips_map_page(vcpu->kvm, gfn) < 0) 109 if (kvm_mips_map_page(vcpu->kvm, gfn) < 0)
@@ -114,13 +112,8 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
114 if (kvm_mips_map_page(vcpu->kvm, gfn ^ 0x1) < 0) 112 if (kvm_mips_map_page(vcpu->kvm, gfn ^ 0x1) < 0)
115 return -1; 113 return -1;
116 114
117 if (even) { 115 pfn0 = kvm->arch.guest_pmap[gfn & ~0x1];
118 pfn0 = kvm->arch.guest_pmap[gfn]; 116 pfn1 = kvm->arch.guest_pmap[gfn | 0x1];
119 pfn1 = kvm->arch.guest_pmap[gfn ^ 0x1];
120 } else {
121 pfn0 = kvm->arch.guest_pmap[gfn ^ 0x1];
122 pfn1 = kvm->arch.guest_pmap[gfn];
123 }
124 117
125 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) | 118 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) |
126 (1 << 2) | (0x1 << 1); 119 (1 << 2) | (0x1 << 1);