diff options
author | James Hogan <james.hogan@imgtec.com> | 2016-06-09 09:19:12 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2016-06-14 05:02:43 -0400 |
commit | 021df206354cf1e1d341b66dee19ac250c9dc37d (patch) | |
tree | f40cfb8ba29f0de187e9eced7ad255506067fd3b /arch/mips/kvm | |
parent | 9befad23ed3e2e178741cb84ac09c0ff45610537 (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.c | 11 |
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); |