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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: etrap.S,v 1.45 2001/09/07 21:04:40 kanoj Exp $
  2.  * etrap.S: Preparing for entry into the kernel on Sparc V9.
  3.  *
  4.  * Copyright (C) 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
  5.  * Copyright (C) 1997, 1998, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  6.  */
  7. #include <asm/asi.h>
  8. #include <asm/pstate.h>
  9. #include <asm/ptrace.h>
  10. #include <asm/page.h>
  11. #include <asm/spitfire.h>
  12. #include <asm/head.h>
  13. #include <asm/processor.h>
  14. #define TASK_REGOFF (THREAD_SIZE-TRACEREG_SZ-REGWIN_SZ)
  15. #define ETRAP_PSTATE1 (PSTATE_RMO | PSTATE_PRIV)
  16. #define ETRAP_PSTATE2 (PSTATE_RMO | PSTATE_PEF | PSTATE_PRIV | PSTATE_IE)
  17. /*
  18.  * On entry, %g7 is return address - 0x4.
  19.  * %g4 and %g5 will be preserved %l4 and %l5 respectively.
  20.  */
  21. .text
  22. .align 64
  23. .globl etrap, etrap_irq, etraptl1
  24. etrap: rdpr %pil, %g2 ! Single  Group
  25. etrap_irq: rdpr %tstate, %g1 ! Single  Group
  26. sllx %g2, 20, %g3 ! IEU0 Group
  27. andcc %g1, TSTATE_PRIV, %g0 ! IEU1
  28. or %g1, %g3, %g1 ! IEU0 Group
  29. bne,pn %xcc, 1f ! CTI
  30.  sub %sp, REGWIN_SZ+TRACEREG_SZ-STACK_BIAS, %g2 ! IEU1
  31. wrpr %g0, 7, %cleanwin ! Single Group+4bubbles
  32. sethi %hi(TASK_REGOFF), %g2 ! IEU0 Group
  33. sethi %hi(TSTATE_PEF), %g3 ! IEU1
  34. or %g2, %lo(TASK_REGOFF), %g2 ! IEU0 Group
  35. and %g1, %g3, %g3 ! IEU1
  36. brnz,pn %g3, 1f ! CTI+IEU1 Group
  37.  add %g6, %g2, %g2 ! IEU0
  38. wr %g0, 0, %fprs ! Single Group+4bubbles
  39. 1: rdpr %tpc, %g3 ! Single Group
  40. stx %g1, [%g2 + REGWIN_SZ + PT_V9_TSTATE] ! Store Group
  41. rdpr %tnpc, %g1 ! Single Group
  42. stx %g3, [%g2 + REGWIN_SZ + PT_V9_TPC] ! Store Group
  43. rd %y, %g3 ! Single Group+4bubbles
  44. stx %g1, [%g2 + REGWIN_SZ + PT_V9_TNPC] ! Store Group
  45. st %g3, [%g2 + REGWIN_SZ + PT_V9_Y] ! Store Group
  46. save %g2, -STACK_BIAS, %sp ! Ordering here is critical ! Single Group
  47. mov %g6, %l6 ! IEU0 Group
  48. bne,pn %xcc, 3f ! CTI
  49.  mov PRIMARY_CONTEXT, %l4 ! IEU1
  50. rdpr %canrestore, %g3 ! Single Group+4bubbles
  51. rdpr %wstate, %g2 ! Single Group+4bubbles
  52. wrpr %g0, 0, %canrestore ! Single Group+4bubbles
  53. sll %g2, 3, %g2 ! IEU0 Group
  54. mov 1, %l5 ! IEU1
  55. stb %l5, [%l6 + AOFF_task_thread + AOFF_thread_fpdepth] ! Store
  56. wrpr %g3, 0, %otherwin ! Single Group+4bubbles
  57. wrpr %g2, 0, %wstate ! Single Group+4bubbles
  58. stxa %g0, [%l4] ASI_DMMU ! Store Group
  59. flush %l6 ! Single Group+9bubbles
  60. wr %g0, ASI_AIUS, %asi ! Single Group+4bubbles
  61. 2: wrpr %g0, 0x0, %tl ! Single Group+4bubbles
  62. mov %g4, %l4 ! IEU1
  63. mov %g5, %l5 ! IEU0 Group
  64. mov %g7, %l2 ! IEU1
  65. wrpr %g0, ETRAP_PSTATE1, %pstate ! Single Group+4bubbles
  66. stx %g1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G1] ! Store Group
  67. stx %g2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G2] ! Store Group
  68. stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G3] ! Store Group
  69. stx %g4, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G4] ! Store Group
  70. stx %g5, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G5] ! Store Group
  71. stx %g6, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G6] ! Store Group
  72. stx %g7, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G7] ! Store Group
  73. stx %i0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0] ! Store Group
  74. stx %i1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1] ! Store Group
  75. stx %i2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I2] ! Store Group
  76. stx %i3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I3] ! Store Group
  77. stx %i4, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I4] ! Store Group
  78. sethi %uhi(PAGE_OFFSET), %g4 ! IEU0
  79. stx %i5, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I5] ! Store Group
  80. stx %i6, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I6] ! Store Group
  81. sllx %g4, 32, %g4 ! IEU0
  82. stx %i7, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I7] ! Store Group
  83. wrpr %g0, ETRAP_PSTATE2, %pstate ! Single Group+4bubbles
  84. jmpl %l2 + 0x4, %g0 ! CTI Group
  85.  mov %l6, %g6 ! IEU0
  86. nop
  87. nop
  88. 3: ldub [%l6 + AOFF_task_thread + AOFF_thread_fpdepth], %l5 ! Load Group
  89. add %l6, AOFF_task_thread + AOFF_thread_fpsaved + 1, %l4 ! IEU0
  90. srl %l5, 1, %l3 ! IEU0 Group
  91. add %l5, 2, %l5 ! IEU1
  92. stb %l5, [%l6 + AOFF_task_thread + AOFF_thread_fpdepth] ! Store
  93. ba,pt %xcc, 2b ! CTI
  94.  stb %g0, [%l4 + %l3] ! Store Group
  95. nop
  96. etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself.
  97.  * We place this right after pt_regs on the trap stack.  The layout
  98.  * is:
  99.  * 0x00 TL1's TSTATE
  100.  * 0x08 TL1's TPC
  101.  * 0x10 TL1's TNPC
  102.  * 0x18 TL1's TT
  103.  *  ...
  104.  * 0x58 TL4's TT
  105.  * 0x60 TL
  106.  */
  107. sub %sp, ((4 * 8) * 4) + 8, %g2
  108. rdpr %tl, %g1
  109. wrpr %g0, 1, %tl
  110. rdpr %tstate, %g3
  111. stx %g3, [%g2 + STACK_BIAS + 0x00]
  112. rdpr %tpc, %g3
  113. stx %g3, [%g2 + STACK_BIAS + 0x08]
  114. rdpr %tnpc, %g3
  115. stx %g3, [%g2 + STACK_BIAS + 0x10]
  116. rdpr %tt, %g3
  117. stx %g3, [%g2 + STACK_BIAS + 0x18]
  118. wrpr %g0, 2, %tl
  119. rdpr %tstate, %g3
  120. stx %g3, [%g2 + STACK_BIAS + 0x20]
  121. rdpr %tpc, %g3
  122. stx %g3, [%g2 + STACK_BIAS + 0x28]
  123. rdpr %tnpc, %g3
  124. stx %g3, [%g2 + STACK_BIAS + 0x30]
  125. rdpr %tt, %g3
  126. stx %g3, [%g2 + STACK_BIAS + 0x38]
  127. wrpr %g0, 3, %tl
  128. rdpr %tstate, %g3
  129. stx %g3, [%g2 + STACK_BIAS + 0x40]
  130. rdpr %tpc, %g3
  131. stx %g3, [%g2 + STACK_BIAS + 0x48]
  132. rdpr %tnpc, %g3
  133. stx %g3, [%g2 + STACK_BIAS + 0x50]
  134. rdpr %tt, %g3
  135. stx %g3, [%g2 + STACK_BIAS + 0x58]
  136. wrpr %g0, 4, %tl
  137. rdpr %tstate, %g3
  138. stx %g3, [%g2 + STACK_BIAS + 0x60]
  139. rdpr %tpc, %g3
  140. stx %g3, [%g2 + STACK_BIAS + 0x68]
  141. rdpr %tnpc, %g3
  142. stx %g3, [%g2 + STACK_BIAS + 0x70]
  143. rdpr %tt, %g3
  144. stx %g3, [%g2 + STACK_BIAS + 0x78]
  145. wrpr %g1, %tl
  146. stx %g1, [%g2 + STACK_BIAS + 0x80]
  147. rdpr %tstate, %g1 ! Single Group+4bubbles
  148. sub %g2, REGWIN_SZ + TRACEREG_SZ - STACK_BIAS, %g2 ! IEU1
  149. ba,pt %xcc, 1b ! CTI Group
  150.  andcc %g1, TSTATE_PRIV, %g0 ! IEU0
  151. .align 64
  152. .globl scetrap
  153. scetrap: rdpr %pil, %g2 ! Single  Group
  154. rdpr %tstate, %g1 ! Single  Group
  155. sllx %g2, 20, %g3 ! IEU0 Group
  156. andcc %g1, TSTATE_PRIV, %g0 ! IEU1
  157. or %g1, %g3, %g1 ! IEU0 Group
  158. bne,pn %xcc, 1f ! CTI
  159.  sub %sp, (REGWIN_SZ+TRACEREG_SZ-STACK_BIAS), %g2 ! IEU1
  160. wrpr %g0, 7, %cleanwin ! Single Group+4bubbles
  161. sllx %g1, 51, %g3 ! IEU0 Group
  162. sethi %hi(TASK_REGOFF), %g2 ! IEU1
  163. or %g2, %lo(TASK_REGOFF), %g2 ! IEU0 Group
  164. brlz,pn %g3, 1f ! CTI+IEU1
  165.  add %g6, %g2, %g2 ! IEU0 Group
  166. wr %g0, 0, %fprs ! Single Group+4bubbles
  167. 1: rdpr %tpc, %g3 ! Single Group
  168. stx %g1, [%g2 + REGWIN_SZ + PT_V9_TSTATE] ! Store Group
  169. rdpr %tnpc, %g1 ! Single Group
  170. stx %g3, [%g2 + REGWIN_SZ + PT_V9_TPC] ! Store Group
  171. stx %g1, [%g2 + REGWIN_SZ + PT_V9_TNPC] ! Store Group
  172. save %g2, -STACK_BIAS, %sp ! Ordering here is critical ! Single Group
  173. mov %g6, %l6 ! IEU0 Group
  174. bne,pn %xcc, 2f ! CTI
  175.  mov ASI_P, %l7 ! IEU1
  176. rdpr %canrestore, %g3 ! Single Group+4bubbles
  177. rdpr %wstate, %g2 ! Single Group+4bubbles
  178. wrpr %g0, 0, %canrestore ! Single Group+4bubbles
  179. sll %g2, 3, %g2 ! IEU0 Group
  180. mov PRIMARY_CONTEXT, %l4 ! IEU1
  181. wrpr %g3, 0, %otherwin ! Single Group+4bubbles
  182. wrpr %g2, 0, %wstate ! Single Group+4bubbles
  183. stxa %g0, [%l4] ASI_DMMU ! Store
  184. flush %l6 ! Single Group+9bubbles
  185. mov ASI_AIUS, %l7 ! IEU0 Group
  186. 2: mov %g4, %l4 ! IEU1
  187. mov %g5, %l5 ! IEU0 Group
  188. add %g7, 0x4, %l2 ! IEU1
  189. wrpr %g0, ETRAP_PSTATE1, %pstate ! Single Group+4bubbles
  190. stx %g1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G1] ! Store Group
  191. stx %g2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G2] ! Store Group
  192. sllx %l7, 24, %l7 ! IEU0
  193. stx %g3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G3] ! Store Group
  194. rdpr %cwp, %l0 ! Single Group
  195. stx %g4, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G4] ! Store Group
  196. stx %g5, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G5] ! Store Group
  197. stx %g6, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G6] ! Store Group
  198. stx %g7, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_G7] ! Store Group
  199. or %l7, %l0, %l7 ! IEU0
  200. sethi %hi(TSTATE_RMO | TSTATE_PEF), %l0 ! IEU1
  201. or %l7, %l0, %l7 ! IEU0 Group
  202. wrpr %l2, %tnpc ! Single Group+4bubbles
  203. wrpr %l7, (TSTATE_PRIV | TSTATE_IE), %tstate ! Single Group+4bubbles
  204. stx %i0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0] ! Store Group
  205. stx %i1, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1] ! Store Group
  206. stx %i2, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I2] ! Store Group
  207. stx %i3, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I3] ! Store Group
  208. stx %i4, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I4] ! Store Group
  209. sethi %uhi(PAGE_OFFSET), %g4 ! IEU0
  210. stx %i5, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I5] ! Store Group
  211. stx %i6, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I6] ! Store Group
  212. sllx %g4, 32, %g4 ! IEU0
  213. mov %l6, %g6 ! IEU1
  214. stx %i7, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I7] ! Store Group
  215. done
  216. nop
  217. #undef TASK_REGOFF
  218. #undef ETRAP_PSTATE1
  219. #undef ETRAP_PSTATE2