start_gcc.S 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. ;/*
  2. ; * File : start_gcc.S
  3. ; * This file is part of RT-Thread RTOS
  4. ; * COPYRIGHT (C) 2006, RT-Thread Development Team
  5. ; *
  6. ; * This program is free software; you can redistribute it and/or modify
  7. ; * it under the terms of the GNU General Public License as published by
  8. ; * the Free Software Foundation; either version 2 of the License, or
  9. ; * (at your option) any later version.
  10. ; *
  11. ; * This program is distributed in the hope that it will be useful,
  12. ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. ; * GNU General Public License for more details.
  15. ; *
  16. ; * You should have received a copy of the GNU General Public License along
  17. ; * with this program; if not, write to the Free Software Foundation, Inc.,
  18. ; * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. ; *
  20. ; * Change Logs:
  21. ; * Date Author Notes
  22. ; * 2017-07-16 zhangjun for hifive1
  23. ; */
  24. #include "sifive/smp.h"
  25. #define CLINT_CTRL_ADDR 0x02000000
  26. .section .init
  27. .globl _start
  28. .type _start,@function
  29. _start:
  30. .cfi_startproc
  31. .cfi_undefined ra
  32. .option push
  33. .option norelax
  34. la gp, __global_pointer$
  35. .option pop
  36. la sp, _sp
  37. /*
  38. *disable all interrupt at startup
  39. */
  40. csrrc a5, mstatus, 0xb
  41. #if defined(ENABLE_SMP)
  42. smp_pause(t0, t1)
  43. #endif
  44. /* Load data section */
  45. la a0, _data_lma
  46. la a1, _data
  47. la a2, _edata
  48. bgeu a1, a2, 2f
  49. 1:
  50. lw t0, (a0)
  51. sw t0, (a1)
  52. addi a0, a0, 4
  53. addi a1, a1, 4
  54. bltu a1, a2, 1b
  55. 2:
  56. /* Clear bss section */
  57. la a0, __bss_start
  58. la a1, _end
  59. bgeu a0, a1, 2f
  60. 1:
  61. sw zero, (a0)
  62. addi a0, a0, 4
  63. bltu a0, a1, 1b
  64. 2:
  65. /* Call global constructors */
  66. la a0, __libc_fini_array
  67. call atexit
  68. call __libc_init_array
  69. /*call _init directly in rt-thread*/
  70. call _init
  71. #ifndef __riscv_float_abi_soft
  72. /* Enable FPU */
  73. li t0, MSTATUS_FS
  74. csrs mstatus, t0
  75. csrr t1, mstatus
  76. and t1, t1, t0
  77. beqz t1, 1f
  78. fssr x0
  79. 1:
  80. #endif
  81. #if defined(ENABLE_SMP)
  82. smp_resume(t0, t1)
  83. csrr a0, mhartid
  84. bnez a0, 2f
  85. #endif
  86. auipc ra, 0
  87. addi sp, sp, -16
  88. #if __riscv_xlen == 32
  89. sw ra, 8(sp)
  90. #else
  91. sd ra, 8(sp)
  92. #endif
  93. /* argc = argv = 0 */
  94. li a0, 0
  95. li a1, 0
  96. call main
  97. tail exit
  98. 1:
  99. j 1b
  100. #if defined(ENABLE_SMP)
  101. 2:
  102. la t0, trap_entry
  103. csrw mtvec, t0
  104. csrr a0, mhartid
  105. la t1, _sp
  106. slli t0, a0, 10
  107. sub sp, t1, t0
  108. auipc ra, 0
  109. addi sp, sp, -16
  110. #if __riscv_xlen == 32
  111. sw ra, 8(sp)
  112. #else
  113. sd ra, 8(sp)
  114. #endif
  115. call secondary_main
  116. tail exit
  117. 1:
  118. j 1b
  119. #endif
  120. .cfi_endproc
  121. #include "encoding.h"
  122. #include "sifive/bits.h"
  123. .section .text.entry
  124. .align 2
  125. .global trap_entry
  126. trap_entry:
  127. addi sp, sp, -32*REGBYTES
  128. STORE x30, 1*REGBYTES(sp)
  129. STORE x31, 2*REGBYTES(sp)
  130. STORE x3, 3*REGBYTES(sp)
  131. STORE x4, 4*REGBYTES(sp)
  132. STORE x5, 5*REGBYTES(sp)
  133. STORE x6, 6*REGBYTES(sp)
  134. STORE x7, 7*REGBYTES(sp)
  135. STORE x8, 8*REGBYTES(sp)
  136. STORE x9, 9*REGBYTES(sp)
  137. STORE x10, 10*REGBYTES(sp)
  138. STORE x11, 11*REGBYTES(sp)
  139. STORE x12, 12*REGBYTES(sp)
  140. STORE x13, 13*REGBYTES(sp)
  141. STORE x14, 14*REGBYTES(sp)
  142. STORE x15, 15*REGBYTES(sp)
  143. STORE x16, 16*REGBYTES(sp)
  144. STORE x17, 17*REGBYTES(sp)
  145. STORE x18, 18*REGBYTES(sp)
  146. STORE x19, 19*REGBYTES(sp)
  147. STORE x20, 20*REGBYTES(sp)
  148. STORE x21, 21*REGBYTES(sp)
  149. STORE x22, 22*REGBYTES(sp)
  150. STORE x23, 23*REGBYTES(sp)
  151. STORE x24, 24*REGBYTES(sp)
  152. STORE x25, 25*REGBYTES(sp)
  153. STORE x26, 26*REGBYTES(sp)
  154. STORE x27, 27*REGBYTES(sp)
  155. STORE x28, 28*REGBYTES(sp)
  156. STORE x10, 29*REGBYTES(sp)
  157. STORE x1, 30*REGBYTES(sp)
  158. csrr x10, mepc
  159. STORE x10, 31*REGBYTES(sp)
  160. csrr x10, mie
  161. STORE x10, 0*REGBYTES(sp)
  162. /*
  163. *Remain in M-mode after mret
  164. *enable interrupt in M-mode
  165. */
  166. li t0, MSTATUS_MPP
  167. csrrs t0, mstatus, t0
  168. call rt_interrupt_enter
  169. csrr a0, mcause
  170. lui a5, 0x80000
  171. not a5, a5
  172. and a5, a5, a0
  173. li a4, 11
  174. mv s1, a1
  175. /*Machine external interrupt*/
  176. bne a5, a4, 1f
  177. call rt_hw_trap_irq
  178. 1:
  179. /*Machine timer interrupt*/
  180. li a4, 7
  181. bne a5, a4, 2f
  182. call rt_systick_handler
  183. 2:
  184. call rt_interrupt_leave
  185. la a0, rt_thread_switch_interrupt_flag
  186. lw a1, (a0)
  187. bnez a1, rt_hw_context_switch_interrupt_do
  188. LOAD x30, 1*REGBYTES(sp)
  189. LOAD x31, 2*REGBYTES(sp)
  190. LOAD x3, 3*REGBYTES(sp)
  191. LOAD x4, 4*REGBYTES(sp)
  192. LOAD x5, 5*REGBYTES(sp)
  193. LOAD x6, 6*REGBYTES(sp)
  194. LOAD x7, 7*REGBYTES(sp)
  195. LOAD x8, 8*REGBYTES(sp)
  196. LOAD x9, 9*REGBYTES(sp)
  197. LOAD x29, 10*REGBYTES(sp)
  198. LOAD x11, 11*REGBYTES(sp)
  199. LOAD x12, 12*REGBYTES(sp)
  200. LOAD x13, 13*REGBYTES(sp)
  201. LOAD x14, 14*REGBYTES(sp)
  202. LOAD x15, 15*REGBYTES(sp)
  203. LOAD x16, 16*REGBYTES(sp)
  204. LOAD x17, 17*REGBYTES(sp)
  205. LOAD x18, 18*REGBYTES(sp)
  206. LOAD x19, 19*REGBYTES(sp)
  207. LOAD x20, 20*REGBYTES(sp)
  208. LOAD x21, 21*REGBYTES(sp)
  209. LOAD x22, 22*REGBYTES(sp)
  210. LOAD x23, 23*REGBYTES(sp)
  211. LOAD x24, 24*REGBYTES(sp)
  212. LOAD x25, 25*REGBYTES(sp)
  213. LOAD x26, 26*REGBYTES(sp)
  214. LOAD x27, 27*REGBYTES(sp)
  215. LOAD x28, 28*REGBYTES(sp)
  216. LOAD x10, 31*REGBYTES(sp)
  217. csrw mepc,x10
  218. LOAD x10, 0*REGBYTES(sp)
  219. csrw mie, x10
  220. LOAD x10, 29*REGBYTES(sp)
  221. LOAD x1, 30*REGBYTES(sp)
  222. addi sp, sp, 32*REGBYTES
  223. mret
  224. rt_hw_context_switch_interrupt_do:
  225. /*clear rt_thread_switch_interrupt_flag*/
  226. la a0, rt_thread_switch_interrupt_flag
  227. li a5, 0
  228. sw a5, (a0)
  229. LOAD a0, rt_interrupt_from_thread
  230. STORE sp, (a0)
  231. LOAD a0, rt_interrupt_to_thread
  232. LOAD sp, (a0)
  233. LOAD x30, 1*REGBYTES(sp)
  234. LOAD x31, 2*REGBYTES(sp)
  235. LOAD x3, 3*REGBYTES(sp)
  236. LOAD x4, 4*REGBYTES(sp)
  237. LOAD x5, 5*REGBYTES(sp)
  238. LOAD x6, 6*REGBYTES(sp)
  239. LOAD x7, 7*REGBYTES(sp)
  240. LOAD x8, 8*REGBYTES(sp)
  241. LOAD x9, 9*REGBYTES(sp)
  242. LOAD x29, 10*REGBYTES(sp)
  243. LOAD x11, 11*REGBYTES(sp)
  244. LOAD x12, 12*REGBYTES(sp)
  245. LOAD x13, 13*REGBYTES(sp)
  246. LOAD x14, 14*REGBYTES(sp)
  247. LOAD x15, 15*REGBYTES(sp)
  248. LOAD x16, 16*REGBYTES(sp)
  249. LOAD x17, 17*REGBYTES(sp)
  250. LOAD x18, 18*REGBYTES(sp)
  251. LOAD x19, 19*REGBYTES(sp)
  252. LOAD x20, 20*REGBYTES(sp)
  253. LOAD x21, 21*REGBYTES(sp)
  254. LOAD x22, 22*REGBYTES(sp)
  255. LOAD x23, 23*REGBYTES(sp)
  256. LOAD x24, 24*REGBYTES(sp)
  257. LOAD x25, 25*REGBYTES(sp)
  258. LOAD x26, 26*REGBYTES(sp)
  259. LOAD x27, 27*REGBYTES(sp)
  260. LOAD x28, 28*REGBYTES(sp)
  261. LOAD x10, 31*REGBYTES(sp)
  262. csrw mepc,x10
  263. LOAD x10, 0*REGBYTES(sp)
  264. csrw mie, x10
  265. LOAD x10, 29*REGBYTES(sp)
  266. LOAD x1, 30*REGBYTES(sp)
  267. addi sp, sp, 32*REGBYTES
  268. mret