diff options
Diffstat (limited to 'arch/mips/mm/tlb-r4k.c')
| -rw-r--r-- | arch/mips/mm/tlb-r4k.c | 54 |
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 | ||
| 26 | extern void build_tlb_refill_handler(void); | 26 | extern 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 | } |
| 117 | EXPORT_SYMBOL(local_flush_tlb_all); | 95 | EXPORT_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 | ||
| 226 | void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) | 204 | void 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 | ||
| 364 | void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, | 342 | void 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 | } |
