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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/boot/bootp/init.S
  3.  *
  4.  *  Copyright (C) 2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Header file for splitting kernel + initrd.  Note that we pass
  11.  *  r0 through to r3 straight through.
  12.  */
  13. .section .start,#alloc,#execinstr
  14. .type _entry, #function
  15. _entry: adr r10, initdata
  16. ldr r11, initdata
  17. sub r11, r10, r11 @ work out exec offset
  18. b splitify
  19. .size _entry,. - _entry
  20. .type initdata, #object
  21. initdata: .word initdata @ compiled address of this
  22. .size initdata,. - initdata
  23. .text
  24. splitify: adr r13, data
  25. ldmia r13!, {r4-r6} @ move the initrd
  26. add r4, r4, r11 @ correction
  27. bl move
  28. ldmia r13!, {r4-r6} @ then the kernel
  29. mov r12, r5
  30. add r4, r4, r11 @ correction
  31. bl move
  32. /*
  33.  * Setup the initrd parameters to pass to the kernel.  This can either be
  34.  * passed in via a param_struct or a tag list.  We spot the param_struct
  35.  * method by looking at the first word; this should either indicate a page
  36.  * size of 4K, 16K or 32K.
  37.  */
  38. ldmia r13, {r4-r8} @ get size and addr of initrd
  39. @ r5 = ATAG_INITRD
  40. @ r6 = initrd start
  41. @ r7 = initrd end
  42. @ r8 = param_struct address
  43. ldr r9, [r8, #0] @ no param struct?
  44. teq r9, #0x1000 @ 4K?
  45. teqne r9, #0x4000 @ 16K?
  46. teqne r9, #0x8000 @ 32K?
  47. beq param_struct
  48. ldr r9, [r8, #4] @ get first tag
  49. teq r9, r4
  50. bne taglist @ ok, we have a tag list
  51. /*
  52.  * We didn't find a valid tag list - create one.
  53.  */
  54. str r4, [r8, #4]
  55. mov r4, #8
  56. str r4, [r8, #0]
  57. mov r4, #0
  58. str r4, [r8, #8]
  59. /*
  60.  * find the end of the tag list, and then add an INITRD tag on the end.
  61.  * If there is already an INITRD tag, then we ignore it; the last INITRD
  62.  * tag takes precidence.
  63.  */
  64. taglist: ldr r9, [r8, #0] @ tag length
  65. teq r9, #0 @ last tag?
  66. addne r8, r8, r9
  67. bne taglist
  68. mov r4, #16 @ length of initrd tag
  69. mov r9, #0 @ end of tag list terminator
  70. stmia r8, {r4, r5, r6, r7, r9}
  71. mov pc, r12 @ call kernel
  72. /*
  73.  * We found a param struct.  Modify the param struct for the initrd
  74.  */
  75. param_struct: add r8, r8, #16*4
  76. stmia r8, {r6,r7} @ save in param_struct
  77. mov pc, r12 @ call kernel
  78. move: ldmia r4!, {r7 - r10} @ move 32-bytes at a time
  79. stmia r5!, {r7 - r10}
  80. ldmia r4!, {r7 - r10}
  81. stmia r5!, {r7 - r10}
  82. subs r6, r6, #8 * 4
  83. bcs move
  84. mov pc, lr
  85. data: .word initrd_start
  86. .word initrd_addr
  87. .word initrd_len
  88. .word kernel_start
  89. .word kernel_addr
  90. .word kernel_len
  91. .word 0x54410001 @ r4 = ATAG_CORE
  92. .word 0x54420005 @ r5 = ATAG_INITRD
  93. .word initrd_addr @ r6
  94. .word initrd_len @ r7
  95. .word params @ r8
  96. .type kernel_start,#object
  97. .type initrd_start,#object