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>
This commit is contained in:
Родитель
9befad23ed
Коммит
021df20635
|
@ -87,7 +87,6 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
|
||||||
kvm_pfn_t pfn0, pfn1;
|
kvm_pfn_t pfn0, pfn1;
|
||||||
unsigned long vaddr = 0;
|
unsigned long vaddr = 0;
|
||||||
unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
|
unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
|
||||||
int even;
|
|
||||||
struct kvm *kvm = vcpu->kvm;
|
struct kvm *kvm = vcpu->kvm;
|
||||||
const int flush_dcache_mask = 0;
|
const int flush_dcache_mask = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -105,7 +104,6 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
|
||||||
kvm_mips_dump_host_tlbs();
|
kvm_mips_dump_host_tlbs();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
even = !(gfn & 0x1);
|
|
||||||
vaddr = badvaddr & (PAGE_MASK << 1);
|
vaddr = badvaddr & (PAGE_MASK << 1);
|
||||||
|
|
||||||
if (kvm_mips_map_page(vcpu->kvm, gfn) < 0)
|
if (kvm_mips_map_page(vcpu->kvm, gfn) < 0)
|
||||||
|
@ -114,13 +112,8 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
|
||||||
if (kvm_mips_map_page(vcpu->kvm, gfn ^ 0x1) < 0)
|
if (kvm_mips_map_page(vcpu->kvm, gfn ^ 0x1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (even) {
|
pfn0 = kvm->arch.guest_pmap[gfn & ~0x1];
|
||||||
pfn0 = kvm->arch.guest_pmap[gfn];
|
pfn1 = kvm->arch.guest_pmap[gfn | 0x1];
|
||||||
pfn1 = kvm->arch.guest_pmap[gfn ^ 0x1];
|
|
||||||
} else {
|
|
||||||
pfn0 = kvm->arch.guest_pmap[gfn ^ 0x1];
|
|
||||||
pfn1 = kvm->arch.guest_pmap[gfn];
|
|
||||||
}
|
|
||||||
|
|
||||||
entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) |
|
entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) |
|
||||||
(1 << 2) | (0x1 << 1);
|
(1 << 2) | (0x1 << 1);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче