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) */ 695