local64.h: make <asm/local64.h> mandatory
[linux-2.6-microblaze.git] / arch / sparc / include / asm / ttable.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _SPARC64_TTABLE_H
3 #define _SPARC64_TTABLE_H
4
5 #include <asm/utrap.h>
6 #include <asm/pil.h>
7
8 #ifdef __ASSEMBLY__
9 #include <asm/thread_info.h>
10 #endif
11
12 #define BOOT_KERNEL b sparc64_boot; nop; nop; nop; nop; nop; nop; nop;
13
14 /* We need a "cleaned" instruction... */
15 #define CLEAN_WINDOW                                                    \
16         rdpr    %cleanwin, %l0;         add     %l0, 1, %l0;            \
17         wrpr    %l0, 0x0, %cleanwin;                                    \
18         clr     %o0;    clr     %o1;    clr     %o2;    clr     %o3;    \
19         clr     %o4;    clr     %o5;    clr     %o6;    clr     %o7;    \
20         clr     %l0;    clr     %l1;    clr     %l2;    clr     %l3;    \
21         clr     %l4;    clr     %l5;    clr     %l6;    clr     %l7;    \
22         retry;                                                          \
23         nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
24
25 #define TRAP(routine)                                   \
26         sethi   %hi(109f), %g7;                         \
27         ba,pt   %xcc, etrap;                            \
28 109:     or     %g7, %lo(109b), %g7;                    \
29         call    routine;                                \
30          add    %sp, PTREGS_OFF, %o0;                   \
31         ba,pt   %xcc, rtrap;                            \
32          nop;                                           \
33         nop;
34
35 #define TRAP_7INSNS(routine)                            \
36         sethi   %hi(109f), %g7;                         \
37         ba,pt   %xcc, etrap;                            \
38 109:     or     %g7, %lo(109b), %g7;                    \
39         call    routine;                                \
40          add    %sp, PTREGS_OFF, %o0;                   \
41         ba,pt   %xcc, rtrap;                            \
42          nop;
43
44 #define TRAP_SAVEFPU(routine)                           \
45         sethi   %hi(109f), %g7;                         \
46         ba,pt   %xcc, do_fptrap;                        \
47 109:     or     %g7, %lo(109b), %g7;                    \
48         call    routine;                                \
49          add    %sp, PTREGS_OFF, %o0;                   \
50         ba,pt   %xcc, rtrap;                            \
51          nop;                                           \
52         nop;
53
54 #define TRAP_NOSAVE(routine)                            \
55         ba,pt   %xcc, routine;                          \
56          nop;                                           \
57         nop; nop; nop; nop; nop; nop;
58
59 #define TRAP_NOSAVE_7INSNS(routine)                     \
60         ba,pt   %xcc, routine;                          \
61          nop;                                           \
62         nop; nop; nop; nop; nop;
63
64 #define TRAPTL1(routine)                                \
65         sethi   %hi(109f), %g7;                         \
66         ba,pt   %xcc, etraptl1;                         \
67 109:     or     %g7, %lo(109b), %g7;                    \
68         call    routine;                                \
69          add    %sp, PTREGS_OFF, %o0;                   \
70         ba,pt   %xcc, rtrap;                            \
71          nop;                                           \
72         nop;
73
74 #define TRAP_ARG(routine, arg)                          \
75         sethi   %hi(109f), %g7;                         \
76         ba,pt   %xcc, etrap;                            \
77 109:     or     %g7, %lo(109b), %g7;                    \
78         add     %sp, PTREGS_OFF, %o0;                   \
79         call    routine;                                \
80          mov    arg, %o1;                               \
81         ba,pt   %xcc, rtrap;                            \
82          nop;
83
84 #define TRAPTL1_ARG(routine, arg)                       \
85         sethi   %hi(109f), %g7;                         \
86         ba,pt   %xcc, etraptl1;                         \
87 109:     or     %g7, %lo(109b), %g7;                    \
88         add     %sp, PTREGS_OFF, %o0;                   \
89         call    routine;                                \
90          mov    arg, %o1;                               \
91         ba,pt   %xcc, rtrap;                            \
92          nop;
93
94 #define SYSCALL_TRAP(routine, systbl)                   \
95         rdpr    %pil, %g2;                              \
96         mov     TSTATE_SYSCALL, %g3;                    \
97         sethi   %hi(109f), %g7;                         \
98         ba,pt   %xcc, etrap_syscall;                    \
99 109:     or     %g7, %lo(109b), %g7;                    \
100         sethi   %hi(systbl), %l7;                       \
101         ba,pt   %xcc, routine;                          \
102          or     %l7, %lo(systbl), %l7;
103
104 #define TRAP_UTRAP(handler,lvl)                         \
105         mov     handler, %g3;                           \
106         ba,pt   %xcc, utrap_trap;                       \
107          mov    lvl, %g4;                               \
108         nop;                                            \
109         nop;                                            \
110         nop;                                            \
111         nop;                                            \
112         nop;
113
114 #ifdef CONFIG_COMPAT
115 #define LINUX_32BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sys_call_table32)
116 #else
117 #define LINUX_32BIT_SYSCALL_TRAP BTRAP(0x110)
118 #endif
119 #define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall, sys_call_table64)
120 #define GETCC_TRAP TRAP(getcc)
121 #define SETCC_TRAP TRAP(setcc)
122 #define BREAKPOINT_TRAP TRAP(breakpoint_trap)
123
124 #ifdef CONFIG_TRACE_IRQFLAGS
125
126 #define TRAP_IRQ(routine, level)                        \
127         rdpr    %pil, %g2;                              \
128         wrpr    %g0, PIL_NORMAL_MAX, %pil;              \
129         sethi   %hi(1f-4), %g7;                         \
130         ba,pt   %xcc, etrap_irq;                        \
131          or     %g7, %lo(1f-4), %g7;                    \
132         nop;                                            \
133         nop;                                            \
134         nop;                                            \
135         .subsection     2;                              \
136 1:      call    trace_hardirqs_off;                     \
137          nop;                                           \
138         mov     level, %o0;                             \
139         call    routine;                                \
140          add    %sp, PTREGS_OFF, %o1;                   \
141         ba,a,pt %xcc, rtrap_irq;                        \
142         .previous;
143
144 #else
145
146 #define TRAP_IRQ(routine, level)                        \
147         rdpr    %pil, %g2;                              \
148         wrpr    %g0, PIL_NORMAL_MAX, %pil;              \
149         ba,pt   %xcc, etrap_irq;                        \
150          rd     %pc, %g7;                               \
151         mov     level, %o0;                             \
152         call    routine;                                \
153          add    %sp, PTREGS_OFF, %o1;                   \
154         ba,a,pt %xcc, rtrap_irq;
155
156 #endif
157
158 #define TRAP_NMI_IRQ(routine, level)                    \
159         rdpr    %pil, %g2;                              \
160         wrpr    %g0, PIL_NMI, %pil;                     \
161         ba,pt   %xcc, etrap_irq;                        \
162          rd     %pc, %g7;                               \
163         mov     level, %o0;                             \
164         call    routine;                                \
165          add    %sp, PTREGS_OFF, %o1;                   \
166         ba,a,pt %xcc, rtrap_nmi;
167
168 #define TRAP_IVEC TRAP_NOSAVE(do_ivec)
169
170 #define BTRAP(lvl) TRAP_ARG(bad_trap, lvl)
171
172 #define BTRAPTL1(lvl) TRAPTL1_ARG(bad_trap_tl1, lvl)
173
174 #define FLUSH_WINDOW_TRAP                                               \
175         ba,pt   %xcc, etrap;                                            \
176          rd     %pc, %g7;                                               \
177         flushw;                                                         \
178         ldx     [%sp + PTREGS_OFF + PT_V9_TNPC], %l1;                   \
179         add     %l1, 4, %l2;                                            \
180         stx     %l1, [%sp + PTREGS_OFF + PT_V9_TPC];                    \
181         ba,pt   %xcc, rtrap;                                            \
182          stx    %l2, [%sp + PTREGS_OFF + PT_V9_TNPC];
183
184 #ifdef CONFIG_KPROBES
185 #define KPROBES_TRAP(lvl) TRAP_IRQ(kprobe_trap, lvl)
186 #else
187 #define KPROBES_TRAP(lvl) TRAP_ARG(bad_trap, lvl)
188 #endif
189
190 #ifdef CONFIG_UPROBES
191 #define UPROBES_TRAP(lvl) TRAP_ARG(uprobe_trap, lvl)
192 #else
193 #define UPROBES_TRAP(lvl) TRAP_ARG(bad_trap, lvl)
194 #endif
195
196 #ifdef CONFIG_KGDB
197 #define KGDB_TRAP(lvl) TRAP_IRQ(kgdb_trap, lvl)
198 #else
199 #define KGDB_TRAP(lvl) TRAP_ARG(bad_trap, lvl)
200 #endif
201
202 #define SUN4V_ITSB_MISS                                 \
203         ldxa    [%g0] ASI_SCRATCHPAD, %g2;              \
204         ldx     [%g2 + HV_FAULT_I_ADDR_OFFSET], %g4;    \
205         ldx     [%g2 + HV_FAULT_I_CTX_OFFSET], %g5;     \
206         srlx    %g4, 22, %g6;                           \
207         ba,pt   %xcc, sun4v_itsb_miss;                  \
208          nop;                                           \
209         nop;                                            \
210         nop;
211
212 #define SUN4V_DTSB_MISS                                 \
213         ldxa    [%g0] ASI_SCRATCHPAD, %g2;              \
214         ldx     [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4;    \
215         ldx     [%g2 + HV_FAULT_D_CTX_OFFSET], %g5;     \
216         srlx    %g4, 22, %g6;                           \
217         ba,pt   %xcc, sun4v_dtsb_miss;                  \
218          nop;                                           \
219         nop;                                            \
220         nop;
221
222 #define SUN4V_MCD_PRECISE                               \
223         ldxa    [%g0] ASI_SCRATCHPAD, %g2;              \
224         ldx     [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4;    \
225         ldx     [%g2 + HV_FAULT_D_CTX_OFFSET], %g5;     \
226         ba,pt   %xcc, etrap;                            \
227          rd     %pc, %g7;                               \
228         ba,pt   %xcc, sun4v_mcd_detect_precise;         \
229          nop;                                           \
230         nop;
231
232 /* Before touching these macros, you owe it to yourself to go and
233  * see how arch/sparc64/kernel/winfixup.S works... -DaveM
234  *
235  * For the user cases we used to use the %asi register, but
236  * it turns out that the "wr xxx, %asi" costs ~5 cycles, so
237  * now we use immediate ASI loads and stores instead.  Kudos
238  * to Greg Onufer for pointing out this performance anomaly.
239  *
240  * Further note that we cannot use the g2, g4, g5, and g7 alternate
241  * globals in the spill routines, check out the save instruction in
242  * arch/sparc64/kernel/etrap.S to see what I mean about g2, and
243  * g4/g5 are the globals which are preserved by etrap processing
244  * for the caller of it.  The g7 register is the return pc for
245  * etrap.  Finally, g6 is the current thread register so we cannot
246  * us it in the spill handlers either.  Most of these rules do not
247  * apply to fill processing, only g6 is not usable.
248  */
249
250 /* Normal kernel spill */
251 #define SPILL_0_NORMAL                                  \
252         stx     %l0, [%sp + STACK_BIAS + 0x00];         \
253         stx     %l1, [%sp + STACK_BIAS + 0x08];         \
254         stx     %l2, [%sp + STACK_BIAS + 0x10];         \
255         stx     %l3, [%sp + STACK_BIAS + 0x18];         \
256         stx     %l4, [%sp + STACK_BIAS + 0x20];         \
257         stx     %l5, [%sp + STACK_BIAS + 0x28];         \
258         stx     %l6, [%sp + STACK_BIAS + 0x30];         \
259         stx     %l7, [%sp + STACK_BIAS + 0x38];         \
260         stx     %i0, [%sp + STACK_BIAS + 0x40];         \
261         stx     %i1, [%sp + STACK_BIAS + 0x48];         \
262         stx     %i2, [%sp + STACK_BIAS + 0x50];         \
263         stx     %i3, [%sp + STACK_BIAS + 0x58];         \
264         stx     %i4, [%sp + STACK_BIAS + 0x60];         \
265         stx     %i5, [%sp + STACK_BIAS + 0x68];         \
266         stx     %i6, [%sp + STACK_BIAS + 0x70];         \
267         stx     %i7, [%sp + STACK_BIAS + 0x78];         \
268         saved; retry; nop; nop; nop; nop; nop; nop;     \
269         nop; nop; nop; nop; nop; nop; nop; nop;
270
271 #define SPILL_0_NORMAL_ETRAP                            \
272 etrap_kernel_spill:                                     \
273         stx     %l0, [%sp + STACK_BIAS + 0x00];         \
274         stx     %l1, [%sp + STACK_BIAS + 0x08];         \
275         stx     %l2, [%sp + STACK_BIAS + 0x10];         \
276         stx     %l3, [%sp + STACK_BIAS + 0x18];         \
277         stx     %l4, [%sp + STACK_BIAS + 0x20];         \
278         stx     %l5, [%sp + STACK_BIAS + 0x28];         \
279         stx     %l6, [%sp + STACK_BIAS + 0x30];         \
280         stx     %l7, [%sp + STACK_BIAS + 0x38];         \
281         stx     %i0, [%sp + STACK_BIAS + 0x40];         \
282         stx     %i1, [%sp + STACK_BIAS + 0x48];         \
283         stx     %i2, [%sp + STACK_BIAS + 0x50];         \
284         stx     %i3, [%sp + STACK_BIAS + 0x58];         \
285         stx     %i4, [%sp + STACK_BIAS + 0x60];         \
286         stx     %i5, [%sp + STACK_BIAS + 0x68];         \
287         stx     %i6, [%sp + STACK_BIAS + 0x70];         \
288         stx     %i7, [%sp + STACK_BIAS + 0x78];         \
289         saved;                                          \
290         sub     %g1, 2, %g1;                            \
291         ba,pt   %xcc, etrap_save;                       \
292         wrpr    %g1, %cwp;                              \
293         nop; nop; nop; nop; nop; nop; nop; nop;         \
294         nop; nop; nop; nop;
295
296 /* Normal 64bit spill */
297 #define SPILL_1_GENERIC(ASI)                            \
298         add     %sp, STACK_BIAS + 0x00, %g1;            \
299         stxa    %l0, [%g1 + %g0] ASI;                   \
300         mov     0x08, %g3;                              \
301         stxa    %l1, [%g1 + %g3] ASI;                   \
302         add     %g1, 0x10, %g1;                         \
303         stxa    %l2, [%g1 + %g0] ASI;                   \
304         stxa    %l3, [%g1 + %g3] ASI;                   \
305         add     %g1, 0x10, %g1;                         \
306         stxa    %l4, [%g1 + %g0] ASI;                   \
307         stxa    %l5, [%g1 + %g3] ASI;                   \
308         add     %g1, 0x10, %g1;                         \
309         stxa    %l6, [%g1 + %g0] ASI;                   \
310         stxa    %l7, [%g1 + %g3] ASI;                   \
311         add     %g1, 0x10, %g1;                         \
312         stxa    %i0, [%g1 + %g0] ASI;                   \
313         stxa    %i1, [%g1 + %g3] ASI;                   \
314         add     %g1, 0x10, %g1;                         \
315         stxa    %i2, [%g1 + %g0] ASI;                   \
316         stxa    %i3, [%g1 + %g3] ASI;                   \
317         add     %g1, 0x10, %g1;                         \
318         stxa    %i4, [%g1 + %g0] ASI;                   \
319         stxa    %i5, [%g1 + %g3] ASI;                   \
320         add     %g1, 0x10, %g1;                         \
321         stxa    %i6, [%g1 + %g0] ASI;                   \
322         stxa    %i7, [%g1 + %g3] ASI;                   \
323         saved;                                          \
324         retry; nop; nop;                                \
325         b,a,pt  %xcc, spill_fixup_dax;                  \
326         b,a,pt  %xcc, spill_fixup_mna;                  \
327         b,a,pt  %xcc, spill_fixup;
328
329 #define SPILL_1_GENERIC_ETRAP                           \
330 etrap_user_spill_64bit:                                 \
331         stxa    %l0, [%sp + STACK_BIAS + 0x00] %asi;    \
332         stxa    %l1, [%sp + STACK_BIAS + 0x08] %asi;    \
333         stxa    %l2, [%sp + STACK_BIAS + 0x10] %asi;    \
334         stxa    %l3, [%sp + STACK_BIAS + 0x18] %asi;    \
335         stxa    %l4, [%sp + STACK_BIAS + 0x20] %asi;    \
336         stxa    %l5, [%sp + STACK_BIAS + 0x28] %asi;    \
337         stxa    %l6, [%sp + STACK_BIAS + 0x30] %asi;    \
338         stxa    %l7, [%sp + STACK_BIAS + 0x38] %asi;    \
339         stxa    %i0, [%sp + STACK_BIAS + 0x40] %asi;    \
340         stxa    %i1, [%sp + STACK_BIAS + 0x48] %asi;    \
341         stxa    %i2, [%sp + STACK_BIAS + 0x50] %asi;    \
342         stxa    %i3, [%sp + STACK_BIAS + 0x58] %asi;    \
343         stxa    %i4, [%sp + STACK_BIAS + 0x60] %asi;    \
344         stxa    %i5, [%sp + STACK_BIAS + 0x68] %asi;    \
345         stxa    %i6, [%sp + STACK_BIAS + 0x70] %asi;    \
346         stxa    %i7, [%sp + STACK_BIAS + 0x78] %asi;    \
347         saved;                                          \
348         sub     %g1, 2, %g1;                            \
349         ba,pt   %xcc, etrap_save;                       \
350          wrpr   %g1, %cwp;                              \
351         nop; nop; nop; nop; nop;                        \
352         nop; nop; nop; nop;                             \
353         ba,a,pt %xcc, etrap_spill_fixup_64bit;          \
354         ba,a,pt %xcc, etrap_spill_fixup_64bit;          \
355         ba,a,pt %xcc, etrap_spill_fixup_64bit;
356
357 #define SPILL_1_GENERIC_ETRAP_FIXUP                     \
358 etrap_spill_fixup_64bit:                                \
359         ldub    [%g6 + TI_WSAVED], %g1;                 \
360         sll     %g1, 3, %g3;                            \
361         add     %g6, %g3, %g3;                          \
362         stx     %sp, [%g3 + TI_RWIN_SPTRS];             \
363         sll     %g1, 7, %g3;                            \
364         add     %g6, %g3, %g3;                          \
365         stx     %l0, [%g3 + TI_REG_WINDOW + 0x00];      \
366         stx     %l1, [%g3 + TI_REG_WINDOW + 0x08];      \
367         stx     %l2, [%g3 + TI_REG_WINDOW + 0x10];      \
368         stx     %l3, [%g3 + TI_REG_WINDOW + 0x18];      \
369         stx     %l4, [%g3 + TI_REG_WINDOW + 0x20];      \
370         stx     %l5, [%g3 + TI_REG_WINDOW + 0x28];      \
371         stx     %l6, [%g3 + TI_REG_WINDOW + 0x30];      \
372         stx     %l7, [%g3 + TI_REG_WINDOW + 0x38];      \
373         stx     %i0, [%g3 + TI_REG_WINDOW + 0x40];      \
374         stx     %i1, [%g3 + TI_REG_WINDOW + 0x48];      \
375         stx     %i2, [%g3 + TI_REG_WINDOW + 0x50];      \
376         stx     %i3, [%g3 + TI_REG_WINDOW + 0x58];      \
377         stx     %i4, [%g3 + TI_REG_WINDOW + 0x60];      \
378         stx     %i5, [%g3 + TI_REG_WINDOW + 0x68];      \
379         stx     %i6, [%g3 + TI_REG_WINDOW + 0x70];      \
380         stx     %i7, [%g3 + TI_REG_WINDOW + 0x78];      \
381         add     %g1, 1, %g1;                            \
382         stb     %g1, [%g6 + TI_WSAVED];                 \
383         saved;                                          \
384         rdpr    %cwp, %g1;                              \
385         sub     %g1, 2, %g1;                            \
386         ba,pt   %xcc, etrap_save;                       \
387          wrpr   %g1, %cwp;                              \
388         nop; nop; nop
389
390 /* Normal 32bit spill */
391 #define SPILL_2_GENERIC(ASI)                            \
392         and     %sp, 1, %g3;                            \
393         brnz,pn %g3, (. - (128 + 4));                   \
394          srl    %sp, 0, %sp;                            \
395         stwa    %l0, [%sp + %g0] ASI;                   \
396         mov     0x04, %g3;                              \
397         stwa    %l1, [%sp + %g3] ASI;                   \
398         add     %sp, 0x08, %g1;                         \
399         stwa    %l2, [%g1 + %g0] ASI;                   \
400         stwa    %l3, [%g1 + %g3] ASI;                   \
401         add     %g1, 0x08, %g1;                         \
402         stwa    %l4, [%g1 + %g0] ASI;                   \
403         stwa    %l5, [%g1 + %g3] ASI;                   \
404         add     %g1, 0x08, %g1;                         \
405         stwa    %l6, [%g1 + %g0] ASI;                   \
406         stwa    %l7, [%g1 + %g3] ASI;                   \
407         add     %g1, 0x08, %g1;                         \
408         stwa    %i0, [%g1 + %g0] ASI;                   \
409         stwa    %i1, [%g1 + %g3] ASI;                   \
410         add     %g1, 0x08, %g1;                         \
411         stwa    %i2, [%g1 + %g0] ASI;                   \
412         stwa    %i3, [%g1 + %g3] ASI;                   \
413         add     %g1, 0x08, %g1;                         \
414         stwa    %i4, [%g1 + %g0] ASI;                   \
415         stwa    %i5, [%g1 + %g3] ASI;                   \
416         add     %g1, 0x08, %g1;                         \
417         stwa    %i6, [%g1 + %g0] ASI;                   \
418         stwa    %i7, [%g1 + %g3] ASI;                   \
419         saved;                                          \
420         retry;                                          \
421         b,a,pt  %xcc, spill_fixup_dax;                  \
422         b,a,pt  %xcc, spill_fixup_mna;                  \
423         b,a,pt  %xcc, spill_fixup;
424
425 #define SPILL_2_GENERIC_ETRAP           \
426 etrap_user_spill_32bit:                 \
427         and     %sp, 1, %g3;            \
428         brnz,pn %g3, etrap_user_spill_64bit;    \
429          srl    %sp, 0, %sp;            \
430         stwa    %l0, [%sp + 0x00] %asi; \
431         stwa    %l1, [%sp + 0x04] %asi; \
432         stwa    %l2, [%sp + 0x08] %asi; \
433         stwa    %l3, [%sp + 0x0c] %asi; \
434         stwa    %l4, [%sp + 0x10] %asi; \
435         stwa    %l5, [%sp + 0x14] %asi; \
436         stwa    %l6, [%sp + 0x18] %asi; \
437         stwa    %l7, [%sp + 0x1c] %asi; \
438         stwa    %i0, [%sp + 0x20] %asi; \
439         stwa    %i1, [%sp + 0x24] %asi; \
440         stwa    %i2, [%sp + 0x28] %asi; \
441         stwa    %i3, [%sp + 0x2c] %asi; \
442         stwa    %i4, [%sp + 0x30] %asi; \
443         stwa    %i5, [%sp + 0x34] %asi; \
444         stwa    %i6, [%sp + 0x38] %asi; \
445         stwa    %i7, [%sp + 0x3c] %asi; \
446         saved;                          \
447         sub     %g1, 2, %g1;            \
448         ba,pt   %xcc, etrap_save;       \
449          wrpr   %g1, %cwp;              \
450         nop; nop; nop; nop;             \
451         nop; nop;                       \
452         ba,a,pt %xcc, etrap_spill_fixup_32bit; \
453         ba,a,pt %xcc, etrap_spill_fixup_32bit; \
454         ba,a,pt %xcc, etrap_spill_fixup_32bit;
455
456 #define SPILL_2_GENERIC_ETRAP_FIXUP                     \
457 etrap_spill_fixup_32bit:                                \
458         ldub    [%g6 + TI_WSAVED], %g1;                 \
459         sll     %g1, 3, %g3;                            \
460         add     %g6, %g3, %g3;                          \
461         stx     %sp, [%g3 + TI_RWIN_SPTRS];             \
462         sll     %g1, 7, %g3;                            \
463         add     %g6, %g3, %g3;                          \
464         stw     %l0, [%g3 + TI_REG_WINDOW + 0x00];      \
465         stw     %l1, [%g3 + TI_REG_WINDOW + 0x04];      \
466         stw     %l2, [%g3 + TI_REG_WINDOW + 0x08];      \
467         stw     %l3, [%g3 + TI_REG_WINDOW + 0x0c];      \
468         stw     %l4, [%g3 + TI_REG_WINDOW + 0x10];      \
469         stw     %l5, [%g3 + TI_REG_WINDOW + 0x14];      \
470         stw     %l6, [%g3 + TI_REG_WINDOW + 0x18];      \
471         stw     %l7, [%g3 + TI_REG_WINDOW + 0x1c];      \
472         stw     %i0, [%g3 + TI_REG_WINDOW + 0x20];      \
473         stw     %i1, [%g3 + TI_REG_WINDOW + 0x24];      \
474         stw     %i2, [%g3 + TI_REG_WINDOW + 0x28];      \
475         stw     %i3, [%g3 + TI_REG_WINDOW + 0x2c];      \
476         stw     %i4, [%g3 + TI_REG_WINDOW + 0x30];      \
477         stw     %i5, [%g3 + TI_REG_WINDOW + 0x34];      \
478         stw     %i6, [%g3 + TI_REG_WINDOW + 0x38];      \
479         stw     %i7, [%g3 + TI_REG_WINDOW + 0x3c];      \
480         add     %g1, 1, %g1;                            \
481         stb     %g1, [%g6 + TI_WSAVED];                 \
482         saved;                                          \
483         rdpr    %cwp, %g1;                              \
484         sub     %g1, 2, %g1;                            \
485         ba,pt   %xcc, etrap_save;                       \
486          wrpr   %g1, %cwp;                              \
487         nop; nop; nop
488
489 #define SPILL_1_NORMAL SPILL_1_GENERIC(ASI_AIUP)
490 #define SPILL_2_NORMAL SPILL_2_GENERIC(ASI_AIUP)
491 #define SPILL_3_NORMAL SPILL_0_NORMAL
492 #define SPILL_4_NORMAL SPILL_0_NORMAL
493 #define SPILL_5_NORMAL SPILL_0_NORMAL
494 #define SPILL_6_NORMAL SPILL_0_NORMAL
495 #define SPILL_7_NORMAL SPILL_0_NORMAL
496
497 #define SPILL_0_OTHER SPILL_0_NORMAL
498 #define SPILL_1_OTHER SPILL_1_GENERIC(ASI_AIUS)
499 #define SPILL_2_OTHER SPILL_2_GENERIC(ASI_AIUS)
500 #define SPILL_3_OTHER SPILL_3_NORMAL
501 #define SPILL_4_OTHER SPILL_4_NORMAL
502 #define SPILL_5_OTHER SPILL_5_NORMAL
503 #define SPILL_6_OTHER SPILL_6_NORMAL
504 #define SPILL_7_OTHER SPILL_7_NORMAL
505
506 /* Normal kernel fill */
507 #define FILL_0_NORMAL                                   \
508         ldx     [%sp + STACK_BIAS + 0x00], %l0;         \
509         ldx     [%sp + STACK_BIAS + 0x08], %l1;         \
510         ldx     [%sp + STACK_BIAS + 0x10], %l2;         \
511         ldx     [%sp + STACK_BIAS + 0x18], %l3;         \
512         ldx     [%sp + STACK_BIAS + 0x20], %l4;         \
513         ldx     [%sp + STACK_BIAS + 0x28], %l5;         \
514         ldx     [%sp + STACK_BIAS + 0x30], %l6;         \
515         ldx     [%sp + STACK_BIAS + 0x38], %l7;         \
516         ldx     [%sp + STACK_BIAS + 0x40], %i0;         \
517         ldx     [%sp + STACK_BIAS + 0x48], %i1;         \
518         ldx     [%sp + STACK_BIAS + 0x50], %i2;         \
519         ldx     [%sp + STACK_BIAS + 0x58], %i3;         \
520         ldx     [%sp + STACK_BIAS + 0x60], %i4;         \
521         ldx     [%sp + STACK_BIAS + 0x68], %i5;         \
522         ldx     [%sp + STACK_BIAS + 0x70], %i6;         \
523         ldx     [%sp + STACK_BIAS + 0x78], %i7;         \
524         restored; retry; nop; nop; nop; nop; nop; nop;  \
525         nop; nop; nop; nop; nop; nop; nop; nop;
526
527 #define FILL_0_NORMAL_RTRAP                             \
528 kern_rtt_fill:                                          \
529         rdpr    %cwp, %g1;                              \
530         sub     %g1, 1, %g1;                            \
531         wrpr    %g1, %cwp;                              \
532         ldx     [%sp + STACK_BIAS + 0x00], %l0;         \
533         ldx     [%sp + STACK_BIAS + 0x08], %l1;         \
534         ldx     [%sp + STACK_BIAS + 0x10], %l2;         \
535         ldx     [%sp + STACK_BIAS + 0x18], %l3;         \
536         ldx     [%sp + STACK_BIAS + 0x20], %l4;         \
537         ldx     [%sp + STACK_BIAS + 0x28], %l5;         \
538         ldx     [%sp + STACK_BIAS + 0x30], %l6;         \
539         ldx     [%sp + STACK_BIAS + 0x38], %l7;         \
540         ldx     [%sp + STACK_BIAS + 0x40], %i0;         \
541         ldx     [%sp + STACK_BIAS + 0x48], %i1;         \
542         ldx     [%sp + STACK_BIAS + 0x50], %i2;         \
543         ldx     [%sp + STACK_BIAS + 0x58], %i3;         \
544         ldx     [%sp + STACK_BIAS + 0x60], %i4;         \
545         ldx     [%sp + STACK_BIAS + 0x68], %i5;         \
546         ldx     [%sp + STACK_BIAS + 0x70], %i6;         \
547         ldx     [%sp + STACK_BIAS + 0x78], %i7;         \
548         restored;                                       \
549         add     %g1, 1, %g1;                            \
550         ba,pt   %xcc, kern_rtt_restore;                 \
551          wrpr   %g1, %cwp;                              \
552         nop; nop; nop; nop; nop;                        \
553         nop; nop; nop; nop;
554
555
556 /* Normal 64bit fill */
557 #define FILL_1_GENERIC(ASI)                             \
558         add     %sp, STACK_BIAS + 0x00, %g1;            \
559         ldxa    [%g1 + %g0] ASI, %l0;                   \
560         mov     0x08, %g2;                              \
561         mov     0x10, %g3;                              \
562         ldxa    [%g1 + %g2] ASI, %l1;                   \
563         mov     0x18, %g5;                              \
564         ldxa    [%g1 + %g3] ASI, %l2;                   \
565         ldxa    [%g1 + %g5] ASI, %l3;                   \
566         add     %g1, 0x20, %g1;                         \
567         ldxa    [%g1 + %g0] ASI, %l4;                   \
568         ldxa    [%g1 + %g2] ASI, %l5;                   \
569         ldxa    [%g1 + %g3] ASI, %l6;                   \
570         ldxa    [%g1 + %g5] ASI, %l7;                   \
571         add     %g1, 0x20, %g1;                         \
572         ldxa    [%g1 + %g0] ASI, %i0;                   \
573         ldxa    [%g1 + %g2] ASI, %i1;                   \
574         ldxa    [%g1 + %g3] ASI, %i2;                   \
575         ldxa    [%g1 + %g5] ASI, %i3;                   \
576         add     %g1, 0x20, %g1;                         \
577         ldxa    [%g1 + %g0] ASI, %i4;                   \
578         ldxa    [%g1 + %g2] ASI, %i5;                   \
579         ldxa    [%g1 + %g3] ASI, %i6;                   \
580         ldxa    [%g1 + %g5] ASI, %i7;                   \
581         restored;                                       \
582         retry; nop; nop; nop; nop;                      \
583         b,a,pt  %xcc, fill_fixup_dax;                   \
584         b,a,pt  %xcc, fill_fixup_mna;                   \
585         b,a,pt  %xcc, fill_fixup;
586
587 #define FILL_1_GENERIC_RTRAP                            \
588 user_rtt_fill_64bit:                                    \
589         ldxa    [%sp + STACK_BIAS + 0x00] %asi, %l0;    \
590         ldxa    [%sp + STACK_BIAS + 0x08] %asi, %l1;    \
591         ldxa    [%sp + STACK_BIAS + 0x10] %asi, %l2;    \
592         ldxa    [%sp + STACK_BIAS + 0x18] %asi, %l3;    \
593         ldxa    [%sp + STACK_BIAS + 0x20] %asi, %l4;    \
594         ldxa    [%sp + STACK_BIAS + 0x28] %asi, %l5;    \
595         ldxa    [%sp + STACK_BIAS + 0x30] %asi, %l6;    \
596         ldxa    [%sp + STACK_BIAS + 0x38] %asi, %l7;    \
597         ldxa    [%sp + STACK_BIAS + 0x40] %asi, %i0;    \
598         ldxa    [%sp + STACK_BIAS + 0x48] %asi, %i1;    \
599         ldxa    [%sp + STACK_BIAS + 0x50] %asi, %i2;    \
600         ldxa    [%sp + STACK_BIAS + 0x58] %asi, %i3;    \
601         ldxa    [%sp + STACK_BIAS + 0x60] %asi, %i4;    \
602         ldxa    [%sp + STACK_BIAS + 0x68] %asi, %i5;    \
603         ldxa    [%sp + STACK_BIAS + 0x70] %asi, %i6;    \
604         ldxa    [%sp + STACK_BIAS + 0x78] %asi, %i7;    \
605         ba,pt   %xcc, user_rtt_pre_restore;             \
606          restored;                                      \
607         nop; nop; nop; nop; nop; nop;                   \
608         nop; nop; nop; nop; nop;                        \
609         ba,a,pt %xcc, user_rtt_fill_fixup_dax;          \
610         ba,a,pt %xcc, user_rtt_fill_fixup_mna;          \
611         ba,a,pt %xcc, user_rtt_fill_fixup;
612
613
614 /* Normal 32bit fill */
615 #define FILL_2_GENERIC(ASI)                             \
616         and     %sp, 1, %g3;                            \
617         brnz,pn %g3, (. - (128 + 4));                   \
618          srl    %sp, 0, %sp;                            \
619         lduwa   [%sp + %g0] ASI, %l0;                   \
620         mov     0x04, %g2;                              \
621         mov     0x08, %g3;                              \
622         lduwa   [%sp + %g2] ASI, %l1;                   \
623         mov     0x0c, %g5;                              \
624         lduwa   [%sp + %g3] ASI, %l2;                   \
625         lduwa   [%sp + %g5] ASI, %l3;                   \
626         add     %sp, 0x10, %g1;                         \
627         lduwa   [%g1 + %g0] ASI, %l4;                   \
628         lduwa   [%g1 + %g2] ASI, %l5;                   \
629         lduwa   [%g1 + %g3] ASI, %l6;                   \
630         lduwa   [%g1 + %g5] ASI, %l7;                   \
631         add     %g1, 0x10, %g1;                         \
632         lduwa   [%g1 + %g0] ASI, %i0;                   \
633         lduwa   [%g1 + %g2] ASI, %i1;                   \
634         lduwa   [%g1 + %g3] ASI, %i2;                   \
635         lduwa   [%g1 + %g5] ASI, %i3;                   \
636         add     %g1, 0x10, %g1;                         \
637         lduwa   [%g1 + %g0] ASI, %i4;                   \
638         lduwa   [%g1 + %g2] ASI, %i5;                   \
639         lduwa   [%g1 + %g3] ASI, %i6;                   \
640         lduwa   [%g1 + %g5] ASI, %i7;                   \
641         restored;                                       \
642         retry; nop; nop;                                \
643         b,a,pt  %xcc, fill_fixup_dax;                   \
644         b,a,pt  %xcc, fill_fixup_mna;                   \
645         b,a,pt  %xcc, fill_fixup;
646
647 #define FILL_2_GENERIC_RTRAP                            \
648 user_rtt_fill_32bit:                                    \
649         and     %sp, 1, %g3;                            \
650         brnz,pn %g3, user_rtt_fill_64bit;               \
651          srl    %sp, 0, %sp;                            \
652         lduwa   [%sp + 0x00] %asi, %l0;                 \
653         lduwa   [%sp + 0x04] %asi, %l1;                 \
654         lduwa   [%sp + 0x08] %asi, %l2;                 \
655         lduwa   [%sp + 0x0c] %asi, %l3;                 \
656         lduwa   [%sp + 0x10] %asi, %l4;                 \
657         lduwa   [%sp + 0x14] %asi, %l5;                 \
658         lduwa   [%sp + 0x18] %asi, %l6;                 \
659         lduwa   [%sp + 0x1c] %asi, %l7;                 \
660         lduwa   [%sp + 0x20] %asi, %i0;                 \
661         lduwa   [%sp + 0x24] %asi, %i1;                 \
662         lduwa   [%sp + 0x28] %asi, %i2;                 \
663         lduwa   [%sp + 0x2c] %asi, %i3;                 \
664         lduwa   [%sp + 0x30] %asi, %i4;                 \
665         lduwa   [%sp + 0x34] %asi, %i5;                 \
666         lduwa   [%sp + 0x38] %asi, %i6;                 \
667         lduwa   [%sp + 0x3c] %asi, %i7;                 \
668         ba,pt   %xcc, user_rtt_pre_restore;             \
669          restored;                                      \
670         nop; nop; nop; nop; nop;                        \
671         nop; nop; nop;                                  \
672         ba,a,pt %xcc, user_rtt_fill_fixup_dax;          \
673         ba,a,pt %xcc, user_rtt_fill_fixup_mna;          \
674         ba,a,pt %xcc, user_rtt_fill_fixup;
675
676
677 #define FILL_1_NORMAL FILL_1_GENERIC(ASI_AIUP)
678 #define FILL_2_NORMAL FILL_2_GENERIC(ASI_AIUP)
679 #define FILL_3_NORMAL FILL_0_NORMAL
680 #define FILL_4_NORMAL FILL_0_NORMAL
681 #define FILL_5_NORMAL FILL_0_NORMAL
682 #define FILL_6_NORMAL FILL_0_NORMAL
683 #define FILL_7_NORMAL FILL_0_NORMAL
684
685 #define FILL_0_OTHER FILL_0_NORMAL
686 #define FILL_1_OTHER FILL_1_GENERIC(ASI_AIUS)
687 #define FILL_2_OTHER FILL_2_GENERIC(ASI_AIUS)
688 #define FILL_3_OTHER FILL_3_NORMAL
689 #define FILL_4_OTHER FILL_4_NORMAL
690 #define FILL_5_OTHER FILL_5_NORMAL
691 #define FILL_6_OTHER FILL_6_NORMAL
692 #define FILL_7_OTHER FILL_7_NORMAL
693
694 #endif /* !(_SPARC64_TTABLE_H) */