boot_entry_v8m.S 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
  2. * All rights reserved.
  3. *
  4. * This software is supplied "AS IS" without any warranties.
  5. * RDA assumes no responsibility or liability for the use of the software,
  6. * conveys no license or title under any patent, copyright, or mask work
  7. * right to the product. RDA reserves the right to make changes in the
  8. * software without notification. RDA also make no representation or
  9. * warranty that such application will be suitable for the specified use
  10. * without further testing or modification.
  11. */
  12. #include "boot_config.h"
  13. // Refer to halArmv8mRegs_t
  14. #define OFFSET_R4 (4 * 4)
  15. #define OFFSET_S0 (16 * 4)
  16. #define OFFSET_FPSCR (49 * 4)
  17. #define OFFSET_CURR_XPSR (50 * 4)
  18. #define OFFSET_EXC_RETURN (51 * 4)
  19. #define OFFSET_CONTROL (52 * 4)
  20. #define OFFSET_BASEPRI (53 * 4)
  21. #define OFFSET_PRIMASK (54 * 4)
  22. #define OFFSET_FAULTMASK (55 * 4)
  23. #define OFFSET_MSP (56 * 4)
  24. #define OFFSET_PSP (57 * 4)
  25. #define OFFSET_MSPLIM (58 * 4)
  26. #define OFFSET_PSPLIM (59 * 4)
  27. .syntax unified
  28. .section BOOT_ENTRY, "x"
  29. // ====================================================================
  30. // Macro for hander address
  31. // ====================================================================
  32. .macro HANDLER_ADDRESS num
  33. .long bootIrqHandler\num
  34. .endm
  35. // ====================================================================
  36. // Macro for irq handlers, call bootIrqHandler(irqn)
  37. // ====================================================================
  38. .macro HANDLER num
  39. .type bootIrqHandler\num, %function
  40. .thumb_func
  41. bootIrqHandler\num:
  42. MOVS r0, #\num
  43. B bootIrqHandler
  44. .size bootIrqHandler\num, .-bootIrqHandler\num
  45. .endm
  46. // ====================================================================
  47. // Vectors. Put at the beginning to make alignment easier.
  48. // ====================================================================
  49. .align 11
  50. .type vectors, %function
  51. vectors:
  52. .long __process_stack_end
  53. .long nvicBlueScreenHandler // reset
  54. .long nvicBlueScreenHandler // NMI
  55. .long nvicBlueScreenHandler // hard fault
  56. .long nvicBlueScreenHandler // mem manage
  57. .long nvicBlueScreenHandler // bus fault
  58. .long nvicBlueScreenHandler // usage fault
  59. .long nvicBlueScreenHandler // reserved
  60. .long nvicBlueScreenHandler // reserved
  61. .long nvicBlueScreenHandler // reserved
  62. .long nvicBlueScreenHandler // reserved
  63. .long nvicBlueScreenHandler // SVC
  64. .long nvicBlueScreenHandler // debug monitor
  65. .long nvicBlueScreenHandler // reserved
  66. .long nvicBlueScreenHandler // PendSV
  67. .long nvicBlueScreenHandler // sys tick
  68. // Macro to insert all handler address
  69. .altmacro
  70. .set i, 0
  71. .rept 86
  72. HANDLER_ADDRESS %i
  73. .set i, i+1
  74. .endr
  75. .size vectors, .-vectors
  76. // ====================================================================
  77. // Macro to generate all handlres
  78. // ====================================================================
  79. .altmacro
  80. .set i, 0
  81. .rept 86
  82. HANDLER %i
  83. .set i, i+1
  84. .endr
  85. // ====================================================================
  86. // Blue screen handler
  87. // ====================================================================
  88. .type nvicBlueScreenHandler, %function
  89. .thumb_func
  90. nvicBlueScreenHandler:
  91. LDR r0, =gBlueScreenRegs
  92. ADD r1, r0, #OFFSET_R4
  93. STM r1, {r4-r11}
  94. STR r14, [r0, #OFFSET_EXC_RETURN]
  95. MRS r2, psp
  96. MRS r3, msp
  97. STR r2, [r0, #OFFSET_PSP]
  98. STR r3, [r0, #OFFSET_MSP]
  99. MRS r2, psplim
  100. MRS r3, msplim
  101. STR r2, [r0, #OFFSET_PSPLIM]
  102. STR r3, [r0, #OFFSET_MSPLIM]
  103. MRS r2, primask
  104. MRS r3, basepri
  105. STR r2, [r0, #OFFSET_PRIMASK]
  106. STR r3, [r0, #OFFSET_BASEPRI]
  107. MRS r2, faultmask
  108. MRS r3, control
  109. STR r2, [r0, #OFFSET_FAULTMASK]
  110. STR r3, [r0, #OFFSET_CONTROL]
  111. MRS r2, xpsr
  112. VMRS r3, fpscr
  113. STR r2, [r0, #OFFSET_CURR_XPSR]
  114. STR r3, [r0, #OFFSET_FPSCR]
  115. ADD r1, r0, #OFFSET_S0
  116. VSTM r1, {s0-s31}
  117. BL bootBlueScreen
  118. .ltorg
  119. .size nvicBlueScreenHandler, .-nvicBlueScreenHandler
  120. // ====================================================================
  121. // Entry of bootloader or fdl
  122. // ====================================================================
  123. .global bootEntry
  124. .func bootEntry
  125. .thumb_func
  126. bootEntry:
  127. CPSID i
  128. DSB
  129. ISB
  130. LDR r3, =0xe000ed08 // SCB->VTOR
  131. LDR r2, =vectors
  132. STR r2, [r3]
  133. LDR r2, =__main_stack_end
  134. LDR r3, =__process_stack_end
  135. MSR msp, r2
  136. MSR psp, r3
  137. LDR r2, =__main_stack_start
  138. LDR r3, =__process_stack_start
  139. MSR msplim, r2
  140. MSR psplim, r3
  141. MOV r2, #2
  142. MSR CONTROL, r2
  143. ISB
  144. BL bootStart // never return
  145. .size bootEntry, .-bootEntry
  146. .endfunc