start_gcc.S 13 KB

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