context_gcc.S 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. ;/*
  2. ; * File : context_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 "encoding.h"
  25. #include "sifive/bits.h"
  26. /*
  27. * rt_base_t rt_hw_interrupt_disable();
  28. */
  29. .globl rt_hw_interrupt_disable
  30. rt_hw_interrupt_disable:
  31. addi sp, sp, -12
  32. sw a5, (sp)
  33. li a5, 0x800
  34. csrr a0, mie
  35. blt a0, a5, 1f
  36. /* interrupt is enable before disable it*/
  37. addi a0, a0, 1
  38. li a5, 0x1
  39. addi a5, a5, -2048
  40. csrrc a5, mie, a5
  41. /* csrrc a5, mie, 128*/
  42. j 2f
  43. /* interrupt is disabled before disable it*/
  44. 1:
  45. li a0, 0
  46. 2:
  47. lw a5, (sp)
  48. addi sp, sp, 12
  49. ret
  50. /*
  51. * void rt_hw_interrupt_enable(rt_base_t level);
  52. */
  53. .globl rt_hw_interrupt_enable
  54. rt_hw_interrupt_enable:
  55. addi sp, sp, -12
  56. sw a5, (sp)
  57. beqz a0, 1f
  58. li a5, 0x1
  59. addi a5, a5, -2048
  60. csrrs a5, mie, a5
  61. /* csrrs a5, mie, 128*/
  62. 1:
  63. lw a5, (sp)
  64. addi sp, sp, 12
  65. ret
  66. /*
  67. * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
  68. * a0 --> from
  69. * a1 --> to
  70. */
  71. .globl rt_hw_context_switch
  72. rt_hw_context_switch:
  73. addi sp, sp, -32*REGBYTES
  74. STORE sp, (a0)
  75. STORE x30, 1*REGBYTES(sp)
  76. STORE x31, 2*REGBYTES(sp)
  77. STORE x3, 3*REGBYTES(sp)
  78. STORE x4, 4*REGBYTES(sp)
  79. STORE x5, 5*REGBYTES(sp)
  80. STORE x6, 6*REGBYTES(sp)
  81. STORE x7, 7*REGBYTES(sp)
  82. STORE x8, 8*REGBYTES(sp)
  83. STORE x9, 9*REGBYTES(sp)
  84. STORE x10, 10*REGBYTES(sp)
  85. STORE x11, 11*REGBYTES(sp)
  86. STORE x12, 12*REGBYTES(sp)
  87. STORE x13, 13*REGBYTES(sp)
  88. STORE x14, 14*REGBYTES(sp)
  89. STORE x15, 15*REGBYTES(sp)
  90. STORE x16, 16*REGBYTES(sp)
  91. STORE x17, 17*REGBYTES(sp)
  92. STORE x18, 18*REGBYTES(sp)
  93. STORE x19, 19*REGBYTES(sp)
  94. STORE x20, 20*REGBYTES(sp)
  95. STORE x21, 21*REGBYTES(sp)
  96. STORE x22, 22*REGBYTES(sp)
  97. STORE x23, 23*REGBYTES(sp)
  98. STORE x24, 24*REGBYTES(sp)
  99. STORE x25, 25*REGBYTES(sp)
  100. STORE x26, 26*REGBYTES(sp)
  101. STORE x27, 27*REGBYTES(sp)
  102. STORE x28, 28*REGBYTES(sp)
  103. STORE x1, 31*REGBYTES(sp)
  104. STORE x10, 29*REGBYTES(sp)
  105. STORE x1, 30*REGBYTES(sp)
  106. /*
  107. *Remain in M-mode after mret
  108. *enable interrupt in M-mode
  109. */
  110. li t0, 136
  111. csrrs t0, mstatus, t0
  112. LOAD sp, (a1)
  113. LOAD x30, 1*REGBYTES(sp)
  114. LOAD x31, 2*REGBYTES(sp)
  115. LOAD x3, 3*REGBYTES(sp)
  116. LOAD x4, 4*REGBYTES(sp)
  117. LOAD x5, 5*REGBYTES(sp)
  118. LOAD x6, 6*REGBYTES(sp)
  119. LOAD x7, 7*REGBYTES(sp)
  120. LOAD x8, 8*REGBYTES(sp)
  121. LOAD x9, 9*REGBYTES(sp)
  122. LOAD x29, 10*REGBYTES(sp)
  123. LOAD x11, 11*REGBYTES(sp)
  124. LOAD x12, 12*REGBYTES(sp)
  125. LOAD x13, 13*REGBYTES(sp)
  126. LOAD x14, 14*REGBYTES(sp)
  127. LOAD x15, 15*REGBYTES(sp)
  128. LOAD x16, 16*REGBYTES(sp)
  129. LOAD x17, 17*REGBYTES(sp)
  130. LOAD x18, 18*REGBYTES(sp)
  131. LOAD x19, 19*REGBYTES(sp)
  132. LOAD x20, 20*REGBYTES(sp)
  133. LOAD x21, 21*REGBYTES(sp)
  134. LOAD x22, 22*REGBYTES(sp)
  135. LOAD x23, 23*REGBYTES(sp)
  136. LOAD x24, 24*REGBYTES(sp)
  137. LOAD x25, 25*REGBYTES(sp)
  138. LOAD x26, 26*REGBYTES(sp)
  139. LOAD x27, 27*REGBYTES(sp)
  140. LOAD x28, 28*REGBYTES(sp)
  141. LOAD x10, 31*REGBYTES(sp)
  142. csrw mepc,x10
  143. LOAD x10, 29*REGBYTES(sp)
  144. LOAD x1, 30*REGBYTES(sp)
  145. addi sp, sp, 32*REGBYTES
  146. mret
  147. /*
  148. * void rt_hw_context_switch_to(rt_uint32 to);
  149. * a0 --> to
  150. */
  151. .globl rt_hw_context_switch_to
  152. rt_hw_context_switch_to:
  153. LOAD sp, (a0)
  154. LOAD x30, 1*REGBYTES(sp)
  155. LOAD x31, 2*REGBYTES(sp)
  156. LOAD x3, 3*REGBYTES(sp)
  157. LOAD x4, 4*REGBYTES(sp)
  158. LOAD x5, 5*REGBYTES(sp)
  159. LOAD x6, 6*REGBYTES(sp)
  160. LOAD x7, 7*REGBYTES(sp)
  161. LOAD x8, 8*REGBYTES(sp)
  162. LOAD x9, 9*REGBYTES(sp)
  163. LOAD x29, 10*REGBYTES(sp)
  164. LOAD x11, 11*REGBYTES(sp)
  165. LOAD x12, 12*REGBYTES(sp)
  166. LOAD x13, 13*REGBYTES(sp)
  167. LOAD x14, 14*REGBYTES(sp)
  168. LOAD x15, 15*REGBYTES(sp)
  169. LOAD x16, 16*REGBYTES(sp)
  170. LOAD x17, 17*REGBYTES(sp)
  171. LOAD x18, 18*REGBYTES(sp)
  172. LOAD x19, 19*REGBYTES(sp)
  173. LOAD x20, 20*REGBYTES(sp)
  174. LOAD x21, 21*REGBYTES(sp)
  175. LOAD x22, 22*REGBYTES(sp)
  176. LOAD x23, 23*REGBYTES(sp)
  177. LOAD x24, 24*REGBYTES(sp)
  178. LOAD x25, 25*REGBYTES(sp)
  179. LOAD x26, 26*REGBYTES(sp)
  180. LOAD x27, 27*REGBYTES(sp)
  181. LOAD x28, 28*REGBYTES(sp)
  182. LOAD x10, 31*REGBYTES(sp)
  183. csrw mepc,a0
  184. LOAD x10, 29*REGBYTES(sp)
  185. LOAD x1, 30*REGBYTES(sp)
  186. addi sp, sp, 32*REGBYTES
  187. mret
  188. /*
  189. * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
  190. */
  191. .globl rt_thread_switch_interrupt_flag
  192. .globl rt_interrupt_from_thread
  193. .globl rt_interrupt_to_thread
  194. .globl rt_hw_context_switch_interrupt
  195. rt_hw_context_switch_interrupt:
  196. addi sp, sp, -16
  197. sw s0, 12(sp)
  198. sw a0, 8(sp)
  199. sw a5, 4(sp)
  200. la a0, rt_thread_switch_interrupt_flag
  201. lw a5, (a0)
  202. bnez a5, _reswitch
  203. li a5, 1
  204. sw a5, (a0)
  205. la a5, rt_interrupt_from_thread
  206. lw a0, 8(sp)
  207. sw a0, (a5)
  208. _reswitch:
  209. la a5, rt_interrupt_to_thread
  210. sw a1, (a5)
  211. lw a5, 4(sp)
  212. lw a0, 8(sp)
  213. lw s0, 12(sp)
  214. addi sp, sp, 16
  215. ret