start_gcc.S 13 KB

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