start_gcc.S 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  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. */
  9. @-------------------------------------------------------------------------------
  10. @ sys_core.asm
  11. @
  12. @ (c) Texas Instruments 2009-2013, All rights reserved.
  13. @
  14. #include <rtconfig.h>
  15. .equ Mode_USR, 0x10
  16. .equ Mode_FIQ, 0x11
  17. .equ Mode_IRQ, 0x12
  18. .equ Mode_SVC, 0x13
  19. .equ Mode_ABT, 0x17
  20. .equ Mode_UND, 0x1B
  21. .equ Mode_SYS, 0x1F
  22. .equ I_Bit, 0x80 @ when I bit is set, IRQ is disabled
  23. .equ F_Bit, 0x40 @ when F bit is set, FIQ is disabled
  24. .equ UND_Stack_Size, 0x00000000
  25. .equ SVC_Stack_Size, 0x00000000
  26. .equ ABT_Stack_Size, 0x00000000
  27. .equ FIQ_Stack_Size, 0x00001000
  28. .equ IRQ_Stack_Size, 0x00001000
  29. .section .bss.noinit
  30. /* stack */
  31. .globl stack_start
  32. .globl stack_top
  33. .align 3
  34. stack_start:
  35. .rept (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size)
  36. .byte 0
  37. .endr
  38. stack_top:
  39. .section .text, "ax"
  40. .text
  41. .arm
  42. .globl _c_int00
  43. .globl _reset
  44. _reset:
  45. @-------------------------------------------------------------------------------
  46. @ Initialize CPU Registers
  47. @ After reset, the CPU is in the Supervisor mode (M = 10011)
  48. mov r0, #0x0000
  49. mov r1, #0x0000
  50. mov r2, #0x0000
  51. mov r3, #0x0000
  52. mov r4, #0x0000
  53. mov r5, #0x0000
  54. mov r6, #0x0000
  55. mov r7, #0x0000
  56. mov r8, #0x0000
  57. mov r9, #0x0000
  58. mov r10, #0x0000
  59. mov r11, #0x0000
  60. mov r12, #0x0000
  61. mov r13, #0x0000
  62. mrs r1, cpsr
  63. msr spsr_cxsf, r1
  64. cpsid if, #19
  65. #if defined (__VFP_FP__) && !defined(__SOFTFP__) && defined(RT_VFP_LAZY_STACKING)
  66. @ Turn on FPV coprocessor
  67. mrc p15, #0x00, r2, c1, c0, #0x02
  68. orr r2, r2, #0xF00000
  69. mcr p15, #0x00, r2, c1, c0, #0x02
  70. fmrx r2, fpexc
  71. orr r2, r2, #0x40000000
  72. fmxr fpexc, r2
  73. #endif
  74. @-------------------------------------------------------------------------------
  75. @ Initialize Stack Pointers
  76. ldr r0, =stack_top
  77. @ Set the startup stack for svc
  78. mov sp, r0
  79. @ Enter Undefined Instruction Mode and set its Stack Pointer
  80. msr cpsr_c, #Mode_UND|I_Bit|F_Bit
  81. mov sp, r0
  82. sub r0, r0, #UND_Stack_Size
  83. @ Enter Abort Mode and set its Stack Pointer
  84. msr cpsr_c, #Mode_ABT|I_Bit|F_Bit
  85. mov sp, r0
  86. sub r0, r0, #ABT_Stack_Size
  87. @ Enter FIQ Mode and set its Stack Pointer
  88. msr cpsr_c, #Mode_FIQ|I_Bit|F_Bit
  89. mov sp, r0
  90. sub r0, r0, #FIQ_Stack_Size
  91. @ Enter IRQ Mode and set its Stack Pointer
  92. msr cpsr_c, #Mode_IRQ|I_Bit|F_Bit
  93. mov sp, r0
  94. sub r0, r0, #IRQ_Stack_Size
  95. @ Switch back to SVC
  96. msr cpsr_c, #Mode_SVC|I_Bit|F_Bit
  97. bl next1
  98. next1:
  99. bl next2
  100. next2:
  101. bl next3
  102. next3:
  103. bl next4
  104. next4:
  105. ldr lr, =_c_int00
  106. bx lr
  107. .globl data_init
  108. data_init:
  109. /* copy .data to SRAM */
  110. ldr r1, =_sidata /* .data start in image */
  111. ldr r2, =_edata /* .data end in image */
  112. ldr r3, =_sdata /* sram data start */
  113. data_loop:
  114. ldr r0, [r1, #0]
  115. str r0, [r3]
  116. add r1, r1, #4
  117. add r3, r3, #4
  118. cmp r3, r2 /* check if data to clear */
  119. blo data_loop /* loop until done */
  120. /* clear .bss */
  121. mov r0,#0 /* get a zero */
  122. ldr r1,=__bss_start /* bss start */
  123. ldr r2,=__bss_end /* bss end */
  124. bss_loop:
  125. cmp r1,r2 /* check if data to clear */
  126. strlo r0,[r1],#4 /* clear 4 bytes */
  127. blo bss_loop /* loop until done */
  128. /* call C++ constructors of global objects */
  129. ldr r0, =__ctors_start__
  130. ldr r1, =__ctors_end__
  131. ctor_loop:
  132. cmp r0, r1
  133. beq ctor_end
  134. ldr r2, [r0], #4
  135. stmfd sp!, {r0-r3, ip, lr}
  136. mov lr, pc
  137. bx r2
  138. ldmfd sp!, {r0-r3, ip, lr}
  139. b ctor_loop
  140. ctor_end:
  141. bx lr
  142. @-------------------------------------------------------------------------------
  143. @ Enable RAM ECC Support
  144. .globl _coreEnableRamEcc_
  145. _coreEnableRamEcc_:
  146. stmfd sp!, {r0}
  147. mrc p15, #0x00, r0, c1, c0, #0x01
  148. orr r0, r0, #0x0C000000
  149. mcr p15, #0x00, r0, c1, c0, #0x01
  150. ldmfd sp!, {r0}
  151. bx lr
  152. @-------------------------------------------------------------------------------
  153. @ Disable RAM ECC Support
  154. .globl _coreDisableRamEcc_
  155. _coreDisableRamEcc_:
  156. stmfd sp!, {r0}
  157. mrc p15, #0x00, r0, c1, c0, #0x01
  158. bic r0, r0, #0x0C000000
  159. mcr p15, #0x00, r0, c1, c0, #0x01
  160. ldmfd sp!, {r0}
  161. bx lr
  162. @-------------------------------------------------------------------------------
  163. @ Enable Flash ECC Support
  164. .globl _coreEnableFlashEcc_
  165. _coreEnableFlashEcc_:
  166. stmfd sp!, {r0}
  167. mrc p15, #0x00, r0, c1, c0, #0x01
  168. orr r0, r0, #0x02000000
  169. dmb
  170. mcr p15, #0x00, r0, c1, c0, #0x01
  171. ldmfd sp!, {r0}
  172. bx lr
  173. @-------------------------------------------------------------------------------
  174. @ Disable Flash ECC Support
  175. .globl _coreDisableFlashEcc_
  176. _coreDisableFlashEcc_:
  177. stmfd sp!, {r0}
  178. mrc p15, #0x00, r0, c1, c0, #0x01
  179. bic r0, r0, #0x02000000
  180. mcr p15, #0x00, r0, c1, c0, #0x01
  181. ldmfd sp!, {r0}
  182. bx lr
  183. @-------------------------------------------------------------------------------
  184. @ Get data fault status register
  185. .globl _coreGetDataFault_
  186. _coreGetDataFault_:
  187. mrc p15, #0, r0, c5, c0, #0
  188. bx lr
  189. @-------------------------------------------------------------------------------
  190. @ Clear data fault status register
  191. .globl _coreClearDataFault_
  192. _coreClearDataFault_:
  193. stmfd sp!, {r0}
  194. mov r0, #0
  195. mcr p15, #0, r0, c5, c0, #0
  196. ldmfd sp!, {r0}
  197. bx lr
  198. @-------------------------------------------------------------------------------
  199. @ Get instruction fault status register
  200. .globl _coreGetInstructionFault_
  201. _coreGetInstructionFault_:
  202. mrc p15, #0, r0, c5, c0, #1
  203. bx lr
  204. @-------------------------------------------------------------------------------
  205. @ Clear instruction fault status register
  206. .globl _coreClearInstructionFault_
  207. _coreClearInstructionFault_:
  208. stmfd sp!, {r0}
  209. mov r0, #0
  210. mcr p15, #0, r0, c5, c0, #1
  211. ldmfd sp!, {r0}
  212. bx lr
  213. @-------------------------------------------------------------------------------
  214. @ Get data fault address register
  215. .globl _coreGetDataFaultAddress_
  216. _coreGetDataFaultAddress_:
  217. mrc p15, #0, r0, c6, c0, #0
  218. bx lr
  219. @-------------------------------------------------------------------------------
  220. @ Clear data fault address register
  221. .globl _coreClearDataFaultAddress_
  222. _coreClearDataFaultAddress_:
  223. stmfd sp!, {r0}
  224. mov r0, #0
  225. mcr p15, #0, r0, c6, c0, #0
  226. ldmfd sp!, {r0}
  227. bx lr
  228. @-------------------------------------------------------------------------------
  229. @ Get instruction fault address register
  230. .globl _coreGetInstructionFaultAddress_
  231. _coreGetInstructionFaultAddress_:
  232. mrc p15, #0, r0, c6, c0, #2
  233. bx lr
  234. @-------------------------------------------------------------------------------
  235. @ Clear instruction fault address register
  236. .globl _coreClearInstructionFaultAddress_
  237. _coreClearInstructionFaultAddress_:
  238. stmfd sp!, {r0}
  239. mov r0, #0
  240. mcr p15, #0, r0, c6, c0, #2
  241. ldmfd sp!, {r0}
  242. bx lr
  243. @-------------------------------------------------------------------------------
  244. @ Get auxiliary data fault status register
  245. .globl _coreGetAuxiliaryDataFault_
  246. _coreGetAuxiliaryDataFault_:
  247. mrc p15, #0, r0, c5, c1, #0
  248. bx lr
  249. @-------------------------------------------------------------------------------
  250. @ Clear auxiliary data fault status register
  251. .globl _coreClearAuxiliaryDataFault_
  252. _coreClearAuxiliaryDataFault_:
  253. stmfd sp!, {r0}
  254. mov r0, #0
  255. mcr p15, #0, r0, c5, c1, #0
  256. ldmfd sp!, {r0}
  257. bx lr
  258. @-------------------------------------------------------------------------------
  259. @ Get auxiliary instruction fault status register
  260. .globl _coreGetAuxiliaryInstructionFault_
  261. _coreGetAuxiliaryInstructionFault_:
  262. mrc p15, #0, r0, c5, c1, #1
  263. bx lr
  264. @-------------------------------------------------------------------------------
  265. @ Clear auxiliary instruction fault status register
  266. .globl _coreClearAuxiliaryInstructionFault_
  267. _coreClearAuxiliaryInstructionFault_:
  268. stmfd sp!, {r0}
  269. mov r0, #0
  270. mrc p15, #0, r0, c5, c1, #1
  271. ldmfd sp!, {r0}
  272. bx lr
  273. @-------------------------------------------------------------------------------
  274. @ Clear ESM CCM errorss
  275. .globl _esmCcmErrorsClear_
  276. _esmCcmErrorsClear_:
  277. stmfd sp!, {r0-r2}
  278. ldr r0, ESMSR1_REG @ load the ESMSR1 status register address
  279. ldr r2, ESMSR1_ERR_CLR
  280. str r2, [r0] @ clear the ESMSR1 register
  281. ldr r0, ESMSR2_REG @ load the ESMSR2 status register address
  282. ldr r2, ESMSR2_ERR_CLR
  283. str r2, [r0] @ clear the ESMSR2 register
  284. ldr r0, ESMSSR2_REG @ load the ESMSSR2 status register address
  285. ldr r2, ESMSSR2_ERR_CLR
  286. str r2, [r0] @ clear the ESMSSR2 register
  287. ldr r0, ESMKEY_REG @ load the ESMKEY register address
  288. mov r2, #0x5 @ load R2 with 0x5
  289. str r2, [r0] @ clear the ESMKEY register
  290. ldr r0, VIM_INTREQ @ load the INTREQ register address
  291. ldr r2, VIM_INT_CLR
  292. str r2, [r0] @ clear the INTREQ register
  293. ldr r0, CCMR4_STAT_REG @ load the CCMR4 status register address
  294. ldr r2, CCMR4_ERR_CLR
  295. str r2, [r0] @ clear the CCMR4 status register
  296. ldmfd sp!, {r0-r2}
  297. bx lr
  298. ESMSR1_REG: .word 0xFFFFF518
  299. ESMSR2_REG: .word 0xFFFFF51C
  300. ESMSR3_REG: .word 0xFFFFF520
  301. ESMKEY_REG: .word 0xFFFFF538
  302. ESMSSR2_REG: .word 0xFFFFF53C
  303. CCMR4_STAT_REG: .word 0xFFFFF600
  304. ERR_CLR_WRD: .word 0xFFFFFFFF
  305. CCMR4_ERR_CLR: .word 0x00010000
  306. ESMSR1_ERR_CLR: .word 0x80000000
  307. ESMSR2_ERR_CLR: .word 0x00000004
  308. ESMSSR2_ERR_CLR: .word 0x00000004
  309. VIM_INT_CLR: .word 0x00000001
  310. VIM_INTREQ: .word 0xFFFFFE20
  311. @-------------------------------------------------------------------------------
  312. @ Work Around for Errata CORTEX-R4#57:
  313. @
  314. @ Errata Description:
  315. @ Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags
  316. @ Workaround:
  317. @ Disable out-of-order single-precision floating point
  318. @ multiply-accumulate instruction completion
  319. .globl _errata_CORTEXR4_57_
  320. _errata_CORTEXR4_57_:
  321. push {r0}
  322. mrc p15, #0, r0, c15, c0, #0 @ Read Secondary Auxiliary Control Register
  323. orr r0, r0, #0x10000 @ Set BIT 16 (Set DOOFMACS)
  324. mcr p15, #0, r0, c15, c0, #0 @ Write Secondary Auxiliary Control Register
  325. pop {r0}
  326. bx lr
  327. @-------------------------------------------------------------------------------
  328. @ Work Around for Errata CORTEX-R4#66:
  329. @
  330. @ Errata Description:
  331. @ Register Corruption During A Load-Multiple Instruction At
  332. @ an Exception Vector
  333. @ Workaround:
  334. @ Disable out-of-order completion for divide instructions in
  335. @ Auxiliary Control register
  336. .globl _errata_CORTEXR4_66_
  337. _errata_CORTEXR4_66_:
  338. push {r0}
  339. mrc p15, #0, r0, c1, c0, #1 @ Read Auxiliary Control register
  340. orr r0, r0, #0x80 @ Set BIT 7 (Disable out-of-order completion
  341. @ for divide instructions.)
  342. mcr p15, #0, r0, c1, c0, #1 @ Write Auxiliary Control register
  343. pop {r0}
  344. bx lr
  345. .globl turnon_VFP
  346. turnon_VFP:
  347. @ Enable FPV
  348. STMDB sp!, {r0}
  349. fmrx r0, fpexc
  350. orr r0, r0, #0x40000000
  351. fmxr fpexc, r0
  352. LDMIA sp!, {r0}
  353. subs pc, lr, #4
  354. .macro push_svc_reg
  355. sub sp, sp, #17 * 4 @/* Sizeof(struct rt_hw_exp_stack) */
  356. stmia sp, {r0 - r12} @/* Calling r0-r12 */
  357. mov r0, sp
  358. mrs r6, spsr @/* Save CPSR */
  359. str lr, [r0, #15*4] @/* Push PC */
  360. str r6, [r0, #16*4] @/* Push CPSR */
  361. cps #Mode_SVC
  362. str sp, [r0, #13*4] @/* Save calling SP */
  363. str lr, [r0, #14*4] @/* Save calling PC */
  364. .endm
  365. .globl vector_svc
  366. vector_svc:
  367. push_svc_reg
  368. bl rt_hw_trap_svc
  369. b .
  370. .globl vector_pabort
  371. vector_pabort:
  372. push_svc_reg
  373. bl rt_hw_trap_pabt
  374. b .
  375. .globl vector_dabort
  376. vector_dabort:
  377. push_svc_reg
  378. bl rt_hw_trap_dabt
  379. b .
  380. .globl vector_resv
  381. vector_resv:
  382. push_svc_reg
  383. bl rt_hw_trap_resv
  384. b .