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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1994, 1995 Waldorf Electronics
  7.  * Written by Ralf Baechle and Andreas Busse
  8.  * Copyright (C) 1995 - 1999 Ralf Baechle
  9.  * Copyright (C) 1996 Paul M. Antoine
  10.  * Modified for DECStation and hence R3000 support by Paul M. Antoine
  11.  * Further modifications by David S. Miller and Harald Koerfgen
  12.  * Copyright (C) 1999 Silicon Graphics, Inc.
  13.  *
  14.  * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
  15.  * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/init.h>
  19. #include <linux/threads.h>
  20. #include <asm/asm.h>
  21. #include <asm/current.h>
  22. #include <asm/offset.h>
  23. #include <asm/pgtable-bits.h>
  24. #include <asm/processor.h>
  25. #include <asm/regdef.h>
  26. #include <asm/cachectl.h>
  27. #include <asm/mipsregs.h>
  28. #include <asm/stackframe.h>
  29. .text
  30. /*
  31.  * Reserved space for exception handlers.
  32.  * Necessary for machines which link their kernels at KSEG0.
  33.  */
  34. .fill 0x400
  35. /* The following two symbols are used for kernel profiling. */
  36. EXPORT(stext)
  37. EXPORT(_stext)
  38. __INIT
  39. /* Cache Error */
  40. LEAF(except_vec2_generic)
  41. .set noreorder
  42. .set noat
  43. .set    mips0
  44. /*
  45.  * This is a very bad place to be.  Our cache error
  46.  * detection has triggered.  If we have write-back data
  47.  * in the cache, we may not be able to recover.  As a
  48.  * first-order desperate measure, turn off KSEG0 cacheing.
  49.  */
  50. mfc0 k0,CP0_CONFIG
  51. li k1,~CONF_CM_CMASK
  52. and k0,k0,k1
  53. ori k0,k0,CONF_CM_UNCACHED
  54. mtc0 k0,CP0_CONFIG
  55. /* Give it a few cycles to sink in... */
  56. nop
  57. nop
  58. nop
  59. j cache_parity_error
  60. nop
  61. END(except_vec2_generic)
  62. .set at
  63. /*
  64.  * Special interrupt vector for embedded MIPS.  This is a
  65.  * dedicated interrupt vector which reduces interrupt processing
  66.  * overhead.  The jump instruction will be inserted here at
  67.  * initialization time.  This handler may only be 8 bytes in
  68.  * size!
  69.  */
  70. NESTED(except_vec4, 0, sp)
  71. 1: j 1b /* Dummy, will be replaced */
  72.  nop
  73. END(except_vec4)
  74. /*
  75.  * EJTAG debug exception handler.
  76.  * The EJTAG debug exception entry point is 0xbfc00480, which
  77.  * normally is in the boot PROM, so the boot PROM must do a
  78.  * unconditional jump to this vector.
  79.  */
  80. NESTED(except_vec_ejtag_debug, 0, sp)
  81. j ejtag_debug_handler
  82.  nop
  83. END(except_vec_ejtag_debug)
  84. /*
  85.  * EJTAG debug exception handler.
  86.  */
  87. NESTED(ejtag_debug_handler, PT_SIZE, sp)
  88. .set noat
  89. .set noreorder
  90. mtc0 k0, CP0_DESAVE
  91. mfc0 k0, CP0_DEBUG
  92. sll k0, k0, 30 # Check for SDBBP.
  93. bgez k0, ejtag_return
  94. la k0, ejtag_debug_buffer
  95. sw k1, 0(k0)
  96. SAVE_ALL
  97. jal ejtag_exception_handler
  98.  move a0, sp
  99. RESTORE_ALL
  100. la k0, ejtag_debug_buffer
  101. lw k1, 0(k0)
  102. ejtag_return:
  103. mfc0 k0, CP0_DESAVE
  104. .word 0x4200001f     # DERET, return from EJTAG debug exception.
  105.  nop
  106. .set at
  107. END(ejtag_debug_handler)
  108. /*
  109. * NMI debug exception handler for MIPS reference boards.
  110. * The NMI debug exception entry point is 0xbfc00000, which
  111. * normally is in the boot PROM, so the boot PROM must do a
  112. * unconditional jump to this vector.
  113. */
  114. NESTED(except_vec_nmi, 0, sp)
  115. j       nmi_handler
  116.  nop
  117. END(except_vec_nmi)
  118. NESTED(nmi_handler, PT_SIZE, sp)
  119. .set    noat
  120. .set    noreorder
  121. .set    mips3
  122. SAVE_ALL
  123. jal     nmi_exception_handler
  124.  move   a0, sp
  125. RESTORE_ALL
  126. eret
  127. .set    at
  128. .set    mips0
  129. END(nmi_handler)
  130. /*
  131.  * Kernel entry point
  132.  */
  133. NESTED(kernel_entry, 16, sp)
  134. .set noreorder
  135. /*
  136.  * Stack for kernel and init, current variable
  137.  */
  138. la $28, init_task_union
  139. addiu t0, $28, KERNEL_STACK_SIZE-32
  140. subu sp, t0, 4*SZREG
  141. sw t0, kernelsp
  142. /* The firmware/bootloader passes argc/argp/envp
  143.  * to us as arguments.  But clear bss first because
  144.  * the romvec and other important info is stored there
  145.  * by prom_init().
  146.  */
  147. la t0, _edata
  148. sw zero, (t0)
  149. la t1, (_end - 4)
  150. 1:
  151. addiu t0, 4
  152. bne t0, t1, 1b
  153.  sw zero, (t0)
  154. jal init_arch
  155.  nop
  156. END(kernel_entry)
  157. #ifdef CONFIG_SMP
  158. /*
  159.  * SMP slave cpus entry point.  Board specific code for bootstrap calls this
  160.  * function after setting up the stack and gp registers.
  161.  */
  162. LEAF(smp_bootstrap)
  163. .set push
  164. .set noreorder
  165. mtc0 zero, CP0_WIRED
  166. CLI
  167. mfc0 t0, CP0_STATUS
  168. li t1, ~(ST0_CU1|ST0_CU2|ST0_CU3|ST0_KX|ST0_SX)
  169. and t0, t1
  170. or t0, (ST0_CU0);
  171. jal start_secondary
  172. mtc0 t0, CP0_STATUS
  173. .set pop
  174. END(smp_bootstrap)
  175. #endif
  176. __FINIT
  177. /*
  178.  * This buffer is reserved for the use of the EJTAG debug
  179.  * handler.
  180.  */
  181. .data
  182. EXPORT(ejtag_debug_buffer)
  183. .fill 4
  184. .comm kernelsp,    NR_CPUS * 8, 8
  185. .comm pgd_current, NR_CPUS * 8, 8
  186. .macro page name, order=0
  187. .globl name
  188. name: .size name, (_PAGE_SIZE << order)
  189. .org . + (_PAGE_SIZE << order)
  190. .type name, @object
  191. .endm
  192. .data
  193. .align 12
  194. page swapper_pg_dir, _PGD_ORDER
  195. page empty_bad_page, 0
  196. page empty_bad_page_table, 0
  197. page invalid_pte_table, 0