ttable.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: ttable.h,v 1.17 2001/11/28 23:32:16 davem Exp $ */
  2. #ifndef _SPARC64_TTABLE_H
  3. #define _SPARC64_TTABLE_H
  4. #include <linux/config.h>
  5. #include <asm/asm_offsets.h>
  6. #include <asm/utrap.h>
  7. #define BOOT_KERNEL b sparc64_boot; nop; nop; nop; nop; nop; nop; nop;
  8. /* We need a "cleaned" instruction... */
  9. #define CLEAN_WINDOW
  10. rdpr %cleanwin, %l0; add %l0, 1, %l0;
  11. wrpr %l0, 0x0, %cleanwin;
  12. clr %o0; clr %o1; clr %o2; clr %o3;
  13. clr %o4; clr %o5; clr %o6; clr %o7;
  14. clr %l0; clr %l1; clr %l2; clr %l3;
  15. clr %l4; clr %l5; clr %l6; clr %l7;
  16. retry;
  17. nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  18. #define TRAP(routine)
  19. sethi %hi(109f), %g7;
  20. ba,pt %xcc, etrap;
  21. 109:  or %g7, %lo(109b), %g7;
  22. call routine;
  23.  add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  24. ba,pt %xcc, rtrap;
  25.  clr %l6;
  26. nop;
  27. #define TRAP_7INSNS(routine)
  28. sethi %hi(109f), %g7;
  29. ba,pt %xcc, etrap;
  30. 109:  or %g7, %lo(109b), %g7;
  31. call routine;
  32.  add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  33. ba,pt %xcc, rtrap;
  34.  clr %l6;
  35. #define TRAP_SAVEFPU(routine)
  36. sethi %hi(109f), %g7;
  37. ba,pt %xcc, do_fptrap;
  38. 109:  or %g7, %lo(109b), %g7;
  39. call routine;
  40.  add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  41. ba,pt %xcc, rtrap;
  42.  clr %l6;
  43. nop;
  44. #define TRAP_NOSAVE(routine)
  45. ba,pt %xcc, routine;
  46.  nop;
  47. nop; nop; nop; nop; nop; nop;
  48. #define TRAP_NOSAVE_7INSNS(routine)
  49. ba,pt %xcc, routine;
  50.  nop;
  51. nop; nop; nop; nop; nop;
  52. #define TRAPTL1(routine)
  53. sethi %hi(109f), %g7;
  54. ba,pt %xcc, etraptl1;
  55. 109:  or %g7, %lo(109b), %g7;
  56. call routine;
  57.  add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  58. ba,pt %xcc, rtrap;
  59.  clr %l6;
  60. nop;
  61. #define TRAP_ARG(routine, arg)
  62. sethi %hi(109f), %g7;
  63. ba,pt %xcc, etrap;
  64. 109:  or %g7, %lo(109b), %g7;
  65. add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  66. call routine;
  67.  mov arg, %o1;
  68. ba,pt %xcc, rtrap;
  69.  clr %l6;
  70. #define TRAPTL1_ARG(routine, arg)
  71. sethi %hi(109f), %g7;
  72. ba,pt %xcc, etraptl1;
  73. 109:  or %g7, %lo(109b), %g7;
  74. add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  75. call routine;
  76.  mov arg, %o1;
  77. ba,pt %xcc, rtrap;
  78.  clr %l6;
  79. #define SYSCALL_TRAP(routine, systbl)
  80. sethi %hi(109f), %g7;
  81. ba,pt %xcc, scetrap;
  82. 109:  or %g7, %lo(109b), %g7;
  83. ba,pt %xcc, routine;
  84.  sethi %hi(systbl), %l7;
  85. nop; nop; nop;
  86. #define INDIRECT_SOLARIS_SYSCALL(num)
  87. sethi %hi(109f), %g7;
  88. ba,pt %xcc, etrap;
  89. 109:  or %g7, %lo(109b), %g7;
  90. ba,pt %xcc, tl0_solaris + 0xc;
  91.  mov num, %g1;
  92. nop;nop;nop;
  93. #define TRAP_UTRAP(handler,lvl)
  94. ldx [%g6 + AOFF_task_thread + AOFF_thread_utraps], %g1;
  95. sethi %hi(109f), %g7;
  96. brz,pn %g1, utrap;
  97.  or %g7, %lo(109f), %g7;
  98. ba,pt %xcc, utrap;
  99. 109:  ldx [%g1 + handler*8], %g1;
  100. ba,pt %xcc, utrap_ill;
  101.  mov lvl, %o1;
  102. #ifdef CONFIG_SUNOS_EMUL
  103. #define SUNOS_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sunos_sys_table)
  104. #else
  105. #define SUNOS_SYSCALL_TRAP TRAP(sunos_syscall)
  106. #endif
  107. #define LINUX_32BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sys_call_table32)
  108. #define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall, sys_call_table64)
  109. #define GETCC_TRAP TRAP(getcc)
  110. #define SETCC_TRAP TRAP(setcc)
  111. #ifdef CONFIG_SOLARIS_EMUL
  112. #define SOLARIS_SYSCALL_TRAP TRAP(solaris_sparc_syscall)
  113. #else
  114. #define SOLARIS_SYSCALL_TRAP TRAP(solaris_syscall)
  115. #endif
  116. /* FIXME: Write these actually */
  117. #define NETBSD_SYSCALL_TRAP TRAP(netbsd_syscall)
  118. #define BREAKPOINT_TRAP TRAP(breakpoint_trap)
  119. #define TRAP_IRQ(routine, level)
  120. rdpr %pil, %g2;
  121. wrpr %g0, 15, %pil;
  122. b,pt %xcc, etrap_irq;
  123.  rd %pc, %g7;
  124. mov level, %o0;
  125. call routine;
  126.  add %sp, STACK_BIAS + REGWIN_SZ, %o1;
  127. ba,a,pt %xcc, rtrap_clr_l6;
  128. #define TICK_SMP_IRQ
  129. rdpr %pil, %g2;
  130. wrpr %g0, 15, %pil;
  131. sethi %hi(109f), %g7;
  132. b,pt %xcc, etrap_irq;
  133. 109:  or %g7, %lo(109b), %g7;
  134. call smp_percpu_timer_interrupt;
  135.  add %sp, STACK_BIAS + REGWIN_SZ, %o0;
  136. ba,a,pt %xcc, rtrap_clr_l6;
  137. #define TRAP_IVEC TRAP_NOSAVE(do_ivec)
  138. #define BTRAP(lvl) TRAP_ARG(bad_trap, lvl)
  139. #define BTRAPTL1(lvl) TRAPTL1_ARG(bad_trap_tl1, lvl)
  140. #define FLUSH_WINDOW_TRAP
  141. ba,pt %xcc, etrap;
  142.  rd %pc, %g7;
  143. flushw;
  144. ldx [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC], %l1;
  145. add %l1, 4, %l2;
  146. stx %l1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TPC];
  147. ba,pt %xcc, rtrap_clr_l6;
  148.  stx %l2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_TNPC];
  149.         
  150. /* Before touching these macros, you owe it to yourself to go and
  151.  * see how arch/sparc64/kernel/winfixup.S works... -DaveM
  152.  *
  153.  * For the user cases we used to use the %asi register, but
  154.  * it turns out that the "wr xxx, %asi" costs ~5 cycles, so
  155.  * now we use immediate ASI loads and stores instead.  Kudos
  156.  * to Greg Onufer for pointing out this performance anomaly.
  157.  *
  158.  * Further note that we cannot use the g2, g4, g5, and g7 alternate
  159.  * globals in the spill routines, check out the save instruction in
  160.  * arch/sparc64/kernel/etrap.S to see what I mean about g2, and
  161.  * g4/g5 are the globals which are preserved by etrap processing
  162.  * for the caller of it.  The g7 register is the return pc for
  163.  * etrap.  Finally, g6 is the current thread register so we cannot
  164.  * us it in the spill handlers either.  Most of these rules do not
  165.  * apply to fill processing, only g6 is not usable.
  166.  */
  167. /* Normal kernel spill */
  168. #define SPILL_0_NORMAL
  169. stx %l0, [%sp + STACK_BIAS + 0x00];
  170. stx %l1, [%sp + STACK_BIAS + 0x08];
  171. stx %l2, [%sp + STACK_BIAS + 0x10];
  172. stx %l3, [%sp + STACK_BIAS + 0x18];
  173. stx %l4, [%sp + STACK_BIAS + 0x20];
  174. stx %l5, [%sp + STACK_BIAS + 0x28];
  175. stx %l6, [%sp + STACK_BIAS + 0x30];
  176. stx %l7, [%sp + STACK_BIAS + 0x38];
  177. stx %i0, [%sp + STACK_BIAS + 0x40];
  178. stx %i1, [%sp + STACK_BIAS + 0x48];
  179. stx %i2, [%sp + STACK_BIAS + 0x50];
  180. stx %i3, [%sp + STACK_BIAS + 0x58];
  181. stx %i4, [%sp + STACK_BIAS + 0x60];
  182. stx %i5, [%sp + STACK_BIAS + 0x68];
  183. stx %i6, [%sp + STACK_BIAS + 0x70];
  184. stx %i7, [%sp + STACK_BIAS + 0x78];
  185. saved; retry; nop; nop; nop; nop; nop; nop;
  186. nop; nop; nop; nop; nop; nop; nop; nop;
  187. /* Normal 64bit spill */
  188. #define SPILL_1_GENERIC(ASI)
  189. add %sp, STACK_BIAS + 0x00, %g1;
  190. stxa %l0, [%g1 + %g0] ASI;
  191. mov 0x08, %g3;
  192. stxa %l1, [%g1 + %g3] ASI;
  193. add %g1, 0x10, %g1;
  194. stxa %l2, [%g1 + %g0] ASI;
  195. stxa %l3, [%g1 + %g3] ASI;
  196. add %g1, 0x10, %g1;
  197. stxa %l4, [%g1 + %g0] ASI;
  198. stxa %l5, [%g1 + %g3] ASI;
  199. add %g1, 0x10, %g1;
  200. stxa %l6, [%g1 + %g0] ASI;
  201. stxa %l7, [%g1 + %g3] ASI;
  202. add %g1, 0x10, %g1;
  203. stxa %i0, [%g1 + %g0] ASI;
  204. stxa %i1, [%g1 + %g3] ASI;
  205. add %g1, 0x10, %g1;
  206. stxa %i2, [%g1 + %g0] ASI;
  207. stxa %i3, [%g1 + %g3] ASI;
  208. add %g1, 0x10, %g1;
  209. stxa %i4, [%g1 + %g0] ASI;
  210. stxa %i5, [%g1 + %g3] ASI;
  211. add %g1, 0x10, %g1;
  212. stxa %i6, [%g1 + %g0] ASI;
  213. stxa %i7, [%g1 + %g3] ASI;
  214. saved;
  215. retry; nop; nop;
  216. b,a,pt %xcc, spill_fixup_dax;
  217. b,a,pt %xcc, spill_fixup_mna;
  218. b,a,pt %xcc, spill_fixup;
  219. /* Normal 32bit spill */
  220. #define SPILL_2_GENERIC(ASI)
  221. srl %sp, 0, %sp;
  222. stwa %l0, [%sp + %g0] ASI;
  223. mov 0x04, %g3;
  224. stwa %l1, [%sp + %g3] ASI;
  225. add %sp, 0x08, %g1;
  226. stwa %l2, [%g1 + %g0] ASI;
  227. stwa %l3, [%g1 + %g3] ASI;
  228. add %g1, 0x08, %g1;
  229. stwa %l4, [%g1 + %g0] ASI;
  230. stwa %l5, [%g1 + %g3] ASI;
  231. add %g1, 0x08, %g1;
  232. stwa %l6, [%g1 + %g0] ASI;
  233. stwa %l7, [%g1 + %g3] ASI;
  234. add %g1, 0x08, %g1;
  235. stwa %i0, [%g1 + %g0] ASI;
  236. stwa %i1, [%g1 + %g3] ASI;
  237. add %g1, 0x08, %g1;
  238. stwa %i2, [%g1 + %g0] ASI;
  239. stwa %i3, [%g1 + %g3] ASI;
  240. add %g1, 0x08, %g1;
  241. stwa %i4, [%g1 + %g0] ASI;
  242. stwa %i5, [%g1 + %g3] ASI;
  243. add %g1, 0x08, %g1;
  244. stwa %i6, [%g1 + %g0] ASI;
  245. stwa %i7, [%g1 + %g3] ASI;
  246. saved;
  247.         retry; nop; nop;
  248. b,a,pt %xcc, spill_fixup_dax;
  249. b,a,pt %xcc, spill_fixup_mna;
  250. b,a,pt %xcc, spill_fixup;
  251. #define SPILL_1_NORMAL SPILL_1_GENERIC(ASI_AIUP)
  252. #define SPILL_2_NORMAL SPILL_2_GENERIC(ASI_AIUP)
  253. #define SPILL_3_NORMAL SPILL_0_NORMAL
  254. #define SPILL_4_NORMAL SPILL_0_NORMAL
  255. #define SPILL_5_NORMAL SPILL_0_NORMAL
  256. #define SPILL_6_NORMAL SPILL_0_NORMAL
  257. #define SPILL_7_NORMAL SPILL_0_NORMAL
  258. #define SPILL_0_OTHER SPILL_0_NORMAL
  259. #define SPILL_1_OTHER SPILL_1_GENERIC(ASI_AIUS)
  260. #define SPILL_2_OTHER SPILL_2_GENERIC(ASI_AIUS)
  261. #define SPILL_3_OTHER SPILL_3_NORMAL
  262. #define SPILL_4_OTHER SPILL_4_NORMAL
  263. #define SPILL_5_OTHER SPILL_5_NORMAL
  264. #define SPILL_6_OTHER SPILL_6_NORMAL
  265. #define SPILL_7_OTHER SPILL_7_NORMAL
  266. /* Normal kernel fill */
  267. #define FILL_0_NORMAL
  268. ldx [%sp + STACK_BIAS + 0x00], %l0;
  269. ldx [%sp + STACK_BIAS + 0x08], %l1;
  270. ldx [%sp + STACK_BIAS + 0x10], %l2;
  271. ldx [%sp + STACK_BIAS + 0x18], %l3;
  272. ldx [%sp + STACK_BIAS + 0x20], %l4;
  273. ldx [%sp + STACK_BIAS + 0x28], %l5;
  274. ldx [%sp + STACK_BIAS + 0x30], %l6;
  275. ldx [%sp + STACK_BIAS + 0x38], %l7;
  276. ldx [%sp + STACK_BIAS + 0x40], %i0;
  277. ldx [%sp + STACK_BIAS + 0x48], %i1;
  278. ldx [%sp + STACK_BIAS + 0x50], %i2;
  279. ldx [%sp + STACK_BIAS + 0x58], %i3;
  280. ldx [%sp + STACK_BIAS + 0x60], %i4;
  281. ldx [%sp + STACK_BIAS + 0x68], %i5;
  282. ldx [%sp + STACK_BIAS + 0x70], %i6;
  283. ldx [%sp + STACK_BIAS + 0x78], %i7;
  284. restored; retry; nop; nop; nop; nop; nop; nop;
  285. nop; nop; nop; nop; nop; nop; nop; nop;
  286. /* Normal 64bit fill */
  287. #define FILL_1_GENERIC(ASI)
  288. add %sp, STACK_BIAS + 0x00, %g1;
  289. ldxa [%g1 + %g0] ASI, %l0;
  290. mov 0x08, %g2;
  291. mov 0x10, %g3;
  292. ldxa [%g1 + %g2] ASI, %l1;
  293. mov 0x18, %g5;
  294. ldxa [%g1 + %g3] ASI, %l2;
  295. ldxa [%g1 + %g5] ASI, %l3;
  296. add %g1, 0x20, %g1;
  297. ldxa [%g1 + %g0] ASI, %l4;
  298. ldxa [%g1 + %g2] ASI, %l5;
  299. ldxa [%g1 + %g3] ASI, %l6;
  300. ldxa [%g1 + %g5] ASI, %l7;
  301. add %g1, 0x20, %g1;
  302. ldxa [%g1 + %g0] ASI, %i0;
  303. ldxa [%g1 + %g2] ASI, %i1;
  304. ldxa [%g1 + %g3] ASI, %i2;
  305. ldxa [%g1 + %g5] ASI, %i3;
  306. add %g1, 0x20, %g1;
  307. ldxa [%g1 + %g0] ASI, %i4;
  308. ldxa [%g1 + %g2] ASI, %i5;
  309. ldxa [%g1 + %g3] ASI, %i6;
  310. ldxa [%g1 + %g5] ASI, %i7;
  311. restored;
  312. retry; nop; nop; nop; nop;
  313. b,a,pt %xcc, fill_fixup_dax;
  314. b,a,pt %xcc, fill_fixup_mna;
  315. b,a,pt %xcc, fill_fixup;
  316. /* Normal 32bit fill */
  317. #define FILL_2_GENERIC(ASI)
  318. srl %sp, 0, %sp;
  319. lduwa [%sp + %g0] ASI, %l0;
  320. mov 0x04, %g2;
  321. mov 0x08, %g3;
  322. lduwa [%sp + %g2] ASI, %l1;
  323. mov 0x0c, %g5;
  324. lduwa [%sp + %g3] ASI, %l2;
  325. lduwa [%sp + %g5] ASI, %l3;
  326. add %sp, 0x10, %g1;
  327. lduwa [%g1 + %g0] ASI, %l4;
  328. lduwa [%g1 + %g2] ASI, %l5;
  329. lduwa [%g1 + %g3] ASI, %l6;
  330. lduwa [%g1 + %g5] ASI, %l7;
  331. add %g1, 0x10, %g1;
  332. lduwa [%g1 + %g0] ASI, %i0;
  333. lduwa [%g1 + %g2] ASI, %i1;
  334. lduwa [%g1 + %g3] ASI, %i2;
  335. lduwa [%g1 + %g5] ASI, %i3;
  336. add %g1, 0x10, %g1;
  337. lduwa [%g1 + %g0] ASI, %i4;
  338. lduwa [%g1 + %g2] ASI, %i5;
  339. lduwa [%g1 + %g3] ASI, %i6;
  340. lduwa [%g1 + %g5] ASI, %i7;
  341. restored;
  342. retry; nop; nop; nop; nop;
  343. b,a,pt %xcc, fill_fixup_dax;
  344. b,a,pt %xcc, fill_fixup_mna;
  345. b,a,pt %xcc, fill_fixup;
  346. #define FILL_1_NORMAL FILL_1_GENERIC(ASI_AIUP)
  347. #define FILL_2_NORMAL FILL_2_GENERIC(ASI_AIUP)
  348. #define FILL_3_NORMAL FILL_0_NORMAL
  349. #define FILL_4_NORMAL FILL_0_NORMAL
  350. #define FILL_5_NORMAL FILL_0_NORMAL
  351. #define FILL_6_NORMAL FILL_0_NORMAL
  352. #define FILL_7_NORMAL FILL_0_NORMAL
  353. #define FILL_0_OTHER FILL_0_NORMAL
  354. #define FILL_1_OTHER FILL_1_GENERIC(ASI_AIUS)
  355. #define FILL_2_OTHER FILL_2_GENERIC(ASI_AIUS)
  356. #define FILL_3_OTHER FILL_3_NORMAL
  357. #define FILL_4_OTHER FILL_4_NORMAL
  358. #define FILL_5_OTHER FILL_5_NORMAL
  359. #define FILL_6_OTHER FILL_6_NORMAL
  360. #define FILL_7_OTHER FILL_7_NORMAL
  361. #endif /* !(_SPARC64_TTABLE_H) */