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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.head.S 1.9 05/18/01 07:54:04 patch
  3.  */
  4. #include <linux/config.h>
  5. #include "../../kernel/ppc_defs.h"
  6. #include "../../kernel/ppc_asm.tmpl"
  7. #include <asm/processor.h>
  8. #include <asm/cache.h>
  9. .text
  10. /*
  11.  * This code is loaded by the ROM loader at some arbitrary location.
  12.  * Move it to high memory so that it can load the kernel at 0x0000.
  13.  *
  14.  * This is a three step process that will also work when booting from
  15.  * a Flash PROM normally located in high memory.
  16.  *
  17.  * First, the entire image is loaded into some high memory address.
  18.  * This is usually at or above 0x02000000.  This is done by a network
  19.  * boot function supported by the board or a debugger over BDM port.
  20.  *
  21.  * Second, the start up function here will relocate the decompress
  22.  * function to run at the link address of 0x01000000.
  23.  *
  24.  * Last, the decompression function will reloate the initrd, zImage, and
  25.  * the residual data to locations under 8 Meg.  This is necessary because
  26.  * the embedded kernel start up uses 8 Meg translations to access physical
  27.  * space before the MMU is enabled.  Finally, the zImage is uncompressed
  28.  * to location 0 and we jump to it.
  29.  *
  30.  * On the MBX,
  31.  *              R1 - Stack pointer at a high memory address.
  32.  *              R3 - Pointer to Board Information Block.
  33.  *              R4 - Pointer to argument string.
  34.  *              Interrupts masked, cache and MMU disabled.
  35.  *
  36.  * ...and the first and second functions listed above are
  37.  * done for us (it knows ELF images).
  38.  *
  39.  * For other embedded boards we build the Board Information Block.
  40.  */
  41. .globl start
  42. start:
  43. bl start_
  44. start_:
  45. #ifndef CONFIG_MBX
  46. lis r11, local_bd_info@h
  47. ori r11, r11, local_bd_info@l
  48. #else
  49. mr r11, r3
  50. #endif
  51. mfmsr r3 /* Turn off interrupts  */
  52. li r4,0
  53. ori r4,r4,MSR_EE
  54. andc r3,r3,r4
  55. mtmsr r3
  56. li r4,0 /* Zero DER to prevent FRZ */
  57. mtspr SPRN_DER,r4
  58. /* check if we need to relocate ourselves to the link addr or were we
  59.    loaded there to begin with -- Cort */
  60. lis r4,start@h
  61. ori r4,r4,start@l
  62. mflr r3
  63. subi r3,r3,4 /* we get the nip, not the ip of the branch */
  64. mr r8,r3
  65. #if 0
  66. cmp 0,r3,r4
  67. beq start_ldr /* Branch if loaded OK */
  68. #endif
  69. /* 
  70.  * no matter where we're loaded, move ourselves to -Ttext address
  71.  * This computes the sizes we need to determine other things.
  72.  */
  73. lis r5,end@h
  74. ori r5,r5,end@l
  75. addi r5,r5,3 /* Round up - just in case */
  76. sub r5,r5,r4 /* Compute # longwords to move */
  77. srwi r5,r5,2
  78. mtctr r5
  79. mr r7,r5
  80. li r6,0
  81. subi r3,r3,4 /* Set up for loop */
  82. subi r4,r4,4
  83. 00: lwzu r5,4(r3)
  84. stwu r5,4(r4)
  85. xor r6,r6,r5
  86. bdnz 00b
  87.    lis r3,start_ldr@h
  88. ori r3,r3,start_ldr@l
  89. mtlr r3 /* Easiest way to do an absolute jump */
  90. blr
  91. start_ldr:
  92. /* Most 8xx boards don't boot up with the I-cache enabled.  Do that
  93.  * now because the decompress runs much faster that way.
  94.  */
  95. lis r3, IDC_INVALL@h
  96. mtspr IC_CST, r3
  97. lis r3, IDC_ENABLE@h
  98. mtspr IC_CST, r3
  99. /* Clear all of BSS */
  100. lis r3,edata@h
  101. ori r3,r3,edata@l
  102. lis r4,end@h
  103. ori r4,r4,end@l
  104. subi r3,r3,4
  105. subi r4,r4,4
  106. li r0,0
  107. 50: stwu r0,4(r3)
  108. cmp 0,r3,r4
  109. bne 50b
  110. lis r1,.stack@h
  111. ori r1,r1,.stack@l
  112. addi r1,r1,4096*2
  113. subi r1,r1,256
  114. li r2,0x000F /* Mask pointer to 16-byte boundary */
  115. andc r1,r1,r2
  116. /* Perform configuration of the various boards.  This is done
  117.  * by reading some configuration data from EEPROM and building
  118.  * the board information structure.
  119.  */
  120. mr r3, r11
  121.         mr      r21, r11
  122. mr r22, r8
  123. mr r23, r7
  124. mr r24, r6
  125. bl embed_config
  126. mr r3, r21
  127. bl      serial_init /* Init MBX serial port */
  128. mr      r11, r21
  129. mr r8, r22
  130. mr r7, r23
  131. mr r6, r24
  132. #ifdef CONFIG_MBX
  133. /* On the MBX (or anything that will TFTP load an ELF image),
  134.  * we have to find the intermediate address.  The ELF loader
  135.  * only moves the Linux boostrap/decompress, not the zImage.
  136.  */
  137. #define ILAP_ADDRESS    0xfa000020
  138.         lis     r8, ILAP_ADDRESS@h
  139.         lwz     r8, ILAP_ADDRESS@l(r8)
  140.         addis   r8, r8, 1               /* Add 64K */
  141. #endif
  142. mr r3,r8 /* Load point */
  143. mr r4,r7 /* Program length */
  144. mr r5,r6 /* Checksum */
  145. mr r6,r11 /* Residual data */
  146. bl decompress_kernel
  147. /* changed to use r3 (as firmware does) for kernel
  148.    as ptr to residual -- Cort*/
  149. lis r6,cmd_line@h
  150. ori r6,r6,cmd_line@l
  151. lwz r6, 0(r6)
  152. subi r7,r6,1
  153. 00: lbzu r2,1(r7)
  154. cmpi 0,r2,0
  155. bne 00b
  156. /* r4,r5 have initrd_start, size */
  157. lis r2,initrd_start@h
  158. ori r2,r2,initrd_start@l
  159. lwz r4,0(r2)
  160. lis r2,initrd_end@h
  161. ori r2,r2,initrd_end@l
  162. lwz r5,0(r2)
  163. /* The world starts from the beginning.
  164. */
  165. li r9,0x0
  166. mtlr r9
  167. /* Invalidate the instruction cache because we just copied a
  168.  * bunch of kernel instructions.
  169.  */
  170. lis r9, IDC_INVALL@h
  171. mtspr IC_CST, r9
  172. blr
  173. hang:
  174. b hang
  175. /*
  176.  * Delay for a number of microseconds
  177.  * -- Use the BUS timer (assumes 66MHz)
  178.  */
  179. .globl udelay
  180. udelay:
  181. mulli r4,r3,1000 /* nanoseconds */
  182. addi r4,r4,59
  183. li r5,60
  184. divw r4,r4,r5 /* BUS ticks */
  185. 1: mftbu r5
  186. mftb r6
  187. mftbu r7
  188. cmp 0,r5,r7
  189. bne 1b /* Get [synced] base time */
  190. addc r9,r6,r4 /* Compute end time */
  191. addze r8,r5
  192. 2: mftbu r5
  193. cmp 0,r5,r8
  194. blt 2b
  195. bgt 3f
  196. mftb r6
  197. cmp 0,r6,r9
  198. blt 2b
  199. 3: blr
  200. .globl _get_MSR
  201. _get_MSR:
  202. mfmsr r3
  203. blr
  204. .globl _put_MSR
  205. _put_MSR:
  206. mtmsr r3
  207. blr
  208. .comm .stack,4096*2,4
  209. #ifndef CONFIG_MBX
  210. local_bd_info:
  211. .long 0
  212. .long 0x01000000
  213. .long 64
  214. .long 64
  215. .long 0
  216. .long 0
  217. .long 0
  218. #endif