1
0

context_gcc.S 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018/10/28 Bernard The unify RISC-V porting implementation
  9. */
  10. #include "cpuport.h"
  11. /*
  12. * rt_base_t rt_hw_interrupt_disable(void);
  13. */
  14. .globl rt_hw_interrupt_disable
  15. rt_hw_interrupt_disable:
  16. csrrci a0, mstatus, 8
  17. ret
  18. /*
  19. * void rt_hw_interrupt_enable(rt_base_t level);
  20. */
  21. .globl rt_hw_interrupt_enable
  22. rt_hw_interrupt_enable:
  23. csrw mstatus, a0
  24. ret
  25. /*
  26. * void rt_hw_context_switch_to(rt_ubase_t to)
  27. * a0 --> to
  28. */
  29. .globl rt_hw_context_switch_to
  30. rt_hw_context_switch_to:
  31. LOAD sp, (a0)
  32. /* load epc from stack */
  33. LOAD a0, 0 * REGBYTES(sp)
  34. csrw mepc, a0
  35. LOAD x1, 1 * REGBYTES(sp)
  36. /* load mstatus from stack */
  37. LOAD a0, 2 * REGBYTES(sp)
  38. csrw mstatus, a0
  39. LOAD x4, 4 * REGBYTES(sp)
  40. LOAD x5, 5 * REGBYTES(sp)
  41. LOAD x6, 6 * REGBYTES(sp)
  42. LOAD x7, 7 * REGBYTES(sp)
  43. LOAD x8, 8 * REGBYTES(sp)
  44. LOAD x9, 9 * REGBYTES(sp)
  45. LOAD x10, 10 * REGBYTES(sp)
  46. LOAD x11, 11 * REGBYTES(sp)
  47. LOAD x12, 12 * REGBYTES(sp)
  48. LOAD x13, 13 * REGBYTES(sp)
  49. LOAD x14, 14 * REGBYTES(sp)
  50. LOAD x15, 15 * REGBYTES(sp)
  51. LOAD x16, 16 * REGBYTES(sp)
  52. LOAD x17, 17 * REGBYTES(sp)
  53. LOAD x18, 18 * REGBYTES(sp)
  54. LOAD x19, 19 * REGBYTES(sp)
  55. LOAD x20, 20 * REGBYTES(sp)
  56. LOAD x21, 21 * REGBYTES(sp)
  57. LOAD x22, 22 * REGBYTES(sp)
  58. LOAD x23, 23 * REGBYTES(sp)
  59. LOAD x24, 24 * REGBYTES(sp)
  60. LOAD x25, 25 * REGBYTES(sp)
  61. LOAD x26, 26 * REGBYTES(sp)
  62. LOAD x27, 27 * REGBYTES(sp)
  63. LOAD x28, 28 * REGBYTES(sp)
  64. LOAD x29, 29 * REGBYTES(sp)
  65. LOAD x30, 30 * REGBYTES(sp)
  66. LOAD x31, 31 * REGBYTES(sp)
  67. addi sp, sp, 32 * REGBYTES
  68. mret
  69. /*
  70. * void rt_hw_context_switch(rt_ubase_t from, rt_ubase_t to)
  71. * a0 --> from
  72. * a1 --> to
  73. */
  74. .globl rt_hw_context_switch
  75. rt_hw_context_switch:
  76. /* saved from thread context
  77. * x1/ra -> sp(0)
  78. * x1/ra -> sp(1)
  79. * mstatus.mie -> sp(2)
  80. * x(i) -> sp(i-4)
  81. */
  82. addi sp, sp, -32 * REGBYTES
  83. STORE sp, (a0)
  84. STORE x1, 0 * REGBYTES(sp)
  85. STORE x1, 1 * REGBYTES(sp)
  86. csrr a0, mstatus
  87. andi a0, a0, 8
  88. beqz a0, save_mpie
  89. li a0, 0x80
  90. save_mpie:
  91. STORE a0, 2 * REGBYTES(sp)
  92. STORE x4, 4 * REGBYTES(sp)
  93. STORE x5, 5 * REGBYTES(sp)
  94. STORE x6, 6 * REGBYTES(sp)
  95. STORE x7, 7 * REGBYTES(sp)
  96. STORE x8, 8 * REGBYTES(sp)
  97. STORE x9, 9 * REGBYTES(sp)
  98. STORE x10, 10 * REGBYTES(sp)
  99. STORE x11, 11 * REGBYTES(sp)
  100. STORE x12, 12 * REGBYTES(sp)
  101. STORE x13, 13 * REGBYTES(sp)
  102. STORE x14, 14 * REGBYTES(sp)
  103. STORE x15, 15 * REGBYTES(sp)
  104. STORE x16, 16 * REGBYTES(sp)
  105. STORE x17, 17 * REGBYTES(sp)
  106. STORE x18, 18 * REGBYTES(sp)
  107. STORE x19, 19 * REGBYTES(sp)
  108. STORE x20, 20 * REGBYTES(sp)
  109. STORE x21, 21 * REGBYTES(sp)
  110. STORE x22, 22 * REGBYTES(sp)
  111. STORE x23, 23 * REGBYTES(sp)
  112. STORE x24, 24 * REGBYTES(sp)
  113. STORE x25, 25 * REGBYTES(sp)
  114. STORE x26, 26 * REGBYTES(sp)
  115. STORE x27, 27 * REGBYTES(sp)
  116. STORE x28, 28 * REGBYTES(sp)
  117. STORE x29, 29 * REGBYTES(sp)
  118. STORE x30, 30 * REGBYTES(sp)
  119. STORE x31, 31 * REGBYTES(sp)
  120. /* restore to thread context
  121. * sp(0) -> epc;
  122. * sp(1) -> ra;
  123. * sp(i) -> x(i+2)
  124. */
  125. LOAD sp, (a1)
  126. /* resw ra to mepc */
  127. LOAD a1, 0 * REGBYTES(sp)
  128. csrw mepc, a1
  129. LOAD x1, 1 * REGBYTES(sp)
  130. /* force to machin mode(MPP=11) */
  131. li a1, 0x00001800;
  132. csrs mstatus, a1
  133. LOAD a1, 2 * REGBYTES(sp)
  134. csrs mstatus, a1
  135. LOAD x4, 4 * REGBYTES(sp)
  136. LOAD x5, 5 * REGBYTES(sp)
  137. LOAD x6, 6 * REGBYTES(sp)
  138. LOAD x7, 7 * REGBYTES(sp)
  139. LOAD x8, 8 * REGBYTES(sp)
  140. LOAD x9, 9 * REGBYTES(sp)
  141. LOAD x10, 10 * REGBYTES(sp)
  142. LOAD x11, 11 * REGBYTES(sp)
  143. LOAD x12, 12 * REGBYTES(sp)
  144. LOAD x13, 13 * REGBYTES(sp)
  145. LOAD x14, 14 * REGBYTES(sp)
  146. LOAD x15, 15 * REGBYTES(sp)
  147. LOAD x16, 16 * REGBYTES(sp)
  148. LOAD x17, 17 * REGBYTES(sp)
  149. LOAD x18, 18 * REGBYTES(sp)
  150. LOAD x19, 19 * REGBYTES(sp)
  151. LOAD x20, 20 * REGBYTES(sp)
  152. LOAD x21, 21 * REGBYTES(sp)
  153. LOAD x22, 22 * REGBYTES(sp)
  154. LOAD x23, 23 * REGBYTES(sp)
  155. LOAD x24, 24 * REGBYTES(sp)
  156. LOAD x25, 25 * REGBYTES(sp)
  157. LOAD x26, 26 * REGBYTES(sp)
  158. LOAD x27, 27 * REGBYTES(sp)
  159. LOAD x28, 28 * REGBYTES(sp)
  160. LOAD x29, 29 * REGBYTES(sp)
  161. LOAD x30, 30 * REGBYTES(sp)
  162. LOAD x31, 31 * REGBYTES(sp)
  163. addi sp, sp, 32 * REGBYTES
  164. mret