root/arch/sparc/include/asm/ttable.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */