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