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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.head.S 1.13 01/11/02 10:46:07 trini
  3.  */
  4. #include <asm/ppc_asm.h>
  5. #include <asm/processor.h>
  6. #include <asm/cache.h>
  7. .text
  8. /*
  9.  * Boot loader philosophy:
  10.  *      ROM loads us to some arbitrary location
  11.  *      Move the boot code to the link address (8M)
  12.  *      Call decompress_kernel()
  13.  *         Relocate the initrd, zimage and residual data to 8M
  14.  *         Decompress the kernel to 0
  15.  *      Jump to the kernel entry
  16.  *            -- Cort
  17.  */
  18. .globl start
  19. start:
  20. bl start_
  21. start_:
  22.         /* Enable, invalidate, Disable L1 icache/dcache */
  23. li r8, 0
  24. ori r8, r8, (HID0_ICE|HID0_DCE|HID0_ICFI|HID0_DCI)
  25. mfspr r11,HID0
  26. or r11,r11,r8
  27. andc r10,r11,r8
  28. isync
  29. mtspr HID0,r8
  30. sync
  31. isync
  32. mtspr HID0,r10
  33. sync
  34. isync
  35. mr r11,r3 /* Save pointer to residual/board data */
  36. mr      r25,r5 /* Save OFW pointer */
  37. /* Save the original MSR value */
  38. mfmsr r26
  39. /* Establish default MSR value */
  40. li r3,MSR_IP|MSR_FP
  41. mtmsr r3
  42. /* compute the size of the whole image in words. */
  43. lis r4,start@h
  44. ori r4,r4,start@l
  45. lis r5,end@h
  46. ori r5,r5,end@l
  47. addi r5,r5,3 /* round up */
  48. sub r5,r5,r4 /* end - start */
  49. srwi r5,r5,2
  50. mr r7,r5 /* Save for later use. */
  51. /* check if we need to relocate ourselves to the link addr or were
  52.  * we loaded there to begin with -- Cort */
  53. mflr r3
  54. subi r3,r3,4 /* we get the nip, not the ip of the branch */
  55. mr r8,r3
  56. cmp 0,r3,r4
  57. beq start_ldr /* If 0, we don't need to relocate */
  58. /*
  59.  * no matter where we're loaded, move ourselves to -Ttext address
  60.  */
  61. relocate:
  62. mflr r3 /* Compute code bias */
  63. subi r3,r3,4
  64. mr r8,r3
  65. lis r4,start@h
  66. ori r4,r4,start@l
  67. mr r5,r7 /* Get the # of longwords again */
  68. mtctr r5 /* Setup for loop */
  69. li r6,0
  70. subi r3,r3,4
  71. subi r4,r4,4
  72. 00: lwzu r5,4(r3)
  73. stwu r5,4(r4)
  74. xor r6,r6,r5
  75. bdnz 00b
  76.    lis r3,start_ldr@h
  77. ori r3,r3,start_ldr@l
  78. mtlr r3 /* Easiest way to do an absolute jump */
  79. blr
  80. start_ldr:
  81. /* Some boards don't boot up with the I-cache enabled.  Do that
  82.  * now because the decompress runs much faster that way.
  83.  * As a side effect, we have to ensure the data cache is not enabled
  84.  * so we can access the serial I/O without trouble.
  85.  */
  86. bl flush_instruction_cache
  87. /* Clear all of BSS */
  88. lis r3,edata@h
  89. ori r3,r3,edata@l
  90. lis r4,end@h
  91. ori r4,r4,end@l
  92. subi r3,r3,4
  93. subi r4,r4,4
  94. li r0,0
  95. 50: stwu r0,4(r3)
  96. cmp 0,r3,r4
  97. bne 50b
  98. 90: mr r9,r1 /* Save old stack pointer (in case it matters) */
  99. lis r1,.stack@h
  100. ori r1,r1,.stack@l
  101. addi r1,r1,4096*2
  102. subi r1,r1,256
  103. li r2,0x000F /* Mask pointer to 16-byte boundary */
  104. andc r1,r1,r2
  105. /* Store the original MSR into 'orig_MSR' */
  106. lis r3,orig_MSR@h
  107. ori r3,r3,orig_MSR@l
  108. stw r26,0(r3)
  109. /* Run loader */
  110. mr r3,r8 /* Load point */
  111. mr r4,r7 /* Program length */
  112. mr r5,r6 /* Checksum */
  113. mr r6,r11 /* Residual data */
  114. mr      r7,r25                  /* OFW interfaces */
  115. bl decompress_kernel
  116. /*
  117.  * We have to do this after decompress_kernel, just to make
  118.  * sure we don't wipe out things mapped in BATs which we need.
  119.  * -- Tom
  120.  */
  121. li      r6,0
  122. /* Test for a 601 */
  123. mfspr r9,PVR
  124. srwi r9,r9,16
  125. cmpi 0,r9,1          /* 601 ? */
  126. beq .clearbats_601
  127. /* Clear BATS */
  128. mtspr   DBAT0U,r6
  129. mtspr DBAT0L,r6
  130. mtspr   DBAT1U,r6
  131. mtspr DBAT1L,r6
  132. mtspr   DBAT2U,r6
  133. mtspr DBAT2L,r6
  134. mtspr   DBAT3U,r6
  135. mtspr DBAT3L,r6
  136. .clearbats_601:
  137. mtspr   IBAT0U,r6
  138. mtspr IBAT0L,r6
  139. mtspr   IBAT1U,r6
  140. mtspr IBAT1L,r6
  141. mtspr IBAT2U,r6
  142. mtspr   IBAT2L,r6
  143. mtspr   IBAT3U,r6
  144. mtspr IBAT3L,r6
  145. isync
  146. sync
  147. sync
  148. /* Set segment registers */
  149. li r6,16 /* load up segment register values */
  150. mtctr r6 /* for context 0 */
  151. lis r6,0x2000 /* Ku = 1, VSID = 0 */
  152. li r10,0
  153. 3: mtsrin r6,r10
  154. addi r6,r6,0x111 /* increment VSID */
  155. addis r10,r10,0x1000 /* address of next segment */
  156. bdnz 3b
  157. /* tell kernel we're prep, by putting 0xdeadc0de at KERNELLOAD,
  158.  * and tell the kernel to start on the 4th instruction since we
  159.  * overwrite the first 3 sometimes (which are 'nop').
  160.  */
  161. li r9,0xc
  162. mtlr r9
  163. lis r10,0xdeadc0de@h
  164. ori r10,r10,0xdeadc0de@l
  165. li r9,0
  166. stw r10,0(r9)
  167. blr
  168. .comm .stack,4096*2,4