aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/mm/tlb-r4k.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/mm/tlb-r4k.c')
-rw-r--r--arch/mips/mm/tlb-r4k.c54
1 files changed, 16 insertions, 38 deletions
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
index eeaf50f5df2b..403fa804e4f4 100644
--- a/arch/mips/mm/tlb-r4k.c
+++ b/arch/mips/mm/tlb-r4k.c
@@ -25,28 +25,6 @@
25 25
26extern void build_tlb_refill_handler(void); 26extern void build_tlb_refill_handler(void);
27 27
28/* Atomicity and interruptability */
29#ifdef CONFIG_MIPS_MT_SMTC
30
31#include <asm/smtc.h>
32#include <asm/mipsmtregs.h>
33
34#define ENTER_CRITICAL(flags) \
35 { \
36 unsigned int mvpflags; \
37 local_irq_save(flags);\
38 mvpflags = dvpe()
39#define EXIT_CRITICAL(flags) \
40 evpe(mvpflags); \
41 local_irq_restore(flags); \
42 }
43#else
44
45#define ENTER_CRITICAL(flags) local_irq_save(flags)
46#define EXIT_CRITICAL(flags) local_irq_restore(flags)
47
48#endif /* CONFIG_MIPS_MT_SMTC */
49
50/* 28/*
51 * LOONGSON2/3 has a 4 entry itlb which is a subset of dtlb, 29 * LOONGSON2/3 has a 4 entry itlb which is a subset of dtlb,
52 * unfortunately, itlb is not totally transparent to software. 30 * unfortunately, itlb is not totally transparent to software.
@@ -75,7 +53,7 @@ void local_flush_tlb_all(void)
75 unsigned long old_ctx; 53 unsigned long old_ctx;
76 int entry, ftlbhighset; 54 int entry, ftlbhighset;
77 55
78 ENTER_CRITICAL(flags); 56 local_irq_save(flags);
79 /* Save old context and create impossible VPN2 value */ 57 /* Save old context and create impossible VPN2 value */
80 old_ctx = read_c0_entryhi(); 58 old_ctx = read_c0_entryhi();
81 write_c0_entrylo0(0); 59 write_c0_entrylo0(0);
@@ -112,7 +90,7 @@ void local_flush_tlb_all(void)
112 tlbw_use_hazard(); 90 tlbw_use_hazard();
113 write_c0_entryhi(old_ctx); 91 write_c0_entryhi(old_ctx);
114 flush_itlb(); 92 flush_itlb();
115 EXIT_CRITICAL(flags); 93 local_irq_restore(flags);
116} 94}
117EXPORT_SYMBOL(local_flush_tlb_all); 95EXPORT_SYMBOL(local_flush_tlb_all);
118 96
@@ -142,7 +120,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
142 if (cpu_context(cpu, mm) != 0) { 120 if (cpu_context(cpu, mm) != 0) {
143 unsigned long size, flags; 121 unsigned long size, flags;
144 122
145 ENTER_CRITICAL(flags); 123 local_irq_save(flags);
146 start = round_down(start, PAGE_SIZE << 1); 124 start = round_down(start, PAGE_SIZE << 1);
147 end = round_up(end, PAGE_SIZE << 1); 125 end = round_up(end, PAGE_SIZE << 1);
148 size = (end - start) >> (PAGE_SHIFT + 1); 126 size = (end - start) >> (PAGE_SHIFT + 1);
@@ -176,7 +154,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
176 drop_mmu_context(mm, cpu); 154 drop_mmu_context(mm, cpu);
177 } 155 }
178 flush_itlb(); 156 flush_itlb();
179 EXIT_CRITICAL(flags); 157 local_irq_restore(flags);
180 } 158 }
181} 159}
182 160
@@ -184,7 +162,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
184{ 162{
185 unsigned long size, flags; 163 unsigned long size, flags;
186 164
187 ENTER_CRITICAL(flags); 165 local_irq_save(flags);
188 size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; 166 size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
189 size = (size + 1) >> 1; 167 size = (size + 1) >> 1;
190 if (size <= (current_cpu_data.tlbsizeftlbsets ? 168 if (size <= (current_cpu_data.tlbsizeftlbsets ?
@@ -220,7 +198,7 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
220 local_flush_tlb_all(); 198 local_flush_tlb_all();
221 } 199 }
222 flush_itlb(); 200 flush_itlb();
223 EXIT_CRITICAL(flags); 201 local_irq_restore(flags);
224} 202}
225 203
226void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) 204void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
@@ -233,7 +211,7 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
233 211
234 newpid = cpu_asid(cpu, vma->vm_mm); 212 newpid = cpu_asid(cpu, vma->vm_mm);
235 page &= (PAGE_MASK << 1); 213 page &= (PAGE_MASK << 1);
236 ENTER_CRITICAL(flags); 214 local_irq_save(flags);
237 oldpid = read_c0_entryhi(); 215 oldpid = read_c0_entryhi();
238 write_c0_entryhi(page | newpid); 216 write_c0_entryhi(page | newpid);
239 mtc0_tlbw_hazard(); 217 mtc0_tlbw_hazard();
@@ -253,7 +231,7 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
253 finish: 231 finish:
254 write_c0_entryhi(oldpid); 232 write_c0_entryhi(oldpid);
255 flush_itlb_vm(vma); 233 flush_itlb_vm(vma);
256 EXIT_CRITICAL(flags); 234 local_irq_restore(flags);
257 } 235 }
258} 236}
259 237
@@ -266,7 +244,7 @@ void local_flush_tlb_one(unsigned long page)
266 unsigned long flags; 244 unsigned long flags;
267 int oldpid, idx; 245 int oldpid, idx;
268 246
269 ENTER_CRITICAL(flags); 247 local_irq_save(flags);
270 oldpid = read_c0_entryhi(); 248 oldpid = read_c0_entryhi();
271 page &= (PAGE_MASK << 1); 249 page &= (PAGE_MASK << 1);
272 write_c0_entryhi(page); 250 write_c0_entryhi(page);
@@ -285,7 +263,7 @@ void local_flush_tlb_one(unsigned long page)
285 } 263 }
286 write_c0_entryhi(oldpid); 264 write_c0_entryhi(oldpid);
287 flush_itlb(); 265 flush_itlb();
288 EXIT_CRITICAL(flags); 266 local_irq_restore(flags);
289} 267}
290 268
291/* 269/*
@@ -308,7 +286,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
308 if (current->active_mm != vma->vm_mm) 286 if (current->active_mm != vma->vm_mm)
309 return; 287 return;
310 288
311 ENTER_CRITICAL(flags); 289 local_irq_save(flags);
312 290
313 pid = read_c0_entryhi() & ASID_MASK; 291 pid = read_c0_entryhi() & ASID_MASK;
314 address &= (PAGE_MASK << 1); 292 address &= (PAGE_MASK << 1);
@@ -358,7 +336,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
358 } 336 }
359 tlbw_use_hazard(); 337 tlbw_use_hazard();
360 flush_itlb_vm(vma); 338 flush_itlb_vm(vma);
361 EXIT_CRITICAL(flags); 339 local_irq_restore(flags);
362} 340}
363 341
364void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, 342void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
@@ -369,7 +347,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
369 unsigned long old_pagemask; 347 unsigned long old_pagemask;
370 unsigned long old_ctx; 348 unsigned long old_ctx;
371 349
372 ENTER_CRITICAL(flags); 350 local_irq_save(flags);
373 /* Save old context and create impossible VPN2 value */ 351 /* Save old context and create impossible VPN2 value */
374 old_ctx = read_c0_entryhi(); 352 old_ctx = read_c0_entryhi();
375 old_pagemask = read_c0_pagemask(); 353 old_pagemask = read_c0_pagemask();
@@ -389,7 +367,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
389 tlbw_use_hazard(); /* What is the hazard here? */ 367 tlbw_use_hazard(); /* What is the hazard here? */
390 write_c0_pagemask(old_pagemask); 368 write_c0_pagemask(old_pagemask);
391 local_flush_tlb_all(); 369 local_flush_tlb_all();
392 EXIT_CRITICAL(flags); 370 local_irq_restore(flags);
393} 371}
394 372
395#ifdef CONFIG_TRANSPARENT_HUGEPAGE 373#ifdef CONFIG_TRANSPARENT_HUGEPAGE
@@ -399,13 +377,13 @@ int __init has_transparent_hugepage(void)
399 unsigned int mask; 377 unsigned int mask;
400 unsigned long flags; 378 unsigned long flags;
401 379
402 ENTER_CRITICAL(flags); 380 local_irq_save(flags);
403 write_c0_pagemask(PM_HUGE_MASK); 381 write_c0_pagemask(PM_HUGE_MASK);
404 back_to_back_c0_hazard(); 382 back_to_back_c0_hazard();
405 mask = read_c0_pagemask(); 383 mask = read_c0_pagemask();
406 write_c0_pagemask(PM_DEFAULT_MASK); 384 write_c0_pagemask(PM_DEFAULT_MASK);
407 385
408 EXIT_CRITICAL(flags); 386 local_irq_restore(flags);
409 387
410 return mask == PM_HUGE_MASK; 388 return mask == PM_HUGE_MASK;
411} 389}