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