start.S 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. // See LICENSE for license details.
  2. // See LICENSE for license details.
  3. #include "riscv_encoding.h"
  4. .section .init
  5. .weak eclic_msip_handler
  6. .weak eclic_mtip_handler
  7. .weak eclic_bwei_handler
  8. .weak eclic_pmovi_handler
  9. .weak WWDGT_IRQHandler
  10. .weak LVD_IRQHandler
  11. .weak TAMPER_IRQHandler
  12. .weak RTC_IRQHandler
  13. .weak FMC_IRQHandler
  14. .weak RCU_IRQHandler
  15. .weak EXTI0_IRQHandler
  16. .weak EXTI1_IRQHandler
  17. .weak EXTI2_IRQHandler
  18. .weak EXTI3_IRQHandler
  19. .weak EXTI4_IRQHandler
  20. .weak DMA0_Channel0_IRQHandler
  21. .weak DMA0_Channel1_IRQHandler
  22. .weak DMA0_Channel2_IRQHandler
  23. .weak DMA0_Channel3_IRQHandler
  24. .weak DMA0_Channel4_IRQHandler
  25. .weak DMA0_Channel5_IRQHandler
  26. .weak DMA0_Channel6_IRQHandler
  27. .weak ADC0_1_IRQHandler
  28. .weak CAN0_TX_IRQHandler
  29. .weak CAN0_RX0_IRQHandler
  30. .weak CAN0_RX1_IRQHandler
  31. .weak CAN0_EWMC_IRQHandler
  32. .weak EXTI5_9_IRQHandler
  33. .weak TIMER0_BRK_IRQHandler
  34. .weak TIMER0_UP_IRQHandler
  35. .weak TIMER0_TRG_CMT_IRQHandler
  36. .weak TIMER0_Channel_IRQHandler
  37. .weak TIMER1_IRQHandler
  38. .weak TIMER2_IRQHandler
  39. .weak TIMER3_IRQHandler
  40. .weak I2C0_EV_IRQHandler
  41. .weak I2C0_ER_IRQHandler
  42. .weak I2C1_EV_IRQHandler
  43. .weak I2C1_ER_IRQHandler
  44. .weak SPI0_IRQHandler
  45. .weak SPI1_IRQHandler
  46. .weak USART0_IRQHandler
  47. .weak USART1_IRQHandler
  48. .weak USART2_IRQHandler
  49. .weak EXTI10_15_IRQHandler
  50. .weak RTC_Alarm_IRQHandler
  51. .weak USBFS_WKUP_IRQHandler
  52. .weak EXMC_IRQHandler
  53. .weak TIMER4_IRQHandler
  54. .weak SPI2_IRQHandler
  55. .weak UART3_IRQHandler
  56. .weak UART4_IRQHandler
  57. .weak TIMER5_IRQHandler
  58. .weak TIMER6_IRQHandler
  59. .weak DMA1_Channel0_IRQHandler
  60. .weak DMA1_Channel1_IRQHandler
  61. .weak DMA1_Channel2_IRQHandler
  62. .weak DMA1_Channel3_IRQHandler
  63. .weak DMA1_Channel4_IRQHandler
  64. .weak CAN1_TX_IRQHandler
  65. .weak CAN1_RX0_IRQHandler
  66. .weak CAN1_RX1_IRQHandler
  67. .weak CAN1_EWMC_IRQHandler
  68. .weak USBFS_IRQHandler
  69. vector_base:
  70. j _start
  71. .align 2
  72. .word 0
  73. .word 0
  74. .word eclic_msip_handler
  75. .word 0
  76. .word 0
  77. .word 0
  78. .word eclic_mtip_handler
  79. .word 0
  80. .word 0
  81. .word 0
  82. .word 0
  83. .word 0
  84. .word 0
  85. .word 0
  86. .word 0
  87. .word 0
  88. .word eclic_bwei_handler
  89. .word eclic_pmovi_handler
  90. .word WWDGT_IRQHandler
  91. .word LVD_IRQHandler
  92. .word TAMPER_IRQHandler
  93. .word RTC_IRQHandler
  94. .word FMC_IRQHandler
  95. .word RCU_IRQHandler
  96. .word EXTI0_IRQHandler
  97. .word EXTI1_IRQHandler
  98. .word EXTI2_IRQHandler
  99. .word EXTI3_IRQHandler
  100. .word EXTI4_IRQHandler
  101. .word DMA0_Channel0_IRQHandler
  102. .word DMA0_Channel1_IRQHandler
  103. .word DMA0_Channel2_IRQHandler
  104. .word DMA0_Channel3_IRQHandler
  105. .word DMA0_Channel4_IRQHandler
  106. .word DMA0_Channel5_IRQHandler
  107. .word DMA0_Channel6_IRQHandler
  108. .word ADC0_1_IRQHandler
  109. .word CAN0_TX_IRQHandler
  110. .word CAN0_RX0_IRQHandler
  111. .word CAN0_RX1_IRQHandler
  112. .word CAN0_EWMC_IRQHandler
  113. .word EXTI5_9_IRQHandler
  114. .word TIMER0_BRK_IRQHandler
  115. .word TIMER0_UP_IRQHandler
  116. .word TIMER0_TRG_CMT_IRQHandler
  117. .word TIMER0_Channel_IRQHandler
  118. .word TIMER1_IRQHandler
  119. .word TIMER2_IRQHandler
  120. .word TIMER3_IRQHandler
  121. .word I2C0_EV_IRQHandler
  122. .word I2C0_ER_IRQHandler
  123. .word I2C1_EV_IRQHandler
  124. .word I2C1_ER_IRQHandler
  125. .word SPI0_IRQHandler
  126. .word SPI1_IRQHandler
  127. .word USART0_IRQHandler
  128. .word USART1_IRQHandler
  129. .word USART2_IRQHandler
  130. .word EXTI10_15_IRQHandler
  131. .word RTC_Alarm_IRQHandler
  132. .word USBFS_WKUP_IRQHandler
  133. .word 0
  134. .word 0
  135. .word 0
  136. .word 0
  137. .word 0
  138. .word EXMC_IRQHandler
  139. .word 0
  140. .word TIMER4_IRQHandler
  141. .word SPI2_IRQHandler
  142. .word UART3_IRQHandler
  143. .word UART4_IRQHandler
  144. .word TIMER5_IRQHandler
  145. .word TIMER6_IRQHandler
  146. .word DMA1_Channel0_IRQHandler
  147. .word DMA1_Channel1_IRQHandler
  148. .word DMA1_Channel2_IRQHandler
  149. .word DMA1_Channel3_IRQHandler
  150. .word DMA1_Channel4_IRQHandler
  151. .word 0
  152. .word 0
  153. .word CAN1_TX_IRQHandler
  154. .word CAN1_RX0_IRQHandler
  155. .word CAN1_RX1_IRQHandler
  156. .word CAN1_EWMC_IRQHandler
  157. .word USBFS_IRQHandler
  158. .globl _start
  159. .type _start,@function
  160. _start:
  161. /* Jump to logical address first to ensure correct operation of RAM region */
  162. la a0, _start
  163. li a1, 1
  164. slli a1, a1, 29
  165. bleu a1, a0, _start0800
  166. srli a1, a1, 2
  167. bleu a1, a0, _start0800
  168. la a0, _start0800
  169. add a0, a0, a1
  170. jr a0
  171. _start0800:
  172. /* Set the the NMI base to share with mtvec by setting CSR_MMISC_CTL */
  173. li t0, 0x200
  174. csrs CSR_MMISC_CTL, t0
  175. /* Intial the mtvt*/
  176. la t0, vector_base
  177. csrw CSR_MTVT, t0
  178. /* Intial the mtvt2 and enable it*/
  179. la t0, irq_entry
  180. csrw CSR_MIRQ_ENTRY, t0
  181. csrs CSR_MIRQ_ENTRY, 0x1
  182. /* Intial the CSR MTVEC for the Trap ane NMI base addr*/
  183. la t0, trap_entry
  184. csrw CSR_MTVEC, t0
  185. #ifdef __riscv_flen
  186. /* Enable FPU */
  187. li t0, MSTATUS_FS
  188. csrs mstatus, t0
  189. csrw fcsr, x0
  190. #endif
  191. .option push
  192. .option norelax
  193. la gp, __global_pointer$
  194. .option pop
  195. la sp, _sp
  196. /* Load data section */
  197. la a0, _data_lma
  198. la a1, _data
  199. la a2, _edata
  200. bgeu a1, a2, 2f
  201. 1:
  202. lw t0, (a0)
  203. sw t0, (a1)
  204. addi a0, a0, 4
  205. addi a1, a1, 4
  206. bltu a1, a2, 1b
  207. 2:
  208. /* Clear bss section */
  209. la a0, __bss_start
  210. la a1, _end
  211. bgeu a0, a1, 2f
  212. 1:
  213. sw zero, (a0)
  214. addi a0, a0, 4
  215. bltu a0, a1, 1b
  216. 2:
  217. /* Call global constructors */
  218. la a0, __libc_fini_array
  219. call atexit
  220. call __libc_init_array
  221. /* argc = argv = 0 */
  222. li a0, 0
  223. li a1, 0
  224. call entry
  225. /* tail exit */
  226. 1:
  227. j 1b