start_iar.S 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. ;/*
  2. ; * Copyright (c) 2006-2022, RT-Thread Development Team
  3. ; *
  4. ; * SPDX-License-Identifier: Apache-2.0
  5. ; *
  6. ; * Change Logs:
  7. ; * Date Author Notes
  8. ; * 2024-03-11 Wangyuqiang first version
  9. ; */
  10. ;@-------------------------------------------------------------------------------
  11. ;@ sys_core.asm
  12. ;@
  13. ;@ (c) Texas Instruments 2009-2013, All rights reserved.
  14. ;@
  15. ; Constants
  16. Mode_USR EQU 0x10
  17. Mode_FIQ EQU 0x11
  18. Mode_IRQ EQU 0x12
  19. Mode_SVC EQU 0x13
  20. Mode_ABT EQU 0x17
  21. Mode_UND EQU 0x1B
  22. Mode_SYS EQU 0x1F
  23. I_Bit EQU 0x80
  24. F_Bit EQU 0x40
  25. UND_Stack_Size EQU 0x00000000
  26. SVC_Stack_Size EQU 0x00000000
  27. ABT_Stack_Size EQU 0x00000000
  28. FIQ_Stack_Size EQU 0x00001000
  29. IRQ_Stack_Size EQU 0x00001000
  30. IMPORT _c_int00
  31. IMPORT rt_hw_trap_svc
  32. IMPORT rt_hw_trap_pabt
  33. IMPORT rt_hw_trap_dabt
  34. IMPORT rt_hw_trap_resv
  35. IMPORT system_init
  36. IMPORT __iar_program_start
  37. ; Define sections
  38. SECTION .text:CODE:REORDER:NOROOT(2)
  39. ; Define stack start and top
  40. EXPORT stack_start
  41. EXPORT stack_top
  42. ; Align stack start to a 4-byte boundary (32-bit word)
  43. ALIGNRAM 5
  44. stack_start:
  45. ; Reserve stack memory
  46. REPT (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size)
  47. DCB 0 ; Define a byte of data and clear it to zero
  48. ENDR
  49. ; Define stack top label
  50. stack_top:
  51. ; Define code section
  52. SECTION .text:CODE:REORDER:NOROOT(2)
  53. ; Specify ARM mode
  54. THUMB
  55. ;@-------------------------------------------------------------------------------
  56. ;@ Enable RAM ECC Support
  57. EXPORT _coreEnableRamEcc_
  58. _coreEnableRamEcc_:
  59. stmfd sp!, {r0}
  60. mrc p15, #0x00, r0, c1, c0, #0x01
  61. orr r0, r0, #0x0C000000
  62. mcr p15, #0x00, r0, c1, c0, #0x01
  63. ldmfd sp!, {r0}
  64. bx lr
  65. ;@-------------------------------------------------------------------------------
  66. ;@ Disable RAM ECC Support
  67. EXPORT _coreDisableRamEcc_
  68. _coreDisableRamEcc_:
  69. stmfd sp!, {r0}
  70. mrc p15, #0x00, r0, c1, c0, #0x01
  71. bic r0, r0, #0x0C000000
  72. mcr p15, #0x00, r0, c1, c0, #0x01
  73. ldmfd sp!, {r0}
  74. bx lr
  75. ;@-------------------------------------------------------------------------------
  76. ;@ Enable Flash ECC Support
  77. EXPORT _coreEnableFlashEcc_
  78. _coreEnableFlashEcc_:
  79. stmfd sp!, {r0}
  80. mrc p15, #0x00, r0, c1, c0, #0x01
  81. orr r0, r0, #0x02000000
  82. dmb
  83. mcr p15, #0x00, r0, c1, c0, #0x01
  84. ldmfd sp!, {r0}
  85. bx lr
  86. ;@-------------------------------------------------------------------------------
  87. ;@ Disable Flash ECC Support
  88. EXPORT _coreDisableFlashEcc_
  89. _coreDisableFlashEcc_:
  90. stmfd sp!, {r0}
  91. mrc p15, #0x00, r0, c1, c0, #0x01
  92. bic r0, r0, #0x02000000
  93. mcr p15, #0x00, r0, c1, c0, #0x01
  94. ldmfd sp!, {r0}
  95. bx lr
  96. ;@-------------------------------------------------------------------------------
  97. ;@ Get data fault status register
  98. EXPORT _coreGetDataFault_
  99. _coreGetDataFault_:
  100. mrc p15, #0, r0, c5, c0, #0
  101. bx lr
  102. ;@-------------------------------------------------------------------------------
  103. ;@ Clear data fault status register
  104. EXPORT _coreClearDataFault_
  105. _coreClearDataFault_:
  106. stmfd sp!, {r0}
  107. mov r0, #0
  108. mcr p15, #0, r0, c5, c0, #0
  109. ldmfd sp!, {r0}
  110. bx lr
  111. ;@-------------------------------------------------------------------------------
  112. ;@ Get instruction fault status register
  113. EXPORT _coreGetInstructionFault_
  114. _coreGetInstructionFault_:
  115. mrc p15, #0, r0, c5, c0, #1
  116. bx lr
  117. ;@-------------------------------------------------------------------------------
  118. ;@ Clear instruction fault status register
  119. EXPORT _coreClearInstructionFault_
  120. _coreClearInstructionFault_:
  121. stmfd sp!, {r0}
  122. mov r0, #0
  123. mcr p15, #0, r0, c5, c0, #1
  124. ldmfd sp!, {r0}
  125. bx lr
  126. ;@-------------------------------------------------------------------------------
  127. ;@ Get data fault address register
  128. EXPORT _coreGetDataFaultAddress_
  129. _coreGetDataFaultAddress_:
  130. mrc p15, #0, r0, c6, c0, #0
  131. bx lr
  132. ;@-------------------------------------------------------------------------------
  133. ;@ Clear data fault address register
  134. EXPORT _coreClearDataFaultAddress_
  135. _coreClearDataFaultAddress_:
  136. stmfd sp!, {r0}
  137. mov r0, #0
  138. mcr p15, #0, r0, c6, c0, #0
  139. ldmfd sp!, {r0}
  140. bx lr
  141. ;@-------------------------------------------------------------------------------
  142. ;@ Get instruction fault address register
  143. EXPORT _coreGetInstructionFaultAddress_
  144. _coreGetInstructionFaultAddress_:
  145. mrc p15, #0, r0, c6, c0, #2
  146. bx lr
  147. ;@-------------------------------------------------------------------------------
  148. ;@ Clear instruction fault address register
  149. EXPORT _coreClearInstructionFaultAddress_
  150. _coreClearInstructionFaultAddress_:
  151. stmfd sp!, {r0}
  152. mov r0, #0
  153. mcr p15, #0, r0, c6, c0, #2
  154. ldmfd sp!, {r0}
  155. bx lr
  156. ;@-------------------------------------------------------------------------------
  157. ;@ Get auxiliary data fault status register
  158. EXPORT _coreGetAuxiliaryDataFault_
  159. _coreGetAuxiliaryDataFault_:
  160. mrc p15, #0, r0, c5, c1, #0
  161. bx lr
  162. ;@-------------------------------------------------------------------------------
  163. ;@ Clear auxiliary data fault status register
  164. EXPORT _coreClearAuxiliaryDataFault_
  165. _coreClearAuxiliaryDataFault_:
  166. stmfd sp!, {r0}
  167. mov r0, #0
  168. mcr p15, #0, r0, c5, c1, #0
  169. ldmfd sp!, {r0}
  170. bx lr
  171. ;@-------------------------------------------------------------------------------
  172. ;@ Get auxiliary instruction fault status register
  173. EXPORT _coreGetAuxiliaryInstructionFault_
  174. _coreGetAuxiliaryInstructionFault_:
  175. mrc p15, #0, r0, c5, c1, #1
  176. bx lr
  177. ;@-------------------------------------------------------------------------------
  178. ;@ Clear auxiliary instruction fault status register
  179. EXPORT _coreClearAuxiliaryInstructionFault_
  180. _coreClearAuxiliaryInstructionFault_:
  181. stmfd sp!, {r0}
  182. mov r0, #0
  183. mrc p15, #0, r0, c5, c1, #1
  184. ldmfd sp!, {r0}
  185. bx lr
  186. ;@-------------------------------------------------------------------------------
  187. ;@ Work Around for Errata CORTEX-R4#57:
  188. ;@
  189. ;@ Errata Description:
  190. ;@ Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags
  191. ;@ Workaround:
  192. ;@ Disable out-of-order single-precision floating point
  193. ;@ multiply-accumulate instruction completion
  194. EXPORT _errata_CORTEXR4_57_
  195. _errata_CORTEXR4_57_:
  196. push {r0}
  197. mrc p15, #0, r0, c15, c0, #0 ;@ Read Secondary Auxiliary Control Register
  198. orr r0, r0, #0x10000 ;@ Set BIT 16 (Set DOOFMACS)
  199. mcr p15, #0, r0, c15, c0, #0 ;@ Write Secondary Auxiliary Control Register
  200. pop {r0}
  201. bx lr
  202. ;@-------------------------------------------------------------------------------
  203. ;@ Work Around for Errata CORTEX-R4#66:
  204. ;@
  205. ;@ Errata Description:
  206. ;@ Register Corruption During A Load-Multiple Instruction At
  207. ;@ an Exception Vector
  208. ;@ Workaround:
  209. ;@ Disable out-of-order completion for divide instructions in
  210. ;@ Auxiliary Control register
  211. EXPORT _errata_CORTEXR4_66_
  212. _errata_CORTEXR4_66_:
  213. push {r0}
  214. mrc p15, #0, r0, c1, c0, #1 ;@ Read Auxiliary Control register
  215. orr r0, r0, #0x80 ;@ Set BIT 7 (Disable out-of-order completion
  216. ;@ for divide instructions.)
  217. mcr p15, #0, r0, c1, c0, #1 ;@ Write Auxiliary Control register
  218. pop {r0}
  219. bx lr
  220. EXPORT turnon_VFP
  221. turnon_VFP:
  222. ;@ Enable FPV
  223. stmdb sp!, {r0}
  224. fmrx r0, fpexc
  225. orr r0, r0, #0x40000000
  226. fmxr fpexc, r0
  227. ldmia sp!, {r0}
  228. subs pc, lr, #4
  229. macro push_svc_reg
  230. sub sp, sp, #17 * 4 ;@/* Sizeof(struct rt_hw_exp_stack) */
  231. stmia sp, {r0 - r12} ;@/* Calling r0-r12 */
  232. mov r0, sp
  233. mrs r6, spsr ;@/* Save CPSR */
  234. str lr, [r0, #15*4] ;@/* Push PC */
  235. str r6, [r0, #16*4] ;@/* Push CPSR */
  236. cps #Mode_SVC
  237. str sp, [r0, #13*4] ;@/* Save calling SP */
  238. str lr, [r0, #14*4] ;@/* Save calling PC */
  239. endm
  240. EXPORT SVC_Handler
  241. SVC_Handler:
  242. push_svc_reg
  243. bl rt_hw_trap_svc
  244. b .
  245. EXPORT Prefetch_Handler
  246. Prefetch_Handler:
  247. push_svc_reg
  248. bl rt_hw_trap_pabt
  249. b .
  250. EXPORT Abort_Handler
  251. Abort_Handler:
  252. push_svc_reg
  253. bl rt_hw_trap_dabt
  254. b .
  255. EXPORT Reserved_Handler
  256. Reserved_Handler:
  257. push_svc_reg
  258. bl rt_hw_trap_resv
  259. b .
  260. END