1 /* SPDX-License-Identifier: GPL-2.0 */ 1 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; 13 14 /* We need a "cleaned" instruction... */ 15 #define CLEAN_WINDOW 16 rdpr %cleanwin, %l0; add 17 wrpr %l0, 0x0, %cleanwin; 18 clr %o0; clr %o1; clr 19 clr %o4; clr %o5; clr 20 clr %l0; clr %l1; clr 21 clr %l4; clr %l5; clr 22 retry; 23 nop;nop;nop;nop;nop;nop;nop;nop;nop;no 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( 116 #else 117 #define LINUX_32BIT_SYSCALL_TRAP BTRAP(0x110) 118 #endif 119 #define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP( 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 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 179 add %l1, 4, %l2; 180 stx %l1, [%sp + PTREGS_OFF + PT_V9 181 ba,pt %xcc, rtrap; 182 stx %l2, [%sp + PTREGS_OFF + PT_V9 183 184 #ifdef CONFIG_KPROBES 185 #define KPROBES_TRAP(lvl) TRAP_IRQ(kprobe_trap 186 #else 187 #define KPROBES_TRAP(lvl) TRAP_ARG(bad_trap, l 188 #endif 189 190 #ifdef CONFIG_UPROBES 191 #define UPROBES_TRAP(lvl) TRAP_ARG(uprobe_trap 192 #else 193 #define UPROBES_TRAP(lvl) TRAP_ARG(bad_trap, l 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] 205 ldx [%g2 + HV_FAULT_I_CTX_OFFSET], 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] 215 ldx [%g2 + HV_FAULT_D_CTX_OFFSET], 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] 225 ldx [%g2 + HV_FAULT_D_CTX_OFFSET], 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 233 * see how arch/sparc64/kernel/winfixup.S work 234 * 235 * For the user cases we used to use the %asi 236 * it turns out that the "wr xxx, %asi" costs 237 * now we use immediate ASI loads and stores i 238 * to Greg Onufer for pointing out this perfor 239 * 240 * Further note that we cannot use the g2, g4, 241 * globals in the spill routines, check out th 242 * arch/sparc64/kernel/etrap.S to see what I m 243 * g4/g5 are the globals which are preserved b 244 * for the caller of it. The g7 register is t 245 * etrap. Finally, g6 is the current thread r 246 * us it in the spill handlers either. Most o 247 * apply to fill processing, only g6 is not us 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; 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] 332 stxa %l1, [%sp + STACK_BIAS + 0x08] 333 stxa %l2, [%sp + STACK_BIAS + 0x10] 334 stxa %l3, [%sp + STACK_BIAS + 0x18] 335 stxa %l4, [%sp + STACK_BIAS + 0x20] 336 stxa %l5, [%sp + STACK_BIAS + 0x28] 337 stxa %l6, [%sp + STACK_BIAS + 0x30] 338 stxa %l7, [%sp + STACK_BIAS + 0x38] 339 stxa %i0, [%sp + STACK_BIAS + 0x40] 340 stxa %i1, [%sp + STACK_BIAS + 0x48] 341 stxa %i2, [%sp + STACK_BIAS + 0x50] 342 stxa %i3, [%sp + STACK_BIAS + 0x58] 343 stxa %i4, [%sp + STACK_BIAS + 0x60] 344 stxa %i5, [%sp + STACK_BIAS + 0x68] 345 stxa %i6, [%sp + STACK_BIAS + 0x70] 346 stxa %i7, [%sp + STACK_BIAS + 0x78] 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 + 0x 366 stx %l1, [%g3 + TI_REG_WINDOW + 0x 367 stx %l2, [%g3 + TI_REG_WINDOW + 0x 368 stx %l3, [%g3 + TI_REG_WINDOW + 0x 369 stx %l4, [%g3 + TI_REG_WINDOW + 0x 370 stx %l5, [%g3 + TI_REG_WINDOW + 0x 371 stx %l6, [%g3 + TI_REG_WINDOW + 0x 372 stx %l7, [%g3 + TI_REG_WINDOW + 0x 373 stx %i0, [%g3 + TI_REG_WINDOW + 0x 374 stx %i1, [%g3 + TI_REG_WINDOW + 0x 375 stx %i2, [%g3 + TI_REG_WINDOW + 0x 376 stx %i3, [%g3 + TI_REG_WINDOW + 0x 377 stx %i4, [%g3 + TI_REG_WINDOW + 0x 378 stx %i5, [%g3 + TI_REG_WINDOW + 0x 379 stx %i6, [%g3 + TI_REG_WINDOW + 0x 380 stx %i7, [%g3 + TI_REG_WINDOW + 0x 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 + 0x 465 stw %l1, [%g3 + TI_REG_WINDOW + 0x 466 stw %l2, [%g3 + TI_REG_WINDOW + 0x 467 stw %l3, [%g3 + TI_REG_WINDOW + 0x 468 stw %l4, [%g3 + TI_REG_WINDOW + 0x 469 stw %l5, [%g3 + TI_REG_WINDOW + 0x 470 stw %l6, [%g3 + TI_REG_WINDOW + 0x 471 stw %l7, [%g3 + TI_REG_WINDOW + 0x 472 stw %i0, [%g3 + TI_REG_WINDOW + 0x 473 stw %i1, [%g3 + TI_REG_WINDOW + 0x 474 stw %i2, [%g3 + TI_REG_WINDOW + 0x 475 stw %i3, [%g3 + TI_REG_WINDOW + 0x 476 stw %i4, [%g3 + TI_REG_WINDOW + 0x 477 stw %i5, [%g3 + TI_REG_WINDOW + 0x 478 stw %i6, [%g3 + TI_REG_WINDOW + 0x 479 stw %i7, [%g3 + TI_REG_WINDOW + 0x 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_AIU 490 #define SPILL_2_NORMAL SPILL_2_GENERIC(ASI_AIU 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; n 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 590 ldxa [%sp + STACK_BIAS + 0x08] %asi 591 ldxa [%sp + STACK_BIAS + 0x10] %asi 592 ldxa [%sp + STACK_BIAS + 0x18] %asi 593 ldxa [%sp + STACK_BIAS + 0x20] %asi 594 ldxa [%sp + STACK_BIAS + 0x28] %asi 595 ldxa [%sp + STACK_BIAS + 0x30] %asi 596 ldxa [%sp + STACK_BIAS + 0x38] %asi 597 ldxa [%sp + STACK_BIAS + 0x40] %asi 598 ldxa [%sp + STACK_BIAS + 0x48] %asi 599 ldxa [%sp + STACK_BIAS + 0x50] %asi 600 ldxa [%sp + STACK_BIAS + 0x58] %asi 601 ldxa [%sp + STACK_BIAS + 0x60] %asi 602 ldxa [%sp + STACK_BIAS + 0x68] %asi 603 ldxa [%sp + STACK_BIAS + 0x70] %asi 604 ldxa [%sp + STACK_BIAS + 0x78] %asi 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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.