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

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.  * Head.S contains the MIPS exception handler and startup code.
  7.  *
  8.  * Copyright (C) 1994, 1995 Waldorf Electronics
  9.  * Written by Ralf Baechle and Andreas Busse
  10.  * Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999 Ralf Baechle
  11.  * Copyright (C) 1999 Silicon Graphics, Inc.
  12.  */
  13. #include <linux/config.h>
  14. #include <linux/init.h>
  15. #include <asm/asm.h>
  16. #include <asm/regdef.h>
  17. #include <asm/processor.h>
  18. #include <asm/mipsregs.h>
  19. #include <asm/stackframe.h>
  20. #include <asm/pgtable.h>
  21. #include <asm/sn/addrs.h>
  22. #include <asm/sn/sn0/hubni.h>
  23. #include <asm/sn/klkernvars.h>
  24. .macro ARC64_TWIDDLE_PC
  25. #if defined(CONFIG_ARC64) || defined(CONFIG_MAPPED_KERNEL)
  26. /* We get launched at a XKPHYS address but the kernel is linked to
  27.    run at a KSEG0 address, so jump there.  */
  28. PTR_LA t0, @f
  29. jr t0
  30. @:
  31. #endif
  32. .endm
  33. #ifdef CONFIG_SGI_IP27
  34. /*
  35.  * outputs the local nasid into res.  IP27 stuff.
  36.  */
  37. .macro GET_NASID_ASM res
  38. dli res, LOCAL_HUB_ADDR(NI_STATUS_REV_ID)
  39. ld res, (res)
  40. and res, NSRI_NODEID_MASK
  41. dsrl res, NSRI_NODEID_SHFT
  42. .endm
  43. #endif /* CONFIG_SGI_IP27 */
  44. /*
  45.  * inputs are the text nasid in t1, data nasid in t2.
  46.  */
  47. .macro MAPPED_KERNEL_SETUP_TLB
  48. #ifdef CONFIG_MAPPED_KERNEL
  49. /*
  50.  * This needs to read the nasid - assume 0 for now.
  51.  * Drop in 0xffffffffc0000000 in tlbhi, 0+VG in tlblo_0,
  52.  * 0+DVG in tlblo_1.
  53.  */
  54. dli t0, 0xffffffffc0000000
  55. dmtc0 t0, CP0_ENTRYHI
  56. li t0, 0x1c000 # Offset of text into node memory
  57. dsll t1, NASID_SHFT # Shift text nasid into place
  58. dsll t2, NASID_SHFT # Same for data nasid
  59. or t1, t1, t0 # Physical load address of kernel text
  60. or t2, t2, t0 # Physical load address of kernel data
  61. dsrl t1, 12 # 4K pfn
  62. dsrl t2, 12 # 4K pfn
  63. dsll t1, 6 # Get pfn into place
  64. dsll t2, 6 # Get pfn into place
  65. li t0, ((_PAGE_GLOBAL|_PAGE_VALID| _CACHE_CACHABLE_COW) >> 6)
  66. or t0, t0, t1
  67. mtc0 t0, CP0_ENTRYLO0 # physaddr, VG, cach exlwr
  68. li t0, ((_PAGE_GLOBAL|_PAGE_VALID| _PAGE_DIRTY|_CACHE_CACHABLE_COW) >> 6)
  69. or t0, t0, t2
  70. mtc0 t0, CP0_ENTRYLO1 # physaddr, DVG, cach exlwr
  71. li t0, 0x1ffe000 # MAPPED_KERN_TLBMASK, TLBPGMASK_16M
  72. mtc0 t0, CP0_PAGEMASK
  73. li t0, 0 # KMAP_INX
  74. mtc0 t0, CP0_INDEX
  75. li t0, 1
  76. mtc0 t0, CP0_WIRED
  77. tlbwi
  78. #else
  79. mtc0 zero, CP0_WIRED
  80. #endif
  81. .endm
  82. .text
  83. EXPORT(stext) # used for profiling
  84. EXPORT(_stext)
  85. __INIT
  86. NESTED(kernel_entry, 16, sp) # kernel entry point
  87. ori sp, 0xf # align stack on 16 byte.
  88. xori sp, 0xf
  89. #ifdef CONFIG_SGI_IP27
  90. GET_NASID_ASM t1
  91. move t2, t1 # text and data are here
  92. MAPPED_KERNEL_SETUP_TLB
  93. #endif /* IP27 */
  94. ARC64_TWIDDLE_PC
  95. CLI # disable interrupts
  96. PTR_LA $28, init_task_union # init current pointer
  97. daddiu sp, $28, KERNEL_STACK_SIZE-32
  98. set_saved_sp sp, t0
  99. /* The firmware/bootloader passes argc/argp/envp
  100.  * to us as arguments.  But clear bss first because
  101.  * the romvec and other important info is stored there
  102.  * by prom_init().
  103.  */
  104. PTR_LA t0, _edata
  105. sd zero, (t0)
  106. PTR_LA t1, (_end - 8)
  107. 1:
  108. daddiu t0, 8
  109. sd zero, (t0)
  110. bne t0, t1, 1b
  111. dsubu sp, 4*SZREG # init stack pointer
  112. j init_arch
  113. END(kernel_entry)
  114. #ifdef CONFIG_SMP
  115. /*
  116.  * SMP slave cpus entry point.  Board specific code for bootstrap calls this
  117.  * function after setting up the stack and gp registers.
  118.  */
  119. NESTED(smp_bootstrap, 16, sp)
  120. #ifdef CONFIG_SGI_IP27
  121. GET_NASID_ASM t1
  122. li t0, KLDIR_OFFSET + (KLI_KERN_VARS * KLDIR_ENT_SIZE) + 
  123.     KLDIR_OFF_POINTER + K0BASE
  124. dsll t1, NASID_SHFT
  125. or t0, t0, t1
  126. ld t0, 0(t0) # t0 points to kern_vars struct
  127. lh t1, KV_RO_NASID_OFFSET(t0)
  128. lh t2, KV_RW_NASID_OFFSET(t0)
  129. MAPPED_KERNEL_SETUP_TLB
  130. ARC64_TWIDDLE_PC
  131. #endif /* CONFIG_SGI_IP27 */
  132. CLI
  133. /*
  134.  * For the moment set ST0_KU so the CPU will not spit fire when
  135.  * executing 64-bit instructions.  The full initialization of the
  136.  * CPU's status register is done later in per_cpu_trap_init().
  137.  */
  138.         mfc0 t0, CP0_STATUS
  139.         or t0, ST0_KX
  140. mtc0 t0, CP0_STATUS
  141. set_saved_sp sp, t0
  142. jal start_secondary # XXX: IP27: cboot
  143. END(smp_bootstrap)
  144. #endif /* CONFIG_SMP */
  145. __FINIT
  146. declare_saved_sp
  147. #undef PAGE_SIZE
  148. #define PAGE_SIZE 0x1000
  149. .macro page name, order=0
  150. .globl name
  151. name: .size name, (PAGE_SIZE << order)
  152. .org . + (PAGE_SIZE << order)
  153. .type name, @object
  154. .endm
  155. .data
  156. .align 12
  157. page swapper_pg_dir, 1
  158. page invalid_pte_table, 0
  159. page invalid_pmd_table, 1
  160. page kptbl, _PGD_ORDER
  161. .globl ekptbl
  162. page kpmdtbl, 0
  163. ekptbl: