start_iar.S 9.6 KB

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