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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 1999 by Helge Deller
  8.  * Copyright 1999 SuSE GmbH (Philipp Rumpf)
  9.  * Copyright 1999 Philipp Rumpf (prumpf@tux.org)
  10.  *
  11.  * Initial Version 04-23-1999 by Helge Deller <deller@gmx.de>
  12.  */
  13. #include <linux/autoconf.h> /* for CONFIG_SMP */
  14. #include <asm/offset.h>
  15. #include <asm/psw.h>
  16. #include <asm/assembly.h>
  17. #include <asm/pgtable.h>
  18. .level 1.1
  19. .section .initcall.init
  20. .align 4
  21. .export __initcall_start
  22. __initcall_start:
  23. .export __initcall_end
  24. __initcall_end:
  25. .export __setup_start
  26. __setup_start:
  27. .export __setup_end
  28. __setup_end:
  29. .data
  30. .export boot_args
  31. boot_args:
  32. .word 0 /* arg0 */
  33. .word 0 /* arg1 */
  34. .word 0 /* arg2 */
  35. .word 0 /* arg3 */
  36. .text
  37. .align 4
  38. .import init_task_union,data
  39. .import $global$ /* forward declaration */
  40. .import fault_vector_11,code /* IVA parisc 1.1 32 bit */
  41. .import fault_vector_20,code /* IVA parisc 2.0 32 bit */
  42. .import start_parisc,code /* then enable VM and go here */
  43. .export stext
  44. .export _stext,data /* Kernel want it this way! */
  45. _stext:
  46. stext:
  47. .proc
  48. .callinfo
  49. /* Make sure sr4-sr7 are set to zero for the kernel address space */
  50. mtsp %r0,%sr4
  51. mtsp %r0,%sr5
  52. mtsp %r0,%sr6
  53. mtsp %r0,%sr7
  54. /* Clear BSS (shouldn't the boot loader do this?) */
  55. .import _edata,data
  56. .import _end,data
  57. ldil            L%PA(_edata),%r3
  58. ldo             R%PA(_edata)(%r3),%r3
  59. ldil            L%PA(_end),%r4
  60. ldo             R%PA(_end)(%r4),%r4
  61. $bss_loop:
  62. cmpb,<<,n       %r3,%r4,$bss_loop
  63. stb,ma          %r0,1(%r3)
  64. /* Save away the arguments the boot loader passed in (32 bit args) */
  65. ldil            L%PA(boot_args),%r1
  66. ldo             R%PA(boot_args)(%r1),%r1
  67. stw,ma          %arg0,4(%r1)
  68. stw,ma          %arg1,4(%r1)
  69. stw,ma          %arg2,4(%r1)
  70. stw,ma          %arg3,4(%r1)
  71. /* Initialize startup VM. Just map first 8 MB of memory */
  72. ldil L%PA(pg0),%r1
  73. ldo R%PA(pg0)(%r1),%r1
  74. ldo _PAGE_TABLE(%r1),%r3
  75. ldil L%PA(swapper_pg_dir),%r4
  76. ldo R%PA(swapper_pg_dir)(%r4),%r4
  77. mtctl %r4,%cr24 /* Initialize kernel root pointer */
  78. mtctl %r4,%cr25 /* Initialize user root pointer */
  79. #if (__PAGE_OFFSET != 0x10000000UL)
  80. Error! Code below (the next two stw's) needs to be changed
  81. #endif
  82. stw             %r3,0x100(%r4)  /* Hardwired 0x1... kernel Vaddr start*/
  83. ldo 0x1000(%r3),%r3
  84. stw             %r3,0x104(%r4)
  85. ldo _PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */
  86. $pgt_fill_loop:
  87. stwm %r3,4(%r1)
  88. ldo 0x1000(%r3),%r3
  89. bb,>= %r3,8,$pgt_fill_loop
  90. nop
  91. /* Load the return address...er...crash 'n burn */
  92. copy %r0,%r2
  93. /* And the RFI Target address too */
  94. ldil            L%start_kernel,%r11
  95. ldo             R%start_kernel(%r11),%r11
  96. /* And the initial task pointer */
  97. ldil            L%init_task_union,%r6
  98. ldo             R%init_task_union(%r6),%r6
  99. mtctl           %r6,%cr30
  100. /* And the stack pointer too */
  101. ldo             TASK_SZ_ALGN(%r6),%sp
  102. /* And the interrupt stack */
  103. ldil            L%interrupt_stack,%r6
  104. ldo             R%interrupt_stack(%r6),%r6
  105. mtctl           %r6,%cr31
  106. #ifdef CONFIG_SMP
  107. /* Set the smp rendevous address into page zero.
  108. ** It would be safer to do this in init_smp_config() but
  109. ** it's just way easier to deal with here because
  110. ** of 64-bit function ptrs and the address is local to this file.
  111. */
  112. ldil L%PA(smp_slave_stext),%r10
  113. ldo R%PA(smp_slave_stext)(%r10),%r10
  114. stw %r10,0x10(%r0) /* MEM_RENDEZ */
  115. stw %r0,0x28(%r0) /* MEM_RENDEZ_HI - assume addr < 4GB */
  116. /* FALLTHROUGH */
  117. .procend
  118. /*
  119. ** Code Common to both Monarch and Slave processors.
  120. ** Entry:
  121. **    %r11 must contain RFI target address.
  122. **    %r25/%r26 args to pass to target function
  123. **    %r2  in case rfi target decides it didn't like something
  124. **
  125. ** Caller must init: SR4-7, %sp, %r10, %cr24/25, 
  126. */
  127. common_stext:
  128. .proc
  129. .callinfo
  130. #else
  131. /* Clear PDC entry point - we won't use it */
  132. stw %r0,0x10(%r0) /* MEM_RENDEZ */
  133. stw %r0,0x28(%r0) /* MEM_RENDEZ_HI */
  134. #endif
  135. /* PARANOID: clear user scratch/user space SR's */
  136. mtsp %r0,%sr0
  137. mtsp %r0,%sr1
  138. mtsp %r0,%sr2
  139. mtsp %r0,%sr3
  140. /* Initialize Protection Registers */
  141. mtctl %r0,%cr8
  142. mtctl %r0,%cr9
  143. mtctl %r0,%cr12
  144. mtctl %r0,%cr13
  145. /* Initialize the global data pointer */
  146. ldil L%$global$,%dp
  147. ldo R%$global$(%dp),%dp
  148. /*
  149.  * Set up our interrupt table.  HPMCs might not work after this! 
  150.  *
  151.  * We need to install the correct iva for PA1.1 or PA2.0. The
  152.  * following short sequence of instructions can determine this
  153.  * (without being illegal on a PA1.1 machine).
  154.  */
  155. ldi 32,%r10
  156. mtctl %r10,%cr11
  157. .level 2.0
  158. mfctl,w %cr11,%r10
  159. .level 1.1
  160. comib,<>,n 0,%r10,$is_pa20
  161. ldil L%PA(fault_vector_11),%r10
  162. b $install_iva
  163. ldo R%PA(fault_vector_11)(%r10),%r10
  164. $is_pa20:
  165. ldil L%PA(fault_vector_20),%r10
  166. ldo R%PA(fault_vector_20)(%r10),%r10
  167. $install_iva:
  168. mtctl %r10,%cr14
  169. /* Disable Q bit so we can load the iia queue */
  170. rsm            PSW_SM_Q,%r0
  171. /* kernel PSW:
  172.  *  - no interruptions except HPMC and TOC (which are handled by PDC)
  173.  *  - Q bit set (IODC / PDC interruptions)
  174.  *  - big-endian
  175.  *  - virtually mapped
  176.  */
  177. ldil L%KERNEL_PSW,%r10
  178. ldo R%KERNEL_PSW(%r10),%r10
  179. mtctl %r10,%ipsw
  180. /* Set the space pointers for the post-RFI world
  181. ** Clear the two-level IIA Space Queue, effectively setting
  182. ** Kernel space.
  183. */
  184. mtctl %r0,%cr17
  185. mtctl %r0,%cr17
  186. /* Load RFI target into PC queue */
  187. mtctl %r11,%cr18
  188. ldo 4(%r11),%r11
  189. mtctl %r11,%cr18
  190. /* Jump to hyperspace */
  191. rfi
  192. nop
  193. .procend
  194. #ifdef CONFIG_SMP
  195. .import smp_init_current_idle_task,data
  196. .import smp_callin,code
  197. smp_callin_rtn:
  198.         .proc
  199. .callinfo
  200. break 1,1 /*  Break if returned from start_secondary */
  201. nop
  202. nop
  203.         .procend
  204. /***************************************************************************
  205. *
  206. * smp_slave_stext is executed by all non-monarch Processors when the Monarch
  207. * pokes the slave CPUs in smp.c:smp_boot_cpus().
  208. *
  209. * Once here, registers values are initialized in order to branch to virtual
  210. * mode. Once all available/eligible CPUs are in virtual mode, all are
  211. * released and start out by executing their own idle task.
  212. *****************************************************************************/
  213. smp_slave_stext:
  214.         .proc
  215. .callinfo
  216. /*
  217. ** Initialize Space registers
  218. */
  219. mtsp    %r0,%sr4
  220. mtsp    %r0,%sr5
  221. mtsp    %r0,%sr6
  222. mtsp    %r0,%sr7
  223. /*  Initialize the SP - monarch sets up smp_init_current_idle_task */
  224. ldil L%PA(smp_init_current_idle_task),%sp
  225. ldo R%PA(smp_init_current_idle_task)(%sp),%sp
  226. ldw 0(%sp),%sp /* load task address */
  227. mtctl           %sp,%cr30       /* store in cr30 */
  228. addil L%TASK_SZ_ALGN,%sp /* stack is above task */
  229. ldo R%TASK_SZ_ALGN(%r1),%sp
  230. /* point CPU to kernel page tables */
  231. ldil L%PA(swapper_pg_dir),%r4
  232. ldo R%PA(swapper_pg_dir)(%r4),%r4
  233. mtctl %r4,%cr24 /* Initialize kernel root pointer */
  234. mtctl %r4,%cr25 /* Initialize user root pointer */
  235. /* Load RFI *return* address in case smp_callin bails */
  236. ldil L%smp_callin_rtn,%r2
  237. ldo R%smp_callin_rtn(%r2),%r2
  238. /* Load RFI target address.  */
  239. ldil L%smp_callin,%r11
  240. ldo R%smp_callin(%r11),%r11
  241. /* ok...common code can handle the rest */
  242. b common_stext
  243. nop
  244. .procend
  245. #endif /* CONFIG_SMP */
  246. .data
  247. .align 4
  248. .export $global$,data
  249. .type $global$,@object
  250. .size $global$,4
  251. $global$:
  252. .word 0