head.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

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. #define __ASSEMBLY__
  14. #include <linux/config.h>
  15. #include <linux/init.h>
  16. #include <asm/asm.h>
  17. #include <asm/regdef.h>
  18. #include <asm/processor.h>
  19. #include <asm/mipsregs.h>
  20. #include <asm/stackframe.h>
  21. #include <asm/pgtable.h>
  22. #include <asm/sn/addrs.h>
  23. #include <asm/sn/sn0/hubni.h>
  24. #include <asm/sn/klkernvars.h>
  25. .macro ARC64_TWIDDLE_PC
  26. #if defined(CONFIG_ARC64) || defined(CONFIG_MAPPED_KERNEL)
  27. /* We get launched at a XKPHYS address but the kernel is linked to
  28.    run at a KSEG0 address, so jump there.  */
  29. la t0, @f
  30. jr t0
  31. @:
  32. #endif
  33. .endm
  34. #ifdef CONFIG_SGI_IP27
  35. /*
  36.  * outputs the local nasid into t1.
  37.  */
  38. .macro GET_NASID_ASM
  39. dli t1, LOCAL_HUB_ADDR(NI_STATUS_REV_ID)
  40. ld t1, (t1)
  41. and t1, NSRI_NODEID_MASK
  42. dsrl t1, NSRI_NODEID_SHFT
  43. .endm
  44. #endif /* CONFIG_SGI_IP27 */
  45. /*
  46.  * inputs are the text nasid in t1, data nasid in t2.
  47.  */
  48. .macro MAPPED_KERNEL_SETUP_TLB
  49. #ifdef CONFIG_MAPPED_KERNEL
  50. /*
  51.  * This needs to read the nasid - assume 0 for now.
  52.  * Drop in 0xffffffffc0000000 in tlbhi, 0+VG in tlblo_0,
  53.  * 0+DVG in tlblo_1.
  54.  */
  55. dli t0, 0xffffffffc0000000
  56. dmtc0 t0, CP0_ENTRYHI
  57. li t0, 0x1c000 # Offset of text into node memory
  58. dsll t1, NASID_SHFT # Shift text nasid into place
  59. dsll t2, NASID_SHFT # Same for data nasid
  60. or t1, t1, t0 # Physical load address of kernel text
  61. or t2, t2, t0 # Physical load address of kernel data
  62. dsrl t1, 12 # 4K pfn
  63. dsrl t2, 12 # 4K pfn
  64. dsll t1, 6 # Get pfn into place
  65. dsll t2, 6 # Get pfn into place
  66. li t0, ((_PAGE_GLOBAL|_PAGE_VALID| _CACHE_CACHABLE_COW) >> 6)
  67. or t0, t0, t1
  68. mtc0 t0, CP0_ENTRYLO0 # physaddr, VG, cach exlwr
  69. li t0, ((_PAGE_GLOBAL|_PAGE_VALID| _PAGE_DIRTY|_CACHE_CACHABLE_COW) >> 6)
  70. or t0, t0, t2
  71. mtc0 t0, CP0_ENTRYLO1 # physaddr, DVG, cach exlwr
  72. li t0, 0x1ffe000 # MAPPED_KERN_TLBMASK, TLBPGMASK_16M
  73. mtc0 t0, CP0_PAGEMASK
  74. li t0, 0 # KMAP_INX
  75. mtc0 t0, CP0_INDEX
  76. li t0, 1
  77. mtc0 t0, CP0_WIRED
  78. tlbwi
  79. #else
  80. mtc0 zero, CP0_WIRED
  81. #endif
  82. .endm
  83. .text
  84. EXPORT(stext) # used for profiling
  85. EXPORT(_stext)
  86. __INIT
  87. NESTED(kernel_entry, 16, sp) # kernel entry point
  88. ori sp, 0xf # align stack on 16 byte.
  89. xori sp, 0xf
  90. #ifdef CONFIG_SGI_IP27
  91. GET_NASID_ASM
  92. move t2, t1 # text and data are here
  93. MAPPED_KERNEL_SETUP_TLB
  94. #endif /* IP27 */
  95. ARC64_TWIDDLE_PC
  96. CLI # disable interrupts
  97. mfc0 t0, CP0_STATUS
  98. /*
  99.  * On IP27, I am seeing the TS bit set when the
  100.  * kernel is loaded. Maybe because the kernel is
  101.  * in ckseg0 and not xkphys? Clear it anyway ...
  102.  */
  103. li t1, ~(ST0_TS|ST0_CU1|ST0_CU2|ST0_CU3)
  104. and t0, t1
  105. or t0, (ST0_CU0|ST0_KX|ST0_SX|ST0_FR) # Bogosity: cu0 indicates kernel
  106. mtc0 t0, CP0_STATUS    # thread in copy_thread.
  107. la $28, init_task_union # init current pointer
  108. daddiu t0, $28, KERNEL_STACK_SIZE-32
  109. sd t0, kernelsp
  110. dsubu sp, t0, 4*SZREG # init stack pointer
  111. move t0, $28
  112. #ifdef CONFIG_SMP
  113. mtc0 t0, CP0_WATCHLO
  114. dsrl32 t0, t0, 0
  115. mtc0 t0, CP0_WATCHHI
  116. #endif
  117. /* Note that all firmware passed argument registers still
  118.    have their values.  */
  119. jal prom_init # initialize firmware
  120. jal start_kernel
  121. 1: b 1b # just in case ...
  122. END(kernel_entry)
  123. #ifdef CONFIG_SGI_IP27
  124. NESTED(bootstrap, 16, sp)
  125. GET_NASID_ASM
  126. li t0, KLDIR_OFFSET + (KLI_KERN_VARS * KLDIR_ENT_SIZE) + KLDIR_OFF_POINTER + K0BASE
  127. dsll t1, NASID_SHFT
  128. or t0, t0, t1
  129. ld t0, 0(t0) # t0 points to kern_vars struct
  130. lh t1, KV_RO_NASID_OFFSET(t0)
  131. lh t2, KV_RW_NASID_OFFSET(t0)
  132. MAPPED_KERNEL_SETUP_TLB
  133. ARC64_TWIDDLE_PC
  134. CLI
  135. mfc0 t0, CP0_STATUS
  136. li t1, ~(ST0_CU1|ST0_CU2|ST0_CU3)
  137. and t0, t1
  138. or t0, (ST0_CU0|ST0_KX|ST0_SX|ST0_FR) # Bogosity: cu0 indicates kernel
  139. mtc0 t0, CP0_STATUS    # thread in copy_thread.
  140. jal cboot
  141. END(bootstrap)
  142. #endif /* CONFIG_SGI_IP27 */
  143. __FINIT
  144. .comm kernelsp, 8, 8 # current stackpointer
  145. #undef PAGE_SIZE
  146. #define PAGE_SIZE 0x1000
  147. .macro page name, order=0
  148. .globl name
  149. name: .size name, (PAGE_SIZE << order)
  150. .org . + (PAGE_SIZE << order)
  151. .type name, @object
  152. .endm
  153. .data
  154. .align 12
  155. page swapper_pg_dir, 1
  156. page invalid_pte_table, 0
  157. page invalid_pmd_table, 1
  158. page kptbl, KPTBL_PAGE_ORDER
  159. .globl ekptbl
  160. page kpmdtbl, 0
  161. ekptbl: