blob: d3000680df1ff0316d265545896d80d485fa8063 [file] [log] [blame]
Sanjay Lal858dd5d2012-11-21 18:34:05 -08001/*
Deng-Cheng Zhud116e812014-06-26 12:11:34 -07002 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * KVM/MIPS TLB handling, this file is part of the Linux host kernel so that
7 * TLB handlers run from KSEG0
8 *
9 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
10 * Authors: Sanjay Lal <sanjayl@kymasys.com>
11 */
Sanjay Lal858dd5d2012-11-21 18:34:05 -080012
Sanjay Lal858dd5d2012-11-21 18:34:05 -080013#include <linux/sched.h>
14#include <linux/smp.h>
15#include <linux/mm.h>
16#include <linux/delay.h>
James Hogan403015b2016-06-09 14:19:10 +010017#include <linux/export.h>
Sanjay Lal858dd5d2012-11-21 18:34:05 -080018#include <linux/kvm_host.h>
Sanjay Lal6d17c0d2013-05-18 06:54:24 -070019#include <linux/srcu.h>
20
Sanjay Lal858dd5d2012-11-21 18:34:05 -080021#include <asm/cpu.h>
22#include <asm/bootinfo.h>
23#include <asm/mmu_context.h>
24#include <asm/pgtable.h>
25#include <asm/cacheflush.h>
James Hogane36059e2014-01-17 12:01:30 +000026#include <asm/tlb.h>
Sanjay Lal858dd5d2012-11-21 18:34:05 -080027
28#undef CONFIG_MIPS_MT
29#include <asm/r4kcache.h>
30#define CONFIG_MIPS_MT
31
32#define KVM_GUEST_PC_TLB 0
33#define KVM_GUEST_SP_TLB 1
34
Sanjay Lal858dd5d2012-11-21 18:34:05 -080035atomic_t kvm_mips_instance;
James Hogancb1b4472015-12-16 23:49:30 +000036EXPORT_SYMBOL_GPL(kvm_mips_instance);
Sanjay Lal858dd5d2012-11-21 18:34:05 -080037
James Hogan403015b2016-06-09 14:19:10 +010038static u32 kvm_mips_get_kernel_asid(struct kvm_vcpu *vcpu)
Sanjay Lal858dd5d2012-11-21 18:34:05 -080039{
Paul Burton4edf00a2016-05-06 14:36:23 +010040 int cpu = smp_processor_id();
41
42 return vcpu->arch.guest_kernel_asid[cpu] &
43 cpu_asid_mask(&cpu_data[cpu]);
Sanjay Lal858dd5d2012-11-21 18:34:05 -080044}
45
James Hogan403015b2016-06-09 14:19:10 +010046static u32 kvm_mips_get_user_asid(struct kvm_vcpu *vcpu)
Sanjay Lal858dd5d2012-11-21 18:34:05 -080047{
Paul Burton4edf00a2016-05-06 14:36:23 +010048 int cpu = smp_processor_id();
49
50 return vcpu->arch.guest_user_asid[cpu] &
51 cpu_asid_mask(&cpu_data[cpu]);
Sanjay Lal858dd5d2012-11-21 18:34:05 -080052}
53
James Hoganbdb7ed82016-06-09 14:19:07 +010054inline u32 kvm_mips_get_commpage_asid(struct kvm_vcpu *vcpu)
Sanjay Lal858dd5d2012-11-21 18:34:05 -080055{
56 return vcpu->kvm->arch.commpage_tlb;
57}
58
Deng-Cheng Zhud116e812014-06-26 12:11:34 -070059/* Structure defining an tlb entry data set. */
Sanjay Lal858dd5d2012-11-21 18:34:05 -080060
61void kvm_mips_dump_host_tlbs(void)
62{
63 unsigned long old_entryhi;
64 unsigned long old_pagemask;
65 struct kvm_mips_tlb tlb;
66 unsigned long flags;
67 int i;
68
69 local_irq_save(flags);
70
71 old_entryhi = read_c0_entryhi();
72 old_pagemask = read_c0_pagemask();
73
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -070074 kvm_info("HOST TLBs:\n");
Paul Burton4edf00a2016-05-06 14:36:23 +010075 kvm_info("ASID: %#lx\n", read_c0_entryhi() &
76 cpu_asid_mask(&current_cpu_data));
Sanjay Lal858dd5d2012-11-21 18:34:05 -080077
78 for (i = 0; i < current_cpu_data.tlbsize; i++) {
79 write_c0_index(i);
80 mtc0_tlbw_hazard();
81
82 tlb_read();
83 tlbw_use_hazard();
84
85 tlb.tlb_hi = read_c0_entryhi();
86 tlb.tlb_lo0 = read_c0_entrylo0();
87 tlb.tlb_lo1 = read_c0_entrylo1();
88 tlb.tlb_mask = read_c0_pagemask();
89
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -070090 kvm_info("TLB%c%3d Hi 0x%08lx ",
91 (tlb.tlb_lo0 | tlb.tlb_lo1) & MIPS3_PG_V ? ' ' : '*',
92 i, tlb.tlb_hi);
James Hogan8cffd192016-06-09 14:19:08 +010093 kvm_info("Lo0=0x%09llx %c%c attr %lx ",
94 (u64) mips3_tlbpfn_to_paddr(tlb.tlb_lo0),
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -070095 (tlb.tlb_lo0 & MIPS3_PG_D) ? 'D' : ' ',
96 (tlb.tlb_lo0 & MIPS3_PG_G) ? 'G' : ' ',
97 (tlb.tlb_lo0 >> 3) & 7);
James Hogan8cffd192016-06-09 14:19:08 +010098 kvm_info("Lo1=0x%09llx %c%c attr %lx sz=%lx\n",
99 (u64) mips3_tlbpfn_to_paddr(tlb.tlb_lo1),
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -0700100 (tlb.tlb_lo1 & MIPS3_PG_D) ? 'D' : ' ',
101 (tlb.tlb_lo1 & MIPS3_PG_G) ? 'G' : ' ',
102 (tlb.tlb_lo1 >> 3) & 7, tlb.tlb_mask);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800103 }
104 write_c0_entryhi(old_entryhi);
105 write_c0_pagemask(old_pagemask);
106 mtc0_tlbw_hazard();
107 local_irq_restore(flags);
108}
James Hogancb1b4472015-12-16 23:49:30 +0000109EXPORT_SYMBOL_GPL(kvm_mips_dump_host_tlbs);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800110
111void kvm_mips_dump_guest_tlbs(struct kvm_vcpu *vcpu)
112{
113 struct mips_coproc *cop0 = vcpu->arch.cop0;
114 struct kvm_mips_tlb tlb;
115 int i;
116
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -0700117 kvm_info("Guest TLBs:\n");
118 kvm_info("Guest EntryHi: %#lx\n", kvm_read_c0_guest_entryhi(cop0));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800119
120 for (i = 0; i < KVM_MIPS_GUEST_TLB_SIZE; i++) {
121 tlb = vcpu->arch.guest_tlb[i];
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -0700122 kvm_info("TLB%c%3d Hi 0x%08lx ",
123 (tlb.tlb_lo0 | tlb.tlb_lo1) & MIPS3_PG_V ? ' ' : '*',
124 i, tlb.tlb_hi);
James Hogan8cffd192016-06-09 14:19:08 +0100125 kvm_info("Lo0=0x%09llx %c%c attr %lx ",
126 (u64) mips3_tlbpfn_to_paddr(tlb.tlb_lo0),
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -0700127 (tlb.tlb_lo0 & MIPS3_PG_D) ? 'D' : ' ',
128 (tlb.tlb_lo0 & MIPS3_PG_G) ? 'G' : ' ',
129 (tlb.tlb_lo0 >> 3) & 7);
James Hogan8cffd192016-06-09 14:19:08 +0100130 kvm_info("Lo1=0x%09llx %c%c attr %lx sz=%lx\n",
131 (u64) mips3_tlbpfn_to_paddr(tlb.tlb_lo1),
Deng-Cheng Zhu6ad78a52014-06-26 12:11:35 -0700132 (tlb.tlb_lo1 & MIPS3_PG_D) ? 'D' : ' ',
133 (tlb.tlb_lo1 & MIPS3_PG_G) ? 'G' : ' ',
134 (tlb.tlb_lo1 >> 3) & 7, tlb.tlb_mask);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800135 }
136}
James Hogancb1b4472015-12-16 23:49:30 +0000137EXPORT_SYMBOL_GPL(kvm_mips_dump_guest_tlbs);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800138
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800139/* XXXKYMA: Must be called with interrupts disabled */
140/* set flush_dcache_mask == 0 if no dcache flush required */
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700141int kvm_mips_host_tlb_write(struct kvm_vcpu *vcpu, unsigned long entryhi,
142 unsigned long entrylo0, unsigned long entrylo1,
143 int flush_dcache_mask)
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800144{
145 unsigned long flags;
146 unsigned long old_entryhi;
Deng-Cheng Zhub045c402014-06-26 12:11:37 -0700147 int idx;
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800148
149 local_irq_save(flags);
150
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800151 old_entryhi = read_c0_entryhi();
152 write_c0_entryhi(entryhi);
153 mtc0_tlbw_hazard();
154
155 tlb_probe();
156 tlb_probe_hazard();
157 idx = read_c0_index();
158
159 if (idx > current_cpu_data.tlbsize) {
160 kvm_err("%s: Invalid Index: %d\n", __func__, idx);
161 kvm_mips_dump_host_tlbs();
Tapasweni Pathakcfec0e72015-02-22 21:48:21 +0530162 local_irq_restore(flags);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800163 return -1;
164 }
165
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800166 write_c0_entrylo0(entrylo0);
167 write_c0_entrylo1(entrylo1);
168 mtc0_tlbw_hazard();
169
James Hoganb5dfc6c2014-05-29 10:16:26 +0100170 if (idx < 0)
171 tlb_write_random();
172 else
173 tlb_write_indexed();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800174 tlbw_use_hazard();
175
James Hogan3d654832014-05-29 10:16:41 +0100176 kvm_debug("@ %#lx idx: %2d [entryhi(R): %#lx] entrylo0(R): 0x%08lx, entrylo1(R): 0x%08lx\n",
177 vcpu->arch.pc, idx, read_c0_entryhi(),
178 read_c0_entrylo0(), read_c0_entrylo1());
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800179
180 /* Flush D-cache */
181 if (flush_dcache_mask) {
182 if (entrylo0 & MIPS3_PG_V) {
183 ++vcpu->stat.flush_dcache_exits;
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700184 flush_data_cache_page((entryhi & VPN2_MASK) &
185 ~flush_dcache_mask);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800186 }
187 if (entrylo1 & MIPS3_PG_V) {
188 ++vcpu->stat.flush_dcache_exits;
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700189 flush_data_cache_page(((entryhi & VPN2_MASK) &
190 ~flush_dcache_mask) |
191 (0x1 << PAGE_SHIFT));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800192 }
193 }
194
195 /* Restore old ASID */
196 write_c0_entryhi(old_entryhi);
197 mtc0_tlbw_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800198 local_irq_restore(flags);
199 return 0;
200}
James Hogan403015b2016-06-09 14:19:10 +0100201EXPORT_SYMBOL_GPL(kvm_mips_host_tlb_write);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800202
203int kvm_mips_handle_commpage_tlb_fault(unsigned long badvaddr,
204 struct kvm_vcpu *vcpu)
205{
Dan Williamsba049e92016-01-15 16:56:11 -0800206 kvm_pfn_t pfn0, pfn1;
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800207 unsigned long flags, old_entryhi = 0, vaddr = 0;
208 unsigned long entrylo0 = 0, entrylo1 = 0;
209
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800210 pfn0 = CPHYSADDR(vcpu->arch.kseg0_commpage) >> PAGE_SHIFT;
211 pfn1 = 0;
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700212 entrylo0 = mips3_paddr_to_tlbpfn(pfn0 << PAGE_SHIFT) | (0x3 << 3) |
213 (1 << 2) | (0x1 << 1);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800214 entrylo1 = 0;
215
216 local_irq_save(flags);
217
218 old_entryhi = read_c0_entryhi();
219 vaddr = badvaddr & (PAGE_MASK << 1);
220 write_c0_entryhi(vaddr | kvm_mips_get_kernel_asid(vcpu));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800221 write_c0_entrylo0(entrylo0);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800222 write_c0_entrylo1(entrylo1);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800223 write_c0_index(kvm_mips_get_commpage_asid(vcpu));
224 mtc0_tlbw_hazard();
225 tlb_write_indexed();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800226 tlbw_use_hazard();
227
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700228 kvm_debug("@ %#lx idx: %2d [entryhi(R): %#lx] entrylo0 (R): 0x%08lx, entrylo1(R): 0x%08lx\n",
229 vcpu->arch.pc, read_c0_index(), read_c0_entryhi(),
230 read_c0_entrylo0(), read_c0_entrylo1());
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800231
232 /* Restore old ASID */
233 write_c0_entryhi(old_entryhi);
234 mtc0_tlbw_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800235 local_irq_restore(flags);
236
237 return 0;
238}
James Hogancb1b4472015-12-16 23:49:30 +0000239EXPORT_SYMBOL_GPL(kvm_mips_handle_commpage_tlb_fault);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800240
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800241int kvm_mips_guest_tlb_lookup(struct kvm_vcpu *vcpu, unsigned long entryhi)
242{
243 int i;
244 int index = -1;
245 struct kvm_mips_tlb *tlb = vcpu->arch.guest_tlb;
246
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800247 for (i = 0; i < KVM_MIPS_GUEST_TLB_SIZE; i++) {
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700248 if (TLB_HI_VPN2_HIT(tlb[i], entryhi) &&
249 TLB_HI_ASID_HIT(tlb[i], entryhi)) {
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800250 index = i;
251 break;
252 }
253 }
254
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800255 kvm_debug("%s: entryhi: %#lx, index: %d lo0: %#lx, lo1: %#lx\n",
256 __func__, entryhi, index, tlb[i].tlb_lo0, tlb[i].tlb_lo1);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800257
258 return index;
259}
James Hogancb1b4472015-12-16 23:49:30 +0000260EXPORT_SYMBOL_GPL(kvm_mips_guest_tlb_lookup);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800261
262int kvm_mips_host_tlb_lookup(struct kvm_vcpu *vcpu, unsigned long vaddr)
263{
264 unsigned long old_entryhi, flags;
Deng-Cheng Zhub045c402014-06-26 12:11:37 -0700265 int idx;
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800266
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800267 local_irq_save(flags);
268
269 old_entryhi = read_c0_entryhi();
270
271 if (KVM_GUEST_KERNEL_MODE(vcpu))
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700272 write_c0_entryhi((vaddr & VPN2_MASK) |
273 kvm_mips_get_kernel_asid(vcpu));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800274 else {
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700275 write_c0_entryhi((vaddr & VPN2_MASK) |
276 kvm_mips_get_user_asid(vcpu));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800277 }
278
279 mtc0_tlbw_hazard();
280
281 tlb_probe();
282 tlb_probe_hazard();
283 idx = read_c0_index();
284
285 /* Restore old ASID */
286 write_c0_entryhi(old_entryhi);
287 mtc0_tlbw_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800288
289 local_irq_restore(flags);
290
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800291 kvm_debug("Host TLB lookup, %#lx, idx: %2d\n", vaddr, idx);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800292
293 return idx;
294}
James Hogancb1b4472015-12-16 23:49:30 +0000295EXPORT_SYMBOL_GPL(kvm_mips_host_tlb_lookup);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800296
297int kvm_mips_host_tlb_inv(struct kvm_vcpu *vcpu, unsigned long va)
298{
299 int idx;
300 unsigned long flags, old_entryhi;
301
302 local_irq_save(flags);
303
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800304 old_entryhi = read_c0_entryhi();
305
306 write_c0_entryhi((va & VPN2_MASK) | kvm_mips_get_user_asid(vcpu));
307 mtc0_tlbw_hazard();
308
309 tlb_probe();
310 tlb_probe_hazard();
311 idx = read_c0_index();
312
313 if (idx >= current_cpu_data.tlbsize)
314 BUG();
315
316 if (idx > 0) {
317 write_c0_entryhi(UNIQUE_ENTRYHI(idx));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800318 write_c0_entrylo0(0);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800319 write_c0_entrylo1(0);
320 mtc0_tlbw_hazard();
321
322 tlb_write_indexed();
James Hogan138f7ad2016-06-09 14:19:15 +0100323 tlbw_use_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800324 }
325
326 write_c0_entryhi(old_entryhi);
327 mtc0_tlbw_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800328
329 local_irq_restore(flags);
330
James Hogan3d654832014-05-29 10:16:41 +0100331 if (idx > 0)
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800332 kvm_debug("%s: Invalidated entryhi %#lx @ idx %d\n", __func__,
James Hogan3d654832014-05-29 10:16:41 +0100333 (va & VPN2_MASK) | kvm_mips_get_user_asid(vcpu), idx);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800334
335 return 0;
336}
James Hogancb1b4472015-12-16 23:49:30 +0000337EXPORT_SYMBOL_GPL(kvm_mips_host_tlb_inv);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800338
339void kvm_mips_flush_host_tlb(int skip_kseg0)
340{
341 unsigned long flags;
342 unsigned long old_entryhi, entryhi;
343 unsigned long old_pagemask;
344 int entry = 0;
345 int maxentry = current_cpu_data.tlbsize;
346
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800347 local_irq_save(flags);
348
349 old_entryhi = read_c0_entryhi();
350 old_pagemask = read_c0_pagemask();
351
352 /* Blast 'em all away. */
353 for (entry = 0; entry < maxentry; entry++) {
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800354 write_c0_index(entry);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800355
356 if (skip_kseg0) {
James Hogan138f7ad2016-06-09 14:19:15 +0100357 mtc0_tlbr_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800358 tlb_read();
James Hogan138f7ad2016-06-09 14:19:15 +0100359 tlb_read_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800360
361 entryhi = read_c0_entryhi();
362
363 /* Don't blow away guest kernel entries */
Deng-Cheng Zhud116e812014-06-26 12:11:34 -0700364 if (KVM_GUEST_KSEGX(entryhi) == KVM_GUEST_KSEG0)
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800365 continue;
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800366 }
367
368 /* Make sure all entries differ. */
369 write_c0_entryhi(UNIQUE_ENTRYHI(entry));
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800370 write_c0_entrylo0(0);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800371 write_c0_entrylo1(0);
372 mtc0_tlbw_hazard();
373
374 tlb_write_indexed();
James Hogan138f7ad2016-06-09 14:19:15 +0100375 tlbw_use_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800376 }
377
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800378 write_c0_entryhi(old_entryhi);
379 write_c0_pagemask(old_pagemask);
380 mtc0_tlbw_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800381
382 local_irq_restore(flags);
383}
James Hogancb1b4472015-12-16 23:49:30 +0000384EXPORT_SYMBOL_GPL(kvm_mips_flush_host_tlb);
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800385
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800386void kvm_local_flush_tlb_all(void)
387{
388 unsigned long flags;
389 unsigned long old_ctx;
390 int entry = 0;
391
392 local_irq_save(flags);
393 /* Save old context and create impossible VPN2 value */
394 old_ctx = read_c0_entryhi();
395 write_c0_entrylo0(0);
396 write_c0_entrylo1(0);
397
398 /* Blast 'em all away. */
399 while (entry < current_cpu_data.tlbsize) {
400 /* Make sure all entries differ. */
401 write_c0_entryhi(UNIQUE_ENTRYHI(entry));
402 write_c0_index(entry);
403 mtc0_tlbw_hazard();
404 tlb_write_indexed();
James Hogan138f7ad2016-06-09 14:19:15 +0100405 tlbw_use_hazard();
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800406 entry++;
407 }
Sanjay Lal858dd5d2012-11-21 18:34:05 -0800408 write_c0_entryhi(old_ctx);
409 mtc0_tlbw_hazard();
410
411 local_irq_restore(flags);
412}
James Hogancb1b4472015-12-16 23:49:30 +0000413EXPORT_SYMBOL_GPL(kvm_local_flush_tlb_all);