boot.s 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #
  2. /*
  3. * Raspberry Pi support library for the ACK
  4. * © 2013 David Given
  5. * This file is redistributable under the terms of the 3-clause BSD license.
  6. * See the file 'Copying' in the root of the distribution for the full text.
  7. */
  8. ! Declare segments (the order is important).
  9. .sect .text
  10. .sect .rom
  11. .sect .data
  12. .sect .bss
  13. .sect .text
  14. #define gp r15
  15. #define STACKSIZE 1*1024
  16. ! MAIN ENTRY POINT
  17. begtext:
  18. ! This empty space is required by the boot loader.
  19. kernel_start:
  20. ! When running as a kernel, we need to preserve all registers. We save
  21. ! them onto the default stack.
  22. push r0-r24
  23. b baremetal_start
  24. .space 506 ! first 512 bytes are ignored by the boot loader
  25. baremetal_start:
  26. ! Wipe the bss (including the new stack).
  27. lea r6, begbss
  28. lea r7, endbss
  29. mov r8, #0
  30. _1:
  31. stb r8, (r6)
  32. addcmpb.lt r6, #1, r7, _1
  33. ! Save system registers.
  34. st fp, .returnfp
  35. st sp, .returnsp
  36. st lr, .returnlr
  37. lea gp, begtext
  38. lea sp, .stack + STACKSIZE
  39. ! Save the kernel parameters.
  40. sub r0, gp ! fix up pointer
  41. sub r1, gp ! fix up pointer
  42. sub r2, gp ! fix up pointer
  43. sub r3, gp ! fix up pointer
  44. push r0-r5
  45. sub r0, sp, gp
  46. st r0, _pi_kernel_parameters
  47. ! Push standard parameters onto the stack and go.
  48. mov r0, #0
  49. push r0 ! envp
  50. push r0 ! argv
  51. push r0 ! argc
  52. ! Call the language startup code.
  53. bl __m_a_i_n
  54. ! Fall through to __exit if this returns.
  55. .define __exit
  56. __exit:
  57. ! It only makes sense to get here if we're in kernel mode. If we're in
  58. ! bare-metal mode, we'll just crash, but that's fine.
  59. st r0, _pi_kernel_parameters ! save return value
  60. mov r0, sr
  61. ld fp, .returnfp
  62. ld sp, .returnsp
  63. ld lr, .returnlr
  64. pop r0-r24
  65. ld r0, _pi_kernel_parameters ! restore return value
  66. b lr
  67. ! Define symbols at the beginning of our various segments, so that we can find
  68. ! them. (Except .text, which has already been done.)
  69. .define begtext, begdata, begbss
  70. .sect .data; begdata:
  71. .sect .rom; begrom:
  72. .sect .bss; begbss:
  73. ! Some magic data. All EM systems need these.
  74. .define .trppc, .ignmask, _errno
  75. .comm .trppc, 4
  76. .comm .ignmask, 4
  77. .comm _errno, 4
  78. ! We store the stack pointer and return address on entry so that we can
  79. ! cleanly exit.
  80. .comm .returnfp, 4
  81. .comm .returnsp, 4
  82. .comm .returnlr, 4
  83. .define _pi_kernel_parameters
  84. .comm _pi_kernel_parameters, 4
  85. .define .linenumber, .filename
  86. .comm .linenumber, 4 ! current linenumber (used for debugging)
  87. .comm .filename, 4 ! ptr to current filename (used for debugging)
  88. ! User stack.
  89. .comm .stack, STACKSIZE