Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg...
[linux-2.6] / arch / mips / mm / tlbex.c
1 /*
2  * 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  * Synthesize TLB refill handlers at runtime.
7  *
8  * Copyright (C) 2004, 2005, 2006, 2008  Thiemo Seufer
9  * Copyright (C) 2005, 2007, 2008, 2009  Maciej W. Rozycki
10  * Copyright (C) 2006  Ralf Baechle (ralf@linux-mips.org)
11  * Copyright (C) 2008, 2009 Cavium Networks, Inc.
12  *
13  * ... and the days got worse and worse and now you see
14  * I've gone completly out of my mind.
15  *
16  * They're coming to take me a away haha
17  * they're coming to take me a away hoho hihi haha
18  * to the funny farm where code is beautiful all the time ...
19  *
20  * (Condolences to Napoleon XIV)
21  */
22
23 #include <linux/bug.h>
24 #include <linux/kernel.h>
25 #include <linux/types.h>
26 #include <linux/string.h>
27 #include <linux/init.h>
28
29 #include <asm/mmu_context.h>
30 #include <asm/war.h>
31
32 #include "uasm.h"
33
34 static inline int r45k_bvahwbug(void)
35 {
36         /* XXX: We should probe for the presence of this bug, but we don't. */
37         return 0;
38 }
39
40 static inline int r4k_250MHZhwbug(void)
41 {
42         /* XXX: We should probe for the presence of this bug, but we don't. */
43         return 0;
44 }
45
46 static inline int __maybe_unused bcm1250_m3_war(void)
47 {
48         return BCM1250_M3_WAR;
49 }
50
51 static inline int __maybe_unused r10000_llsc_war(void)
52 {
53         return R10000_LLSC_WAR;
54 }
55
56 /*
57  * Found by experiment: At least some revisions of the 4kc throw under
58  * some circumstances a machine check exception, triggered by invalid
59  * values in the index register.  Delaying the tlbp instruction until
60  * after the next branch,  plus adding an additional nop in front of
61  * tlbwi/tlbwr avoids the invalid index register values. Nobody knows
62  * why; it's not an issue caused by the core RTL.
63  *
64  */
65 static int __cpuinit m4kc_tlbp_war(void)
66 {
67         return (current_cpu_data.processor_id & 0xffff00) ==
68                (PRID_COMP_MIPS | PRID_IMP_4KC);
69 }
70
71 /* Handle labels (which must be positive integers). */
72 enum label_id {
73         label_second_part = 1,
74         label_leave,
75 #ifdef MODULE_START
76         label_module_alloc,
77 #endif
78         label_vmalloc,
79         label_vmalloc_done,
80         label_tlbw_hazard,
81         label_split,
82         label_nopage_tlbl,
83         label_nopage_tlbs,
84         label_nopage_tlbm,
85         label_smp_pgtable_change,
86         label_r3000_write_probe_fail,
87 #ifdef CONFIG_HUGETLB_PAGE
88         label_tlb_huge_update,
89 #endif
90 };
91
92 UASM_L_LA(_second_part)
93 UASM_L_LA(_leave)
94 #ifdef MODULE_START
95 UASM_L_LA(_module_alloc)
96 #endif
97 UASM_L_LA(_vmalloc)
98 UASM_L_LA(_vmalloc_done)
99 UASM_L_LA(_tlbw_hazard)
100 UASM_L_LA(_split)
101 UASM_L_LA(_nopage_tlbl)
102 UASM_L_LA(_nopage_tlbs)
103 UASM_L_LA(_nopage_tlbm)
104 UASM_L_LA(_smp_pgtable_change)
105 UASM_L_LA(_r3000_write_probe_fail)
106 #ifdef CONFIG_HUGETLB_PAGE
107 UASM_L_LA(_tlb_huge_update)
108 #endif
109
110 /*
111  * For debug purposes.
112  */
113 static inline void dump_handler(const u32 *handler, int count)
114 {
115         int i;
116
117         pr_debug("\t.set push\n");
118         pr_debug("\t.set noreorder\n");
119
120         for (i = 0; i < count; i++)
121                 pr_debug("\t%p\t.word 0x%08x\n", &handler[i], handler[i]);
122
123         pr_debug("\t.set pop\n");
124 }
125
126 /* The only general purpose registers allowed in TLB handlers. */
127 #define K0              26
128 #define K1              27
129
130 /* Some CP0 registers */
131 #define C0_INDEX        0, 0
132 #define C0_ENTRYLO0     2, 0
133 #define C0_TCBIND       2, 2
134 #define C0_ENTRYLO1     3, 0
135 #define C0_CONTEXT      4, 0
136 #define C0_PAGEMASK     5, 0
137 #define C0_BADVADDR     8, 0
138 #define C0_ENTRYHI      10, 0
139 #define C0_EPC          14, 0
140 #define C0_XCONTEXT     20, 0
141
142 #ifdef CONFIG_64BIT
143 # define GET_CONTEXT(buf, reg) UASM_i_MFC0(buf, reg, C0_XCONTEXT)
144 #else
145 # define GET_CONTEXT(buf, reg) UASM_i_MFC0(buf, reg, C0_CONTEXT)
146 #endif
147
148 /* The worst case length of the handler is around 18 instructions for
149  * R3000-style TLBs and up to 63 instructions for R4000-style TLBs.
150  * Maximum space available is 32 instructions for R3000 and 64
151  * instructions for R4000.
152  *
153  * We deliberately chose a buffer size of 128, so we won't scribble
154  * over anything important on overflow before we panic.
155  */
156 static u32 tlb_handler[128] __cpuinitdata;
157
158 /* simply assume worst case size for labels and relocs */
159 static struct uasm_label labels[128] __cpuinitdata;
160 static struct uasm_reloc relocs[128] __cpuinitdata;
161
162 /*
163  * The R3000 TLB handler is simple.
164  */
165 static void __cpuinit build_r3000_tlb_refill_handler(void)
166 {
167         long pgdc = (long)pgd_current;
168         u32 *p;
169
170         memset(tlb_handler, 0, sizeof(tlb_handler));
171         p = tlb_handler;
172
173         uasm_i_mfc0(&p, K0, C0_BADVADDR);
174         uasm_i_lui(&p, K1, uasm_rel_hi(pgdc)); /* cp0 delay */
175         uasm_i_lw(&p, K1, uasm_rel_lo(pgdc), K1);
176         uasm_i_srl(&p, K0, K0, 22); /* load delay */
177         uasm_i_sll(&p, K0, K0, 2);
178         uasm_i_addu(&p, K1, K1, K0);
179         uasm_i_mfc0(&p, K0, C0_CONTEXT);
180         uasm_i_lw(&p, K1, 0, K1); /* cp0 delay */
181         uasm_i_andi(&p, K0, K0, 0xffc); /* load delay */
182         uasm_i_addu(&p, K1, K1, K0);
183         uasm_i_lw(&p, K0, 0, K1);
184         uasm_i_nop(&p); /* load delay */
185         uasm_i_mtc0(&p, K0, C0_ENTRYLO0);
186         uasm_i_mfc0(&p, K1, C0_EPC); /* cp0 delay */
187         uasm_i_tlbwr(&p); /* cp0 delay */
188         uasm_i_jr(&p, K1);
189         uasm_i_rfe(&p); /* branch delay */
190
191         if (p > tlb_handler + 32)
192                 panic("TLB refill handler space exceeded");
193
194         pr_debug("Wrote TLB refill handler (%u instructions).\n",
195                  (unsigned int)(p - tlb_handler));
196
197         memcpy((void *)ebase, tlb_handler, 0x80);
198
199         dump_handler((u32 *)ebase, 32);
200 }
201
202 /*
203  * The R4000 TLB handler is much more complicated. We have two
204  * consecutive handler areas with 32 instructions space each.
205  * Since they aren't used at the same time, we can overflow in the
206  * other one.To keep things simple, we first assume linear space,
207  * then we relocate it to the final handler layout as needed.
208  */
209 static u32 final_handler[64] __cpuinitdata;
210
211 /*
212  * Hazards
213  *
214  * From the IDT errata for the QED RM5230 (Nevada), processor revision 1.0:
215  * 2. A timing hazard exists for the TLBP instruction.
216  *
217  *      stalling_instruction
218  *      TLBP
219  *
220  * The JTLB is being read for the TLBP throughout the stall generated by the
221  * previous instruction. This is not really correct as the stalling instruction
222  * can modify the address used to access the JTLB.  The failure symptom is that
223  * the TLBP instruction will use an address created for the stalling instruction
224  * and not the address held in C0_ENHI and thus report the wrong results.
225  *
226  * The software work-around is to not allow the instruction preceding the TLBP
227  * to stall - make it an NOP or some other instruction guaranteed not to stall.
228  *
229  * Errata 2 will not be fixed.  This errata is also on the R5000.
230  *
231  * As if we MIPS hackers wouldn't know how to nop pipelines happy ...
232  */
233 static void __cpuinit __maybe_unused build_tlb_probe_entry(u32 **p)
234 {
235         switch (current_cpu_type()) {
236         /* Found by experiment: R4600 v2.0/R4700 needs this, too.  */
237         case CPU_R4600:
238         case CPU_R4700:
239         case CPU_R5000:
240         case CPU_R5000A:
241         case CPU_NEVADA:
242                 uasm_i_nop(p);
243                 uasm_i_tlbp(p);
244                 break;
245
246         default:
247                 uasm_i_tlbp(p);
248                 break;
249         }
250 }
251
252 /*
253  * Write random or indexed TLB entry, and care about the hazards from
254  * the preceeding mtc0 and for the following eret.
255  */
256 enum tlb_write_entry { tlb_random, tlb_indexed };
257
258 static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l,
259                                          struct uasm_reloc **r,
260                                          enum tlb_write_entry wmode)
261 {
262         void(*tlbw)(u32 **) = NULL;
263
264         switch (wmode) {
265         case tlb_random: tlbw = uasm_i_tlbwr; break;
266         case tlb_indexed: tlbw = uasm_i_tlbwi; break;
267         }
268
269         if (cpu_has_mips_r2) {
270                 if (cpu_has_mips_r2_exec_hazard)
271                         uasm_i_ehb(p);
272                 tlbw(p);
273                 return;
274         }
275
276         switch (current_cpu_type()) {
277         case CPU_R4000PC:
278         case CPU_R4000SC:
279         case CPU_R4000MC:
280         case CPU_R4400PC:
281         case CPU_R4400SC:
282         case CPU_R4400MC:
283                 /*
284                  * This branch uses up a mtc0 hazard nop slot and saves
285                  * two nops after the tlbw instruction.
286                  */
287                 uasm_il_bgezl(p, r, 0, label_tlbw_hazard);
288                 tlbw(p);
289                 uasm_l_tlbw_hazard(l, *p);
290                 uasm_i_nop(p);
291                 break;
292
293         case CPU_R4600:
294         case CPU_R4700:
295         case CPU_R5000:
296         case CPU_R5000A:
297                 uasm_i_nop(p);
298                 tlbw(p);
299                 uasm_i_nop(p);
300                 break;
301
302         case CPU_R4300:
303         case CPU_5KC:
304         case CPU_TX49XX:
305         case CPU_PR4450:
306                 uasm_i_nop(p);
307                 tlbw(p);
308                 break;
309
310         case CPU_R10000:
311         case CPU_R12000:
312         case CPU_R14000:
313         case CPU_4KC:
314         case CPU_4KEC:
315         case CPU_SB1:
316         case CPU_SB1A:
317         case CPU_4KSC:
318         case CPU_20KC:
319         case CPU_25KF:
320         case CPU_BCM3302:
321         case CPU_BCM4710:
322         case CPU_LOONGSON2:
323         case CPU_R5500:
324                 if (m4kc_tlbp_war())
325                         uasm_i_nop(p);
326         case CPU_ALCHEMY:
327                 tlbw(p);
328                 break;
329
330         case CPU_NEVADA:
331                 uasm_i_nop(p); /* QED specifies 2 nops hazard */
332                 /*
333                  * This branch uses up a mtc0 hazard nop slot and saves
334                  * a nop after the tlbw instruction.
335                  */
336                 uasm_il_bgezl(p, r, 0, label_tlbw_hazard);
337                 tlbw(p);
338                 uasm_l_tlbw_hazard(l, *p);
339                 break;
340
341         case CPU_RM7000:
342                 uasm_i_nop(p);
343                 uasm_i_nop(p);
344                 uasm_i_nop(p);
345                 uasm_i_nop(p);
346                 tlbw(p);
347                 break;
348
349         case CPU_RM9000:
350                 /*
351                  * When the JTLB is updated by tlbwi or tlbwr, a subsequent
352                  * use of the JTLB for instructions should not occur for 4
353                  * cpu cycles and use for data translations should not occur
354                  * for 3 cpu cycles.
355                  */
356                 uasm_i_ssnop(p);
357                 uasm_i_ssnop(p);
358                 uasm_i_ssnop(p);
359                 uasm_i_ssnop(p);
360                 tlbw(p);
361                 uasm_i_ssnop(p);
362                 uasm_i_ssnop(p);
363                 uasm_i_ssnop(p);
364                 uasm_i_ssnop(p);
365                 break;
366
367         case CPU_VR4111:
368         case CPU_VR4121:
369         case CPU_VR4122:
370         case CPU_VR4181:
371         case CPU_VR4181A:
372                 uasm_i_nop(p);
373                 uasm_i_nop(p);
374                 tlbw(p);
375                 uasm_i_nop(p);
376                 uasm_i_nop(p);
377                 break;
378
379         case CPU_VR4131:
380         case CPU_VR4133:
381         case CPU_R5432:
382                 uasm_i_nop(p);
383                 uasm_i_nop(p);
384                 tlbw(p);
385                 break;
386
387         default:
388                 panic("No TLB refill handler yet (CPU type: %d)",
389                       current_cpu_data.cputype);
390                 break;
391         }
392 }
393
394 #ifdef CONFIG_HUGETLB_PAGE
395 static __cpuinit void build_huge_tlb_write_entry(u32 **p,
396                                                  struct uasm_label **l,
397                                                  struct uasm_reloc **r,
398                                                  unsigned int tmp,
399                                                  enum tlb_write_entry wmode)
400 {
401         /* Set huge page tlb entry size */
402         uasm_i_lui(p, tmp, PM_HUGE_MASK >> 16);
403         uasm_i_ori(p, tmp, tmp, PM_HUGE_MASK & 0xffff);
404         uasm_i_mtc0(p, tmp, C0_PAGEMASK);
405
406         build_tlb_write_entry(p, l, r, wmode);
407
408         /* Reset default page size */
409         if (PM_DEFAULT_MASK >> 16) {
410                 uasm_i_lui(p, tmp, PM_DEFAULT_MASK >> 16);
411                 uasm_i_ori(p, tmp, tmp, PM_DEFAULT_MASK & 0xffff);
412                 uasm_il_b(p, r, label_leave);
413                 uasm_i_mtc0(p, tmp, C0_PAGEMASK);
414         } else if (PM_DEFAULT_MASK) {
415                 uasm_i_ori(p, tmp, 0, PM_DEFAULT_MASK);
416                 uasm_il_b(p, r, label_leave);
417                 uasm_i_mtc0(p, tmp, C0_PAGEMASK);
418         } else {
419                 uasm_il_b(p, r, label_leave);
420                 uasm_i_mtc0(p, 0, C0_PAGEMASK);
421         }
422 }
423
424 /*
425  * Check if Huge PTE is present, if so then jump to LABEL.
426  */
427 static void __cpuinit
428 build_is_huge_pte(u32 **p, struct uasm_reloc **r, unsigned int tmp,
429                 unsigned int pmd, int lid)
430 {
431         UASM_i_LW(p, tmp, 0, pmd);
432         uasm_i_andi(p, tmp, tmp, _PAGE_HUGE);
433         uasm_il_bnez(p, r, tmp, lid);
434 }
435
436 static __cpuinit void build_huge_update_entries(u32 **p,
437                                                 unsigned int pte,
438                                                 unsigned int tmp)
439 {
440         int small_sequence;
441
442         /*
443          * A huge PTE describes an area the size of the
444          * configured huge page size. This is twice the
445          * of the large TLB entry size we intend to use.
446          * A TLB entry half the size of the configured
447          * huge page size is configured into entrylo0
448          * and entrylo1 to cover the contiguous huge PTE
449          * address space.
450          */
451         small_sequence = (HPAGE_SIZE >> 7) < 0x10000;
452
453         /* We can clobber tmp.  It isn't used after this.*/
454         if (!small_sequence)
455                 uasm_i_lui(p, tmp, HPAGE_SIZE >> (7 + 16));
456
457         UASM_i_SRL(p, pte, pte, 6); /* convert to entrylo */
458         uasm_i_mtc0(p, pte, C0_ENTRYLO0); /* load it */
459         /* convert to entrylo1 */
460         if (small_sequence)
461                 UASM_i_ADDIU(p, pte, pte, HPAGE_SIZE >> 7);
462         else
463                 UASM_i_ADDU(p, pte, pte, tmp);
464
465         uasm_i_mtc0(p, pte, C0_ENTRYLO1); /* load it */
466 }
467
468 static __cpuinit void build_huge_handler_tail(u32 **p,
469                                               struct uasm_reloc **r,
470                                               struct uasm_label **l,
471                                               unsigned int pte,
472                                               unsigned int ptr)
473 {
474 #ifdef CONFIG_SMP
475         UASM_i_SC(p, pte, 0, ptr);
476         uasm_il_beqz(p, r, pte, label_tlb_huge_update);
477         UASM_i_LW(p, pte, 0, ptr); /* Needed because SC killed our PTE */
478 #else
479         UASM_i_SW(p, pte, 0, ptr);
480 #endif
481         build_huge_update_entries(p, pte, ptr);
482         build_huge_tlb_write_entry(p, l, r, pte, tlb_indexed);
483 }
484 #endif /* CONFIG_HUGETLB_PAGE */
485
486 #ifdef CONFIG_64BIT
487 /*
488  * TMP and PTR are scratch.
489  * TMP will be clobbered, PTR will hold the pmd entry.
490  */
491 static void __cpuinit
492 build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
493                  unsigned int tmp, unsigned int ptr)
494 {
495         long pgdc = (long)pgd_current;
496
497         /*
498          * The vmalloc handling is not in the hotpath.
499          */
500         uasm_i_dmfc0(p, tmp, C0_BADVADDR);
501 #ifdef MODULE_START
502         uasm_il_bltz(p, r, tmp, label_module_alloc);
503 #else
504         uasm_il_bltz(p, r, tmp, label_vmalloc);
505 #endif
506         /* No uasm_i_nop needed here, since the next insn doesn't touch TMP. */
507
508 #ifdef CONFIG_SMP
509 # ifdef  CONFIG_MIPS_MT_SMTC
510         /*
511          * SMTC uses TCBind value as "CPU" index
512          */
513         uasm_i_mfc0(p, ptr, C0_TCBIND);
514         uasm_i_dsrl(p, ptr, ptr, 19);
515 # else
516         /*
517          * 64 bit SMP running in XKPHYS has smp_processor_id() << 3
518          * stored in CONTEXT.
519          */
520         uasm_i_dmfc0(p, ptr, C0_CONTEXT);
521         uasm_i_dsrl(p, ptr, ptr, 23);
522 #endif
523         UASM_i_LA_mostly(p, tmp, pgdc);
524         uasm_i_daddu(p, ptr, ptr, tmp);
525         uasm_i_dmfc0(p, tmp, C0_BADVADDR);
526         uasm_i_ld(p, ptr, uasm_rel_lo(pgdc), ptr);
527 #else
528         UASM_i_LA_mostly(p, ptr, pgdc);
529         uasm_i_ld(p, ptr, uasm_rel_lo(pgdc), ptr);
530 #endif
531
532         uasm_l_vmalloc_done(l, *p);
533
534         if (PGDIR_SHIFT - 3 < 32)               /* get pgd offset in bytes */
535                 uasm_i_dsrl(p, tmp, tmp, PGDIR_SHIFT-3);
536         else
537                 uasm_i_dsrl32(p, tmp, tmp, PGDIR_SHIFT - 3 - 32);
538
539         uasm_i_andi(p, tmp, tmp, (PTRS_PER_PGD - 1)<<3);
540         uasm_i_daddu(p, ptr, ptr, tmp); /* add in pgd offset */
541         uasm_i_dmfc0(p, tmp, C0_BADVADDR); /* get faulting address */
542         uasm_i_ld(p, ptr, 0, ptr); /* get pmd pointer */
543         uasm_i_dsrl(p, tmp, tmp, PMD_SHIFT-3); /* get pmd offset in bytes */
544         uasm_i_andi(p, tmp, tmp, (PTRS_PER_PMD - 1)<<3);
545         uasm_i_daddu(p, ptr, ptr, tmp); /* add in pmd offset */
546 }
547
548 /*
549  * BVADDR is the faulting address, PTR is scratch.
550  * PTR will hold the pgd for vmalloc.
551  */
552 static void __cpuinit
553 build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
554                         unsigned int bvaddr, unsigned int ptr)
555 {
556         long swpd = (long)swapper_pg_dir;
557
558 #ifdef MODULE_START
559         long modd = (long)module_pg_dir;
560
561         uasm_l_module_alloc(l, *p);
562         /*
563          * Assumption:
564          * VMALLOC_START >= 0xc000000000000000UL
565          * MODULE_START >= 0xe000000000000000UL
566          */
567         UASM_i_SLL(p, ptr, bvaddr, 2);
568         uasm_il_bgez(p, r, ptr, label_vmalloc);
569
570         if (uasm_in_compat_space_p(MODULE_START) &&
571             !uasm_rel_lo(MODULE_START)) {
572                 uasm_i_lui(p, ptr, uasm_rel_hi(MODULE_START)); /* delay slot */
573         } else {
574                 /* unlikely configuration */
575                 uasm_i_nop(p); /* delay slot */
576                 UASM_i_LA(p, ptr, MODULE_START);
577         }
578         uasm_i_dsubu(p, bvaddr, bvaddr, ptr);
579
580         if (uasm_in_compat_space_p(modd) && !uasm_rel_lo(modd)) {
581                 uasm_il_b(p, r, label_vmalloc_done);
582                 uasm_i_lui(p, ptr, uasm_rel_hi(modd));
583         } else {
584                 UASM_i_LA_mostly(p, ptr, modd);
585                 uasm_il_b(p, r, label_vmalloc_done);
586                 if (uasm_in_compat_space_p(modd))
587                         uasm_i_addiu(p, ptr, ptr, uasm_rel_lo(modd));
588                 else
589                         uasm_i_daddiu(p, ptr, ptr, uasm_rel_lo(modd));
590         }
591
592         uasm_l_vmalloc(l, *p);
593         if (uasm_in_compat_space_p(MODULE_START) &&
594             !uasm_rel_lo(MODULE_START) &&
595             MODULE_START << 32 == VMALLOC_START)
596                 uasm_i_dsll32(p, ptr, ptr, 0);  /* typical case */
597         else
598                 UASM_i_LA(p, ptr, VMALLOC_START);
599 #else
600         uasm_l_vmalloc(l, *p);
601         UASM_i_LA(p, ptr, VMALLOC_START);
602 #endif
603         uasm_i_dsubu(p, bvaddr, bvaddr, ptr);
604
605         if (uasm_in_compat_space_p(swpd) && !uasm_rel_lo(swpd)) {
606                 uasm_il_b(p, r, label_vmalloc_done);
607                 uasm_i_lui(p, ptr, uasm_rel_hi(swpd));
608         } else {
609                 UASM_i_LA_mostly(p, ptr, swpd);
610                 uasm_il_b(p, r, label_vmalloc_done);
611                 if (uasm_in_compat_space_p(swpd))
612                         uasm_i_addiu(p, ptr, ptr, uasm_rel_lo(swpd));
613                 else
614                         uasm_i_daddiu(p, ptr, ptr, uasm_rel_lo(swpd));
615         }
616 }
617
618 #else /* !CONFIG_64BIT */
619
620 /*
621  * TMP and PTR are scratch.
622  * TMP will be clobbered, PTR will hold the pgd entry.
623  */
624 static void __cpuinit __maybe_unused
625 build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr)
626 {
627         long pgdc = (long)pgd_current;
628
629         /* 32 bit SMP has smp_processor_id() stored in CONTEXT. */
630 #ifdef CONFIG_SMP
631 #ifdef  CONFIG_MIPS_MT_SMTC
632         /*
633          * SMTC uses TCBind value as "CPU" index
634          */
635         uasm_i_mfc0(p, ptr, C0_TCBIND);
636         UASM_i_LA_mostly(p, tmp, pgdc);
637         uasm_i_srl(p, ptr, ptr, 19);
638 #else
639         /*
640          * smp_processor_id() << 3 is stored in CONTEXT.
641          */
642         uasm_i_mfc0(p, ptr, C0_CONTEXT);
643         UASM_i_LA_mostly(p, tmp, pgdc);
644         uasm_i_srl(p, ptr, ptr, 23);
645 #endif
646         uasm_i_addu(p, ptr, tmp, ptr);
647 #else
648         UASM_i_LA_mostly(p, ptr, pgdc);
649 #endif
650         uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */
651         uasm_i_lw(p, ptr, uasm_rel_lo(pgdc), ptr);
652         uasm_i_srl(p, tmp, tmp, PGDIR_SHIFT); /* get pgd only bits */
653         uasm_i_sll(p, tmp, tmp, PGD_T_LOG2);
654         uasm_i_addu(p, ptr, ptr, tmp); /* add in pgd offset */
655 }
656
657 #endif /* !CONFIG_64BIT */
658
659 static void __cpuinit build_adjust_context(u32 **p, unsigned int ctx)
660 {
661         unsigned int shift = 4 - (PTE_T_LOG2 + 1) + PAGE_SHIFT - 12;
662         unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1);
663
664         switch (current_cpu_type()) {
665         case CPU_VR41XX:
666         case CPU_VR4111:
667         case CPU_VR4121:
668         case CPU_VR4122:
669         case CPU_VR4131:
670         case CPU_VR4181:
671         case CPU_VR4181A:
672         case CPU_VR4133:
673                 shift += 2;
674                 break;
675
676         default:
677                 break;
678         }
679
680         if (shift)
681                 UASM_i_SRL(p, ctx, ctx, shift);
682         uasm_i_andi(p, ctx, ctx, mask);
683 }
684
685 static void __cpuinit build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr)
686 {
687         /*
688          * Bug workaround for the Nevada. It seems as if under certain
689          * circumstances the move from cp0_context might produce a
690          * bogus result when the mfc0 instruction and its consumer are
691          * in a different cacheline or a load instruction, probably any
692          * memory reference, is between them.
693          */
694         switch (current_cpu_type()) {
695         case CPU_NEVADA:
696                 UASM_i_LW(p, ptr, 0, ptr);
697                 GET_CONTEXT(p, tmp); /* get context reg */
698                 break;
699
700         default:
701                 GET_CONTEXT(p, tmp); /* get context reg */
702                 UASM_i_LW(p, ptr, 0, ptr);
703                 break;
704         }
705
706         build_adjust_context(p, tmp);
707         UASM_i_ADDU(p, ptr, ptr, tmp); /* add in offset */
708 }
709
710 static void __cpuinit build_update_entries(u32 **p, unsigned int tmp,
711                                         unsigned int ptep)
712 {
713         /*
714          * 64bit address support (36bit on a 32bit CPU) in a 32bit
715          * Kernel is a special case. Only a few CPUs use it.
716          */
717 #ifdef CONFIG_64BIT_PHYS_ADDR
718         if (cpu_has_64bits) {
719                 uasm_i_ld(p, tmp, 0, ptep); /* get even pte */
720                 uasm_i_ld(p, ptep, sizeof(pte_t), ptep); /* get odd pte */
721                 uasm_i_dsrl(p, tmp, tmp, 6); /* convert to entrylo0 */
722                 uasm_i_mtc0(p, tmp, C0_ENTRYLO0); /* load it */
723                 uasm_i_dsrl(p, ptep, ptep, 6); /* convert to entrylo1 */
724                 uasm_i_mtc0(p, ptep, C0_ENTRYLO1); /* load it */
725         } else {
726                 int pte_off_even = sizeof(pte_t) / 2;
727                 int pte_off_odd = pte_off_even + sizeof(pte_t);
728
729                 /* The pte entries are pre-shifted */
730                 uasm_i_lw(p, tmp, pte_off_even, ptep); /* get even pte */
731                 uasm_i_mtc0(p, tmp, C0_ENTRYLO0); /* load it */
732                 uasm_i_lw(p, ptep, pte_off_odd, ptep); /* get odd pte */
733                 uasm_i_mtc0(p, ptep, C0_ENTRYLO1); /* load it */
734         }
735 #else
736         UASM_i_LW(p, tmp, 0, ptep); /* get even pte */
737         UASM_i_LW(p, ptep, sizeof(pte_t), ptep); /* get odd pte */
738         if (r45k_bvahwbug())
739                 build_tlb_probe_entry(p);
740         UASM_i_SRL(p, tmp, tmp, 6); /* convert to entrylo0 */
741         if (r4k_250MHZhwbug())
742                 uasm_i_mtc0(p, 0, C0_ENTRYLO0);
743         uasm_i_mtc0(p, tmp, C0_ENTRYLO0); /* load it */
744         UASM_i_SRL(p, ptep, ptep, 6); /* convert to entrylo1 */
745         if (r45k_bvahwbug())
746                 uasm_i_mfc0(p, tmp, C0_INDEX);
747         if (r4k_250MHZhwbug())
748                 uasm_i_mtc0(p, 0, C0_ENTRYLO1);
749         uasm_i_mtc0(p, ptep, C0_ENTRYLO1); /* load it */
750 #endif
751 }
752
753 /*
754  * For a 64-bit kernel, we are using the 64-bit XTLB refill exception
755  * because EXL == 0.  If we wrap, we can also use the 32 instruction
756  * slots before the XTLB refill exception handler which belong to the
757  * unused TLB refill exception.
758  */
759 #define MIPS64_REFILL_INSNS 32
760
761 static void __cpuinit build_r4000_tlb_refill_handler(void)
762 {
763         u32 *p = tlb_handler;
764         struct uasm_label *l = labels;
765         struct uasm_reloc *r = relocs;
766         u32 *f;
767         unsigned int final_len;
768
769         memset(tlb_handler, 0, sizeof(tlb_handler));
770         memset(labels, 0, sizeof(labels));
771         memset(relocs, 0, sizeof(relocs));
772         memset(final_handler, 0, sizeof(final_handler));
773
774         /*
775          * create the plain linear handler
776          */
777         if (bcm1250_m3_war()) {
778                 UASM_i_MFC0(&p, K0, C0_BADVADDR);
779                 UASM_i_MFC0(&p, K1, C0_ENTRYHI);
780                 uasm_i_xor(&p, K0, K0, K1);
781                 UASM_i_SRL(&p, K0, K0, PAGE_SHIFT + 1);
782                 uasm_il_bnez(&p, &r, K0, label_leave);
783                 /* No need for uasm_i_nop */
784         }
785
786 #ifdef CONFIG_64BIT
787         build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */
788 #else
789         build_get_pgde32(&p, K0, K1); /* get pgd in K1 */
790 #endif
791
792 #ifdef CONFIG_HUGETLB_PAGE
793         build_is_huge_pte(&p, &r, K0, K1, label_tlb_huge_update);
794 #endif
795
796         build_get_ptep(&p, K0, K1);
797         build_update_entries(&p, K0, K1);
798         build_tlb_write_entry(&p, &l, &r, tlb_random);
799         uasm_l_leave(&l, p);
800         uasm_i_eret(&p); /* return from trap */
801
802 #ifdef CONFIG_HUGETLB_PAGE
803         uasm_l_tlb_huge_update(&l, p);
804         UASM_i_LW(&p, K0, 0, K1);
805         build_huge_update_entries(&p, K0, K1);
806         build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random);
807 #endif
808
809 #ifdef CONFIG_64BIT
810         build_get_pgd_vmalloc64(&p, &l, &r, K0, K1);
811 #endif
812
813         /*
814          * Overflow check: For the 64bit handler, we need at least one
815          * free instruction slot for the wrap-around branch. In worst
816          * case, if the intended insertion point is a delay slot, we
817          * need three, with the second nop'ed and the third being
818          * unused.
819          */
820         /* Loongson2 ebase is different than r4k, we have more space */
821 #if defined(CONFIG_32BIT) || defined(CONFIG_CPU_LOONGSON2)
822         if ((p - tlb_handler) > 64)
823                 panic("TLB refill handler space exceeded");
824 #else
825         if (((p - tlb_handler) > (MIPS64_REFILL_INSNS * 2) - 1)
826             || (((p - tlb_handler) > (MIPS64_REFILL_INSNS * 2) - 3)
827                 && uasm_insn_has_bdelay(relocs,
828                                         tlb_handler + MIPS64_REFILL_INSNS - 3)))
829                 panic("TLB refill handler space exceeded");
830 #endif
831
832         /*
833          * Now fold the handler in the TLB refill handler space.
834          */
835 #if defined(CONFIG_32BIT) || defined(CONFIG_CPU_LOONGSON2)
836         f = final_handler;
837         /* Simplest case, just copy the handler. */
838         uasm_copy_handler(relocs, labels, tlb_handler, p, f);
839         final_len = p - tlb_handler;
840 #else /* CONFIG_64BIT */
841         f = final_handler + MIPS64_REFILL_INSNS;
842         if ((p - tlb_handler) <= MIPS64_REFILL_INSNS) {
843                 /* Just copy the handler. */
844                 uasm_copy_handler(relocs, labels, tlb_handler, p, f);
845                 final_len = p - tlb_handler;
846         } else {
847 #if defined(CONFIG_HUGETLB_PAGE)
848                 const enum label_id ls = label_tlb_huge_update;
849 #elif defined(MODULE_START)
850                 const enum label_id ls = label_module_alloc;
851 #else
852                 const enum label_id ls = label_vmalloc;
853 #endif
854                 u32 *split;
855                 int ov = 0;
856                 int i;
857
858                 for (i = 0; i < ARRAY_SIZE(labels) && labels[i].lab != ls; i++)
859                         ;
860                 BUG_ON(i == ARRAY_SIZE(labels));
861                 split = labels[i].addr;
862
863                 /*
864                  * See if we have overflown one way or the other.
865                  */
866                 if (split > tlb_handler + MIPS64_REFILL_INSNS ||
867                     split < p - MIPS64_REFILL_INSNS)
868                         ov = 1;
869
870                 if (ov) {
871                         /*
872                          * Split two instructions before the end.  One
873                          * for the branch and one for the instruction
874                          * in the delay slot.
875                          */
876                         split = tlb_handler + MIPS64_REFILL_INSNS - 2;
877
878                         /*
879                          * If the branch would fall in a delay slot,
880                          * we must back up an additional instruction
881                          * so that it is no longer in a delay slot.
882                          */
883                         if (uasm_insn_has_bdelay(relocs, split - 1))
884                                 split--;
885                 }
886                 /* Copy first part of the handler. */
887                 uasm_copy_handler(relocs, labels, tlb_handler, split, f);
888                 f += split - tlb_handler;
889
890                 if (ov) {
891                         /* Insert branch. */
892                         uasm_l_split(&l, final_handler);
893                         uasm_il_b(&f, &r, label_split);
894                         if (uasm_insn_has_bdelay(relocs, split))
895                                 uasm_i_nop(&f);
896                         else {
897                                 uasm_copy_handler(relocs, labels,
898                                                   split, split + 1, f);
899                                 uasm_move_labels(labels, f, f + 1, -1);
900                                 f++;
901                                 split++;
902                         }
903                 }
904
905                 /* Copy the rest of the handler. */
906                 uasm_copy_handler(relocs, labels, split, p, final_handler);
907                 final_len = (f - (final_handler + MIPS64_REFILL_INSNS)) +
908                             (p - split);
909         }
910 #endif /* CONFIG_64BIT */
911
912         uasm_resolve_relocs(relocs, labels);
913         pr_debug("Wrote TLB refill handler (%u instructions).\n",
914                  final_len);
915
916         memcpy((void *)ebase, final_handler, 0x100);
917
918         dump_handler((u32 *)ebase, 64);
919 }
920
921 /*
922  * TLB load/store/modify handlers.
923  *
924  * Only the fastpath gets synthesized at runtime, the slowpath for
925  * do_page_fault remains normal asm.
926  */
927 extern void tlb_do_page_fault_0(void);
928 extern void tlb_do_page_fault_1(void);
929
930 /*
931  * 128 instructions for the fastpath handler is generous and should
932  * never be exceeded.
933  */
934 #define FASTPATH_SIZE 128
935
936 u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned;
937 u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned;
938 u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned;
939
940 static void __cpuinit
941 iPTE_LW(u32 **p, unsigned int pte, unsigned int ptr)
942 {
943 #ifdef CONFIG_SMP
944 # ifdef CONFIG_64BIT_PHYS_ADDR
945         if (cpu_has_64bits)
946                 uasm_i_lld(p, pte, 0, ptr);
947         else
948 # endif
949                 UASM_i_LL(p, pte, 0, ptr);
950 #else
951 # ifdef CONFIG_64BIT_PHYS_ADDR
952         if (cpu_has_64bits)
953                 uasm_i_ld(p, pte, 0, ptr);
954         else
955 # endif
956                 UASM_i_LW(p, pte, 0, ptr);
957 #endif
958 }
959
960 static void __cpuinit
961 iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr,
962         unsigned int mode)
963 {
964 #ifdef CONFIG_64BIT_PHYS_ADDR
965         unsigned int hwmode = mode & (_PAGE_VALID | _PAGE_DIRTY);
966 #endif
967
968         uasm_i_ori(p, pte, pte, mode);
969 #ifdef CONFIG_SMP
970 # ifdef CONFIG_64BIT_PHYS_ADDR
971         if (cpu_has_64bits)
972                 uasm_i_scd(p, pte, 0, ptr);
973         else
974 # endif
975                 UASM_i_SC(p, pte, 0, ptr);
976
977         if (r10000_llsc_war())
978                 uasm_il_beqzl(p, r, pte, label_smp_pgtable_change);
979         else
980                 uasm_il_beqz(p, r, pte, label_smp_pgtable_change);
981
982 # ifdef CONFIG_64BIT_PHYS_ADDR
983         if (!cpu_has_64bits) {
984                 /* no uasm_i_nop needed */
985                 uasm_i_ll(p, pte, sizeof(pte_t) / 2, ptr);
986                 uasm_i_ori(p, pte, pte, hwmode);
987                 uasm_i_sc(p, pte, sizeof(pte_t) / 2, ptr);
988                 uasm_il_beqz(p, r, pte, label_smp_pgtable_change);
989                 /* no uasm_i_nop needed */
990                 uasm_i_lw(p, pte, 0, ptr);
991         } else
992                 uasm_i_nop(p);
993 # else
994         uasm_i_nop(p);
995 # endif
996 #else
997 # ifdef CONFIG_64BIT_PHYS_ADDR
998         if (cpu_has_64bits)
999                 uasm_i_sd(p, pte, 0, ptr);
1000         else
1001 # endif
1002                 UASM_i_SW(p, pte, 0, ptr);
1003
1004 # ifdef CONFIG_64BIT_PHYS_ADDR
1005         if (!cpu_has_64bits) {
1006                 uasm_i_lw(p, pte, sizeof(pte_t) / 2, ptr);
1007                 uasm_i_ori(p, pte, pte, hwmode);
1008                 uasm_i_sw(p, pte, sizeof(pte_t) / 2, ptr);
1009                 uasm_i_lw(p, pte, 0, ptr);
1010         }
1011 # endif
1012 #endif
1013 }
1014
1015 /*
1016  * Check if PTE is present, if not then jump to LABEL. PTR points to
1017  * the page table where this PTE is located, PTE will be re-loaded
1018  * with it's original value.
1019  */
1020 static void __cpuinit
1021 build_pte_present(u32 **p, struct uasm_reloc **r,
1022                   unsigned int pte, unsigned int ptr, enum label_id lid)
1023 {
1024         uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_READ);
1025         uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_READ);
1026         uasm_il_bnez(p, r, pte, lid);
1027         iPTE_LW(p, pte, ptr);
1028 }
1029
1030 /* Make PTE valid, store result in PTR. */
1031 static void __cpuinit
1032 build_make_valid(u32 **p, struct uasm_reloc **r, unsigned int pte,
1033                  unsigned int ptr)
1034 {
1035         unsigned int mode = _PAGE_VALID | _PAGE_ACCESSED;
1036
1037         iPTE_SW(p, r, pte, ptr, mode);
1038 }
1039
1040 /*
1041  * Check if PTE can be written to, if not branch to LABEL. Regardless
1042  * restore PTE with value from PTR when done.
1043  */
1044 static void __cpuinit
1045 build_pte_writable(u32 **p, struct uasm_reloc **r,
1046                    unsigned int pte, unsigned int ptr, enum label_id lid)
1047 {
1048         uasm_i_andi(p, pte, pte, _PAGE_PRESENT | _PAGE_WRITE);
1049         uasm_i_xori(p, pte, pte, _PAGE_PRESENT | _PAGE_WRITE);
1050         uasm_il_bnez(p, r, pte, lid);
1051         iPTE_LW(p, pte, ptr);
1052 }
1053
1054 /* Make PTE writable, update software status bits as well, then store
1055  * at PTR.
1056  */
1057 static void __cpuinit
1058 build_make_write(u32 **p, struct uasm_reloc **r, unsigned int pte,
1059                  unsigned int ptr)
1060 {
1061         unsigned int mode = (_PAGE_ACCESSED | _PAGE_MODIFIED | _PAGE_VALID
1062                              | _PAGE_DIRTY);
1063
1064         iPTE_SW(p, r, pte, ptr, mode);
1065 }
1066
1067 /*
1068  * Check if PTE can be modified, if not branch to LABEL. Regardless
1069  * restore PTE with value from PTR when done.
1070  */
1071 static void __cpuinit
1072 build_pte_modifiable(u32 **p, struct uasm_reloc **r,
1073                      unsigned int pte, unsigned int ptr, enum label_id lid)
1074 {
1075         uasm_i_andi(p, pte, pte, _PAGE_WRITE);
1076         uasm_il_beqz(p, r, pte, lid);
1077         iPTE_LW(p, pte, ptr);
1078 }
1079
1080 /*
1081  * R3000 style TLB load/store/modify handlers.
1082  */
1083
1084 /*
1085  * This places the pte into ENTRYLO0 and writes it with tlbwi.
1086  * Then it returns.
1087  */
1088 static void __cpuinit
1089 build_r3000_pte_reload_tlbwi(u32 **p, unsigned int pte, unsigned int tmp)
1090 {
1091         uasm_i_mtc0(p, pte, C0_ENTRYLO0); /* cp0 delay */
1092         uasm_i_mfc0(p, tmp, C0_EPC); /* cp0 delay */
1093         uasm_i_tlbwi(p);
1094         uasm_i_jr(p, tmp);
1095         uasm_i_rfe(p); /* branch delay */
1096 }
1097
1098 /*
1099  * This places the pte into ENTRYLO0 and writes it with tlbwi
1100  * or tlbwr as appropriate.  This is because the index register
1101  * may have the probe fail bit set as a result of a trap on a
1102  * kseg2 access, i.e. without refill.  Then it returns.
1103  */
1104 static void __cpuinit
1105 build_r3000_tlb_reload_write(u32 **p, struct uasm_label **l,
1106                              struct uasm_reloc **r, unsigned int pte,
1107                              unsigned int tmp)
1108 {
1109         uasm_i_mfc0(p, tmp, C0_INDEX);
1110         uasm_i_mtc0(p, pte, C0_ENTRYLO0); /* cp0 delay */
1111         uasm_il_bltz(p, r, tmp, label_r3000_write_probe_fail); /* cp0 delay */
1112         uasm_i_mfc0(p, tmp, C0_EPC); /* branch delay */
1113         uasm_i_tlbwi(p); /* cp0 delay */
1114         uasm_i_jr(p, tmp);
1115         uasm_i_rfe(p); /* branch delay */
1116         uasm_l_r3000_write_probe_fail(l, *p);
1117         uasm_i_tlbwr(p); /* cp0 delay */
1118         uasm_i_jr(p, tmp);
1119         uasm_i_rfe(p); /* branch delay */
1120 }
1121
1122 static void __cpuinit
1123 build_r3000_tlbchange_handler_head(u32 **p, unsigned int pte,
1124                                    unsigned int ptr)
1125 {
1126         long pgdc = (long)pgd_current;
1127
1128         uasm_i_mfc0(p, pte, C0_BADVADDR);
1129         uasm_i_lui(p, ptr, uasm_rel_hi(pgdc)); /* cp0 delay */
1130         uasm_i_lw(p, ptr, uasm_rel_lo(pgdc), ptr);
1131         uasm_i_srl(p, pte, pte, 22); /* load delay */
1132         uasm_i_sll(p, pte, pte, 2);
1133         uasm_i_addu(p, ptr, ptr, pte);
1134         uasm_i_mfc0(p, pte, C0_CONTEXT);
1135         uasm_i_lw(p, ptr, 0, ptr); /* cp0 delay */
1136         uasm_i_andi(p, pte, pte, 0xffc); /* load delay */
1137         uasm_i_addu(p, ptr, ptr, pte);
1138         uasm_i_lw(p, pte, 0, ptr);
1139         uasm_i_tlbp(p); /* load delay */
1140 }
1141
1142 static void __cpuinit build_r3000_tlb_load_handler(void)
1143 {
1144         u32 *p = handle_tlbl;
1145         struct uasm_label *l = labels;
1146         struct uasm_reloc *r = relocs;
1147
1148         memset(handle_tlbl, 0, sizeof(handle_tlbl));
1149         memset(labels, 0, sizeof(labels));
1150         memset(relocs, 0, sizeof(relocs));
1151
1152         build_r3000_tlbchange_handler_head(&p, K0, K1);
1153         build_pte_present(&p, &r, K0, K1, label_nopage_tlbl);
1154         uasm_i_nop(&p); /* load delay */
1155         build_make_valid(&p, &r, K0, K1);
1156         build_r3000_tlb_reload_write(&p, &l, &r, K0, K1);
1157
1158         uasm_l_nopage_tlbl(&l, p);
1159         uasm_i_j(&p, (unsigned long)tlb_do_page_fault_0 & 0x0fffffff);
1160         uasm_i_nop(&p);
1161
1162         if ((p - handle_tlbl) > FASTPATH_SIZE)
1163                 panic("TLB load handler fastpath space exceeded");
1164
1165         uasm_resolve_relocs(relocs, labels);
1166         pr_debug("Wrote TLB load handler fastpath (%u instructions).\n",
1167                  (unsigned int)(p - handle_tlbl));
1168
1169         dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl));
1170 }
1171
1172 static void __cpuinit build_r3000_tlb_store_handler(void)
1173 {
1174         u32 *p = handle_tlbs;
1175         struct uasm_label *l = labels;
1176         struct uasm_reloc *r = relocs;
1177
1178         memset(handle_tlbs, 0, sizeof(handle_tlbs));
1179         memset(labels, 0, sizeof(labels));
1180         memset(relocs, 0, sizeof(relocs));
1181
1182         build_r3000_tlbchange_handler_head(&p, K0, K1);
1183         build_pte_writable(&p, &r, K0, K1, label_nopage_tlbs);
1184         uasm_i_nop(&p); /* load delay */
1185         build_make_write(&p, &r, K0, K1);
1186         build_r3000_tlb_reload_write(&p, &l, &r, K0, K1);
1187
1188         uasm_l_nopage_tlbs(&l, p);
1189         uasm_i_j(&p, (unsigned long)tlb_do_page_fault_1 & 0x0fffffff);
1190         uasm_i_nop(&p);
1191
1192         if ((p - handle_tlbs) > FASTPATH_SIZE)
1193                 panic("TLB store handler fastpath space exceeded");
1194
1195         uasm_resolve_relocs(relocs, labels);
1196         pr_debug("Wrote TLB store handler fastpath (%u instructions).\n",
1197                  (unsigned int)(p - handle_tlbs));
1198
1199         dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs));
1200 }
1201
1202 static void __cpuinit build_r3000_tlb_modify_handler(void)
1203 {
1204         u32 *p = handle_tlbm;
1205         struct uasm_label *l = labels;
1206         struct uasm_reloc *r = relocs;
1207
1208         memset(handle_tlbm, 0, sizeof(handle_tlbm));
1209         memset(labels, 0, sizeof(labels));
1210         memset(relocs, 0, sizeof(relocs));
1211
1212         build_r3000_tlbchange_handler_head(&p, K0, K1);
1213         build_pte_modifiable(&p, &r, K0, K1, label_nopage_tlbm);
1214         uasm_i_nop(&p); /* load delay */
1215         build_make_write(&p, &r, K0, K1);
1216         build_r3000_pte_reload_tlbwi(&p, K0, K1);
1217
1218         uasm_l_nopage_tlbm(&l, p);
1219         uasm_i_j(&p, (unsigned long)tlb_do_page_fault_1 & 0x0fffffff);
1220         uasm_i_nop(&p);
1221
1222         if ((p - handle_tlbm) > FASTPATH_SIZE)
1223                 panic("TLB modify handler fastpath space exceeded");
1224
1225         uasm_resolve_relocs(relocs, labels);
1226         pr_debug("Wrote TLB modify handler fastpath (%u instructions).\n",
1227                  (unsigned int)(p - handle_tlbm));
1228
1229         dump_handler(handle_tlbm, ARRAY_SIZE(handle_tlbm));
1230 }
1231
1232 /*
1233  * R4000 style TLB load/store/modify handlers.
1234  */
1235 static void __cpuinit
1236 build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l,
1237                                    struct uasm_reloc **r, unsigned int pte,
1238                                    unsigned int ptr)
1239 {
1240 #ifdef CONFIG_64BIT
1241         build_get_pmde64(p, l, r, pte, ptr); /* get pmd in ptr */
1242 #else
1243         build_get_pgde32(p, pte, ptr); /* get pgd in ptr */
1244 #endif
1245
1246 #ifdef CONFIG_HUGETLB_PAGE
1247         /*
1248          * For huge tlb entries, pmd doesn't contain an address but
1249          * instead contains the tlb pte. Check the PAGE_HUGE bit and
1250          * see if we need to jump to huge tlb processing.
1251          */
1252         build_is_huge_pte(p, r, pte, ptr, label_tlb_huge_update);
1253 #endif
1254
1255         UASM_i_MFC0(p, pte, C0_BADVADDR);
1256         UASM_i_LW(p, ptr, 0, ptr);
1257         UASM_i_SRL(p, pte, pte, PAGE_SHIFT + PTE_ORDER - PTE_T_LOG2);
1258         uasm_i_andi(p, pte, pte, (PTRS_PER_PTE - 1) << PTE_T_LOG2);
1259         UASM_i_ADDU(p, ptr, ptr, pte);
1260
1261 #ifdef CONFIG_SMP
1262         uasm_l_smp_pgtable_change(l, *p);
1263 #endif
1264         iPTE_LW(p, pte, ptr); /* get even pte */
1265         if (!m4kc_tlbp_war())
1266                 build_tlb_probe_entry(p);
1267 }
1268
1269 static void __cpuinit
1270 build_r4000_tlbchange_handler_tail(u32 **p, struct uasm_label **l,
1271                                    struct uasm_reloc **r, unsigned int tmp,
1272                                    unsigned int ptr)
1273 {
1274         uasm_i_ori(p, ptr, ptr, sizeof(pte_t));
1275         uasm_i_xori(p, ptr, ptr, sizeof(pte_t));
1276         build_update_entries(p, tmp, ptr);
1277         build_tlb_write_entry(p, l, r, tlb_indexed);
1278         uasm_l_leave(l, *p);
1279         uasm_i_eret(p); /* return from trap */
1280
1281 #ifdef CONFIG_64BIT
1282         build_get_pgd_vmalloc64(p, l, r, tmp, ptr);
1283 #endif
1284 }
1285
1286 static void __cpuinit build_r4000_tlb_load_handler(void)
1287 {
1288         u32 *p = handle_tlbl;
1289         struct uasm_label *l = labels;
1290         struct uasm_reloc *r = relocs;
1291
1292         memset(handle_tlbl, 0, sizeof(handle_tlbl));
1293         memset(labels, 0, sizeof(labels));
1294         memset(relocs, 0, sizeof(relocs));
1295
1296         if (bcm1250_m3_war()) {
1297                 UASM_i_MFC0(&p, K0, C0_BADVADDR);
1298                 UASM_i_MFC0(&p, K1, C0_ENTRYHI);
1299                 uasm_i_xor(&p, K0, K0, K1);
1300                 UASM_i_SRL(&p, K0, K0, PAGE_SHIFT + 1);
1301                 uasm_il_bnez(&p, &r, K0, label_leave);
1302                 /* No need for uasm_i_nop */
1303         }
1304
1305         build_r4000_tlbchange_handler_head(&p, &l, &r, K0, K1);
1306         build_pte_present(&p, &r, K0, K1, label_nopage_tlbl);
1307         if (m4kc_tlbp_war())
1308                 build_tlb_probe_entry(&p);
1309         build_make_valid(&p, &r, K0, K1);
1310         build_r4000_tlbchange_handler_tail(&p, &l, &r, K0, K1);
1311
1312 #ifdef CONFIG_HUGETLB_PAGE
1313         /*
1314          * This is the entry point when build_r4000_tlbchange_handler_head
1315          * spots a huge page.
1316          */
1317         uasm_l_tlb_huge_update(&l, p);
1318         iPTE_LW(&p, K0, K1);
1319         build_pte_present(&p, &r, K0, K1, label_nopage_tlbl);
1320         build_tlb_probe_entry(&p);
1321         uasm_i_ori(&p, K0, K0, (_PAGE_ACCESSED | _PAGE_VALID));
1322         build_huge_handler_tail(&p, &r, &l, K0, K1);
1323 #endif
1324
1325         uasm_l_nopage_tlbl(&l, p);
1326         uasm_i_j(&p, (unsigned long)tlb_do_page_fault_0 & 0x0fffffff);
1327         uasm_i_nop(&p);
1328
1329         if ((p - handle_tlbl) > FASTPATH_SIZE)
1330                 panic("TLB load handler fastpath space exceeded");
1331
1332         uasm_resolve_relocs(relocs, labels);
1333         pr_debug("Wrote TLB load handler fastpath (%u instructions).\n",
1334                  (unsigned int)(p - handle_tlbl));
1335
1336         dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl));
1337 }
1338
1339 static void __cpuinit build_r4000_tlb_store_handler(void)
1340 {
1341         u32 *p = handle_tlbs;
1342         struct uasm_label *l = labels;
1343         struct uasm_reloc *r = relocs;
1344
1345         memset(handle_tlbs, 0, sizeof(handle_tlbs));
1346         memset(labels, 0, sizeof(labels));
1347         memset(relocs, 0, sizeof(relocs));
1348
1349         build_r4000_tlbchange_handler_head(&p, &l, &r, K0, K1);
1350         build_pte_writable(&p, &r, K0, K1, label_nopage_tlbs);
1351         if (m4kc_tlbp_war())
1352                 build_tlb_probe_entry(&p);
1353         build_make_write(&p, &r, K0, K1);
1354         build_r4000_tlbchange_handler_tail(&p, &l, &r, K0, K1);
1355
1356 #ifdef CONFIG_HUGETLB_PAGE
1357         /*
1358          * This is the entry point when
1359          * build_r4000_tlbchange_handler_head spots a huge page.
1360          */
1361         uasm_l_tlb_huge_update(&l, p);
1362         iPTE_LW(&p, K0, K1);
1363         build_pte_writable(&p, &r, K0, K1, label_nopage_tlbs);
1364         build_tlb_probe_entry(&p);
1365         uasm_i_ori(&p, K0, K0,
1366                    _PAGE_ACCESSED | _PAGE_MODIFIED | _PAGE_VALID | _PAGE_DIRTY);
1367         build_huge_handler_tail(&p, &r, &l, K0, K1);
1368 #endif
1369
1370         uasm_l_nopage_tlbs(&l, p);
1371         uasm_i_j(&p, (unsigned long)tlb_do_page_fault_1 & 0x0fffffff);
1372         uasm_i_nop(&p);
1373
1374         if ((p - handle_tlbs) > FASTPATH_SIZE)
1375                 panic("TLB store handler fastpath space exceeded");
1376
1377         uasm_resolve_relocs(relocs, labels);
1378         pr_debug("Wrote TLB store handler fastpath (%u instructions).\n",
1379                  (unsigned int)(p - handle_tlbs));
1380
1381         dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs));
1382 }
1383
1384 static void __cpuinit build_r4000_tlb_modify_handler(void)
1385 {
1386         u32 *p = handle_tlbm;
1387         struct uasm_label *l = labels;
1388         struct uasm_reloc *r = relocs;
1389
1390         memset(handle_tlbm, 0, sizeof(handle_tlbm));
1391         memset(labels, 0, sizeof(labels));
1392         memset(relocs, 0, sizeof(relocs));
1393
1394         build_r4000_tlbchange_handler_head(&p, &l, &r, K0, K1);
1395         build_pte_modifiable(&p, &r, K0, K1, label_nopage_tlbm);
1396         if (m4kc_tlbp_war())
1397                 build_tlb_probe_entry(&p);
1398         /* Present and writable bits set, set accessed and dirty bits. */
1399         build_make_write(&p, &r, K0, K1);
1400         build_r4000_tlbchange_handler_tail(&p, &l, &r, K0, K1);
1401
1402 #ifdef CONFIG_HUGETLB_PAGE
1403         /*
1404          * This is the entry point when
1405          * build_r4000_tlbchange_handler_head spots a huge page.
1406          */
1407         uasm_l_tlb_huge_update(&l, p);
1408         iPTE_LW(&p, K0, K1);
1409         build_pte_modifiable(&p, &r, K0, K1, label_nopage_tlbm);
1410         build_tlb_probe_entry(&p);
1411         uasm_i_ori(&p, K0, K0,
1412                    _PAGE_ACCESSED | _PAGE_MODIFIED | _PAGE_VALID | _PAGE_DIRTY);
1413         build_huge_handler_tail(&p, &r, &l, K0, K1);
1414 #endif
1415
1416         uasm_l_nopage_tlbm(&l, p);
1417         uasm_i_j(&p, (unsigned long)tlb_do_page_fault_1 & 0x0fffffff);
1418         uasm_i_nop(&p);
1419
1420         if ((p - handle_tlbm) > FASTPATH_SIZE)
1421                 panic("TLB modify handler fastpath space exceeded");
1422
1423         uasm_resolve_relocs(relocs, labels);
1424         pr_debug("Wrote TLB modify handler fastpath (%u instructions).\n",
1425                  (unsigned int)(p - handle_tlbm));
1426
1427         dump_handler(handle_tlbm, ARRAY_SIZE(handle_tlbm));
1428 }
1429
1430 void __cpuinit build_tlb_refill_handler(void)
1431 {
1432         /*
1433          * The refill handler is generated per-CPU, multi-node systems
1434          * may have local storage for it. The other handlers are only
1435          * needed once.
1436          */
1437         static int run_once = 0;
1438
1439         switch (current_cpu_type()) {
1440         case CPU_R2000:
1441         case CPU_R3000:
1442         case CPU_R3000A:
1443         case CPU_R3081E:
1444         case CPU_TX3912:
1445         case CPU_TX3922:
1446         case CPU_TX3927:
1447                 build_r3000_tlb_refill_handler();
1448                 if (!run_once) {
1449                         build_r3000_tlb_load_handler();
1450                         build_r3000_tlb_store_handler();
1451                         build_r3000_tlb_modify_handler();
1452                         run_once++;
1453                 }
1454                 break;
1455
1456         case CPU_R6000:
1457         case CPU_R6000A:
1458                 panic("No R6000 TLB refill handler yet");
1459                 break;
1460
1461         case CPU_R8000:
1462                 panic("No R8000 TLB refill handler yet");
1463                 break;
1464
1465         default:
1466                 build_r4000_tlb_refill_handler();
1467                 if (!run_once) {
1468                         build_r4000_tlb_load_handler();
1469                         build_r4000_tlb_store_handler();
1470                         build_r4000_tlb_modify_handler();
1471                         run_once++;
1472                 }
1473         }
1474 }
1475
1476 void __cpuinit flush_tlb_handlers(void)
1477 {
1478         local_flush_icache_range((unsigned long)handle_tlbl,
1479                            (unsigned long)handle_tlbl + sizeof(handle_tlbl));
1480         local_flush_icache_range((unsigned long)handle_tlbs,
1481                            (unsigned long)handle_tlbs + sizeof(handle_tlbs));
1482         local_flush_icache_range((unsigned long)handle_tlbm,
1483                            (unsigned long)handle_tlbm + sizeof(handle_tlbm));
1484 }