aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kvm
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2016-06-15 14:29:58 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2016-06-15 17:58:37 -0400
commit7414d2f65006ac8609196092f2869e0942599b72 (patch)
treeded5f615069c23c970bd05563cd690330e37eee9 /arch/mips/kvm
parent42aa12e74e91f790d239bfb852260d07573ce83f (diff)
MIPS: KVM: Use host CCA for TLB mappings
KVM TLB mappings for the guest were being created with a cache coherency attribute (CCA) of 3, which is cached incoherent. Create them instead with the default host CCA, which should be the correct one for coherency on SMP systems. 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.c18
-rw-r--r--arch/mips/kvm/tlb.c3
2 files changed, 12 insertions, 9 deletions
diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c
index 2f494ec5c939..ecead748de04 100644
--- a/arch/mips/kvm/mmu.c
+++ b/arch/mips/kvm/mmu.c
@@ -116,9 +116,11 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
116 pfn1 = kvm->arch.guest_pmap[gfn | 0x1]; 116 pfn1 = kvm->arch.guest_pmap[gfn | 0x1];
117 117
118 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | 118 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) |
119 (0x3 << ENTRYLO_C_SHIFT) | ENTRYLO_D | ENTRYLO_V; 119 ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
120 ENTRYLO_D | ENTRYLO_V;
120 entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | 121 entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) |
121 (0x3 << ENTRYLO_C_SHIFT) | ENTRYLO_D | ENTRYLO_V; 122 ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
123 ENTRYLO_D | ENTRYLO_V;
122 124
123 preempt_disable(); 125 preempt_disable();
124 entryhi = (vaddr | kvm_mips_get_kernel_asid(vcpu)); 126 entryhi = (vaddr | kvm_mips_get_kernel_asid(vcpu));
@@ -157,13 +159,13 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu,
157 159
158 /* Get attributes from the Guest TLB */ 160 /* Get attributes from the Guest TLB */
159 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | 161 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) |
160 (0x3 << ENTRYLO_C_SHIFT) | 162 ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
161 (tlb->tlb_lo[0] & ENTRYLO_D) | 163 (tlb->tlb_lo[0] & ENTRYLO_D) |
162 (tlb->tlb_lo[0] & ENTRYLO_V); 164 (tlb->tlb_lo[0] & ENTRYLO_V);
163 entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) | 165 entrylo1 = mips3_paddr_to_tlbpfn(pfn1 << PAGE_SHIFT) |
164 (0x3 << ENTRYLO_C_SHIFT) | 166 ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
165 (tlb->tlb_lo[1] & ENTRYLO_D) | 167 (tlb->tlb_lo[1] & ENTRYLO_D) |
166 (tlb->tlb_lo[1] & ENTRYLO_V); 168 (tlb->tlb_lo[1] & ENTRYLO_V);
167 169
168 kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc, 170 kvm_debug("@ %#lx tlb_lo0: 0x%08lx tlb_lo1: 0x%08lx\n", vcpu->arch.pc,
169 tlb->tlb_lo[0], tlb->tlb_lo[1]); 171 tlb->tlb_lo[0], tlb->tlb_lo[1]);
diff --git a/arch/mips/kvm/tlb.c b/arch/mips/kvm/tlb.c
index 385fbd34e77d..9699352293e4 100644
--- a/arch/mips/kvm/tlb.c
+++ b/arch/mips/kvm/tlb.c
@@ -179,7 +179,8 @@ int kvm_mips_handle_commpage_tlb_fault(unsigned long badvaddr,
179 pfn = CPHYSADDR(vcpu->arch.kseg0_commpage) >> PAGE_SHIFT; 179 pfn = CPHYSADDR(vcpu->arch.kseg0_commpage) >> PAGE_SHIFT;
180 pair_idx = (badvaddr >> PAGE_SHIFT) & 1; 180 pair_idx = (badvaddr >> PAGE_SHIFT) & 1;
181 entrylo[pair_idx] = mips3_paddr_to_tlbpfn(pfn << PAGE_SHIFT) | 181 entrylo[pair_idx] = mips3_paddr_to_tlbpfn(pfn << PAGE_SHIFT) |
182 (0x3 << ENTRYLO_C_SHIFT) | ENTRYLO_D | ENTRYLO_V; 182 ((_page_cachable_default >> _CACHE_SHIFT) << ENTRYLO_C_SHIFT) |
183 ENTRYLO_D | ENTRYLO_V;
183 184
184 local_irq_save(flags); 185 local_irq_save(flags);
185 186