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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: trampoline.S,v 1.24 2001/11/16 21:59:20 davem Exp $
  2.  * trampoline.S: Jump start slave processors on sparc64.
  3.  *
  4.  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  5.  */
  6. #include <asm/head.h>
  7. #include <asm/asi.h>
  8. #include <asm/lsu.h>
  9. #include <asm/dcr.h>
  10. #include <asm/dcu.h>
  11. #include <asm/pstate.h>
  12. #include <asm/page.h>
  13. #include <asm/pgtable.h>
  14. #include <asm/spitfire.h>
  15. #include <asm/processor.h>
  16. #include <asm/asm_offsets.h>
  17. .data
  18. .align 8
  19. call_method:
  20. .asciz "call-method"
  21. .align 8
  22. itlb_load:
  23. .asciz "SUNW,itlb-load"
  24. .align 8
  25. dtlb_load:
  26. .asciz "SUNW,dtlb-load"
  27. .text
  28. .align 8
  29. .globl sparc64_cpu_startup, sparc64_cpu_startup_end
  30. sparc64_cpu_startup:
  31. flushw
  32. BRANCH_IF_CHEETAH_BASE(g1,g5,cheetah_startup)
  33. BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g5,cheetah_plus_startup)
  34. ba,pt %xcc, spitfire_startup
  35.  nop
  36. cheetah_plus_startup:
  37. /* Preserve OBP choosen DCU and DCR register settings.  */
  38. ba,pt %xcc, cheetah_generic_startup
  39.  nop
  40. cheetah_startup:
  41. mov DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1
  42. wr %g1, %asr18
  43. sethi %uhi(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5
  44. or %g5, %ulo(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5
  45. sllx %g5, 32, %g5
  46. or %g5, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g5
  47. stxa %g5, [%g0] ASI_DCU_CONTROL_REG
  48. membar #Sync
  49. cheetah_generic_startup:
  50. mov TSB_EXTENSION_P, %g3
  51. stxa %g0, [%g3] ASI_DMMU
  52. stxa %g0, [%g3] ASI_IMMU
  53. membar #Sync
  54. mov TSB_EXTENSION_S, %g3
  55. stxa %g0, [%g3] ASI_DMMU
  56. membar #Sync
  57. mov TSB_EXTENSION_N, %g3
  58. stxa %g0, [%g3] ASI_DMMU
  59. stxa %g0, [%g3] ASI_IMMU
  60. membar #Sync
  61. /* Disable STICK_INT interrupts. */
  62. sethi %hi(0x80000000), %g5
  63. sllx %g5, 32, %g5
  64. wr %g5, %asr25
  65. ba,pt %xcc, startup_continue
  66.  nop
  67. spitfire_startup:
  68. mov (LSU_CONTROL_IC | LSU_CONTROL_DC | LSU_CONTROL_IM | LSU_CONTROL_DM), %g1
  69. stxa %g1, [%g0] ASI_LSU_CONTROL
  70. membar #Sync
  71. startup_continue:
  72. wrpr %g0, 15, %pil
  73. wr %g0, 0, %tick_cmpr
  74. /* Call OBP by hand to lock KERNBASE into i/d tlbs. */
  75. mov %o0, %l0
  76. sethi %hi(prom_entry_lock), %g2
  77. 1: ldstub [%g2 + %lo(prom_entry_lock)], %g1
  78. brnz,pn %g1, 1b
  79.  membar #StoreLoad | #StoreStore
  80. sethi %hi(p1275buf), %g2
  81. or %g2, %lo(p1275buf), %g2
  82. ldx [%g2 + 0x10], %l2
  83. mov %sp, %l1
  84. add %l2, -(192 + 128), %sp
  85. flushw
  86. sethi %hi(call_method), %g2
  87. or %g2, %lo(call_method), %g2
  88. stx %g2, [%sp + 2047 + 128 + 0x00]
  89. mov 5, %g2
  90. stx %g2, [%sp + 2047 + 128 + 0x08]
  91. mov 1, %g2
  92. stx %g2, [%sp + 2047 + 128 + 0x10]
  93. sethi %hi(itlb_load), %g2
  94. or %g2, %lo(itlb_load), %g2
  95. stx %g2, [%sp + 2047 + 128 + 0x18]
  96. sethi %hi(mmu_ihandle_cache), %g2
  97. lduw [%g2 + %lo(mmu_ihandle_cache)], %g2
  98. stx %g2, [%sp + 2047 + 128 + 0x20]
  99. sethi %hi(KERNBASE), %g2
  100. stx %g2, [%sp + 2047 + 128 + 0x28]
  101. sethi %hi(kern_locked_tte_data), %g2
  102. ldx [%g2 + %lo(kern_locked_tte_data)], %g2
  103. stx %g2, [%sp + 2047 + 128 + 0x30]
  104. mov 15, %g2
  105. BRANCH_IF_ANY_CHEETAH(g1,g5,1f)
  106. mov 63, %g2
  107. 1:
  108. stx %g2, [%sp + 2047 + 128 + 0x38]
  109. sethi %hi(p1275buf), %g2
  110. or %g2, %lo(p1275buf), %g2
  111. ldx [%g2 + 0x08], %o1
  112. call %o1
  113.  add %sp, (2047 + 128), %o0
  114. sethi %hi(call_method), %g2
  115. or %g2, %lo(call_method), %g2
  116. stx %g2, [%sp + 2047 + 128 + 0x00]
  117. mov 5, %g2
  118. stx %g2, [%sp + 2047 + 128 + 0x08]
  119. mov 1, %g2
  120. stx %g2, [%sp + 2047 + 128 + 0x10]
  121. sethi %hi(dtlb_load), %g2
  122. or %g2, %lo(dtlb_load), %g2
  123. stx %g2, [%sp + 2047 + 128 + 0x18]
  124. sethi %hi(mmu_ihandle_cache), %g2
  125. lduw [%g2 + %lo(mmu_ihandle_cache)], %g2
  126. stx %g2, [%sp + 2047 + 128 + 0x20]
  127. sethi %hi(KERNBASE), %g2
  128. stx %g2, [%sp + 2047 + 128 + 0x28]
  129. sethi %hi(kern_locked_tte_data), %g2
  130. ldx [%g2 + %lo(kern_locked_tte_data)], %g2
  131. stx %g2, [%sp + 2047 + 128 + 0x30]
  132. mov 15, %g2
  133. BRANCH_IF_ANY_CHEETAH(g1,g5,1f)
  134. mov 63, %g2
  135. 1:
  136. stx %g2, [%sp + 2047 + 128 + 0x38]
  137. sethi %hi(p1275buf), %g2
  138. or %g2, %lo(p1275buf), %g2
  139. ldx [%g2 + 0x08], %o1
  140. call %o1
  141.  add %sp, (2047 + 128), %o0
  142. sethi %hi(prom_entry_lock), %g2
  143. stb %g0, [%g2 + %lo(prom_entry_lock)]
  144. membar #StoreStore | #StoreLoad
  145. mov %l1, %sp
  146. flushw
  147. mov %l0, %o0
  148. wrpr %g0, (PSTATE_PRIV | PSTATE_PEF), %pstate
  149. wr %g0, 0, %fprs
  150. sethi %uhi(PAGE_OFFSET), %g4
  151. sllx %g4, 32, %g4
  152. /* XXX Buggy PROM... */
  153. srl %o0, 0, %o0
  154. ldx [%o0], %g6
  155. wr %g0, ASI_P, %asi
  156. mov PRIMARY_CONTEXT, %g7
  157. stxa %g0, [%g7] ASI_DMMU
  158. membar #Sync
  159. mov SECONDARY_CONTEXT, %g7
  160. stxa %g0, [%g7] ASI_DMMU
  161. membar #Sync
  162. mov 1, %g5
  163. sllx %g5, THREAD_SHIFT, %g5
  164. sub %g5, (REGWIN_SZ + STACK_BIAS), %g5
  165. add %g6, %g5, %sp
  166. mov 0, %fp
  167. wrpr %g0, 0, %wstate
  168. wrpr %g0, 0, %tl
  169. /* Setup the trap globals, then we can resurface. */
  170. rdpr %pstate, %o1
  171. mov %g6, %o2
  172. wrpr %o1, PSTATE_AG, %pstate
  173. sethi %hi(sparc64_ttable_tl0), %g5
  174. wrpr %g5, %tba
  175. mov %o2, %g6
  176. wrpr %o1, PSTATE_MG, %pstate
  177. #define KERN_HIGHBITS ((_PAGE_VALID|_PAGE_SZ4MB)^0xfffff80000000000)
  178. #define KERN_LOWBITS (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
  179. mov TSB_REG, %g1
  180. stxa %g0, [%g1] ASI_DMMU
  181. membar #Sync
  182. mov TLB_SFSR, %g1
  183. sethi %uhi(KERN_HIGHBITS), %g2
  184. or %g2, %ulo(KERN_HIGHBITS), %g2
  185. sllx %g2, 32, %g2
  186. or %g2, KERN_LOWBITS, %g2
  187. BRANCH_IF_ANY_CHEETAH(g3,g7,9f)
  188. ba,pt %xcc, 1f
  189.  nop
  190. 9:
  191. sethi %uhi(VPTE_BASE_CHEETAH), %g3
  192. or %g3, %ulo(VPTE_BASE_CHEETAH), %g3
  193. ba,pt %xcc, 2f
  194.  sllx %g3, 32, %g3
  195. 1:
  196. sethi %uhi(VPTE_BASE_SPITFIRE), %g3
  197. or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3
  198. sllx %g3, 32, %g3
  199. 2:
  200. clr %g7
  201. #undef KERN_HIGHBITS
  202. #undef KERN_LOWBITS
  203. /* Setup interrupt globals, we are always SMP. */
  204. wrpr %o1, PSTATE_IG, %pstate
  205. /* Get our UPA MID. */
  206. lduw [%o2 + AOFF_task_processor], %g1
  207. sethi %hi(cpu_data), %g5
  208. or %g5, %lo(cpu_data), %g5
  209. /* In theory this is: &(cpu_data[this_upamid].irq_worklists[0]) */
  210. sllx %g1, 7, %g1
  211. add %g5, %g1, %g1
  212. add %g1, 64, %g6
  213. wrpr %g0, 0, %wstate
  214. or %o1, PSTATE_IE, %o1
  215. wrpr %o1, 0, %pstate
  216. call prom_set_trap_table
  217.  sethi %hi(sparc64_ttable_tl0), %o0
  218. call smp_callin
  219.  nop
  220. call cpu_idle
  221.  mov 0, %o0
  222. call cpu_panic
  223.  nop
  224. 1: b,a,pt %xcc, 1b
  225. .align 8
  226. sparc64_cpu_startup_end: