stackframe.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-02-02 lizhirui first version
  9. * 2021-02-11 lizhirui fixed gp save/store bug
  10. * 2021-11-18 JasonHu add fpu registers save/restore
  11. */
  12. #ifndef __STACKFRAME_H__
  13. #define __STACKFRAME_H__
  14. #include "cpuport.h"
  15. #include "encoding.h"
  16. #ifdef ENABLE_FPU
  17. #define FPU_CTX_F0_OFF 0 /* offsetof(fpu_context_t, fpustatus.f[0]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  18. #define FPU_CTX_F1_OFF 8 /* offsetof(fpu_context_t, fpustatus.f[1]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  19. #define FPU_CTX_F2_OFF 16 /* offsetof(fpu_context_t, fpustatus.f[2]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  20. #define FPU_CTX_F3_OFF 24 /* offsetof(fpu_context_t, fpustatus.f[3]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  21. #define FPU_CTX_F4_OFF 32 /* offsetof(fpu_context_t, fpustatus.f[4]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  22. #define FPU_CTX_F5_OFF 40 /* offsetof(fpu_context_t, fpustatus.f[5]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  23. #define FPU_CTX_F6_OFF 48 /* offsetof(fpu_context_t, fpustatus.f[6]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  24. #define FPU_CTX_F7_OFF 56 /* offsetof(fpu_context_t, fpustatus.f[7]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  25. #define FPU_CTX_F8_OFF 64 /* offsetof(fpu_context_t, fpustatus.f[8]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  26. #define FPU_CTX_F9_OFF 72 /* offsetof(fpu_context_t, fpustatus.f[9]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  27. #define FPU_CTX_F10_OFF 80 /* offsetof(fpu_context_t, fpustatus.f[10]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  28. #define FPU_CTX_F11_OFF 88 /* offsetof(fpu_context_t, fpustatus.f[11]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  29. #define FPU_CTX_F12_OFF 96 /* offsetof(fpu_context_t, fpustatus.f[12]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  30. #define FPU_CTX_F13_OFF 104 /* offsetof(fpu_context_t, fpustatus.f[13]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  31. #define FPU_CTX_F14_OFF 112 /* offsetof(fpu_context_t, fpustatus.f[14]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  32. #define FPU_CTX_F15_OFF 120 /* offsetof(fpu_context_t, fpustatus.f[15]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  33. #define FPU_CTX_F16_OFF 128 /* offsetof(fpu_context_t, fpustatus.f[16]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  34. #define FPU_CTX_F17_OFF 136 /* offsetof(fpu_context_t, fpustatus.f[17]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  35. #define FPU_CTX_F18_OFF 144 /* offsetof(fpu_context_t, fpustatus.f[18]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  36. #define FPU_CTX_F19_OFF 152 /* offsetof(fpu_context_t, fpustatus.f[19]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  37. #define FPU_CTX_F20_OFF 160 /* offsetof(fpu_context_t, fpustatus.f[20]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  38. #define FPU_CTX_F21_OFF 168 /* offsetof(fpu_context_t, fpustatus.f[21]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  39. #define FPU_CTX_F22_OFF 176 /* offsetof(fpu_context_t, fpustatus.f[22]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  40. #define FPU_CTX_F23_OFF 184 /* offsetof(fpu_context_t, fpustatus.f[23]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  41. #define FPU_CTX_F24_OFF 192 /* offsetof(fpu_context_t, fpustatus.f[24]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  42. #define FPU_CTX_F25_OFF 200 /* offsetof(fpu_context_t, fpustatus.f[25]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  43. #define FPU_CTX_F26_OFF 208 /* offsetof(fpu_context_t, fpustatus.f[26]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  44. #define FPU_CTX_F27_OFF 216 /* offsetof(fpu_context_t, fpustatus.f[27]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  45. #define FPU_CTX_F28_OFF 224 /* offsetof(fpu_context_t, fpustatus.f[28]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  46. #define FPU_CTX_F29_OFF 232 /* offsetof(fpu_context_t, fpustatus.f[29]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  47. #define FPU_CTX_F30_OFF 240 /* offsetof(fpu_context_t, fpustatus.f[30]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  48. #define FPU_CTX_F31_OFF 248 /* offsetof(fpu_context_t, fpustatus.f[31]) - offsetof(fpu_context_t, fpustatus.f[0]) */
  49. #endif /* ENABLE_FPU */
  50. .macro SAVE_ALL
  51. #ifdef ENABLE_FPU
  52. /* save float registers */
  53. addi sp, sp, -CTX_FPU_REG_NR * REGBYTES
  54. li t0, SSTATUS_FS
  55. csrs sstatus, t0
  56. fsd f0, FPU_CTX_F0_OFF(sp)
  57. fsd f1, FPU_CTX_F1_OFF(sp)
  58. fsd f2, FPU_CTX_F2_OFF(sp)
  59. fsd f3, FPU_CTX_F3_OFF(sp)
  60. fsd f4, FPU_CTX_F4_OFF(sp)
  61. fsd f5, FPU_CTX_F5_OFF(sp)
  62. fsd f6, FPU_CTX_F6_OFF(sp)
  63. fsd f7, FPU_CTX_F7_OFF(sp)
  64. fsd f8, FPU_CTX_F8_OFF(sp)
  65. fsd f9, FPU_CTX_F9_OFF(sp)
  66. fsd f10, FPU_CTX_F10_OFF(sp)
  67. fsd f11, FPU_CTX_F11_OFF(sp)
  68. fsd f12, FPU_CTX_F12_OFF(sp)
  69. fsd f13, FPU_CTX_F13_OFF(sp)
  70. fsd f14, FPU_CTX_F14_OFF(sp)
  71. fsd f15, FPU_CTX_F15_OFF(sp)
  72. fsd f16, FPU_CTX_F16_OFF(sp)
  73. fsd f17, FPU_CTX_F17_OFF(sp)
  74. fsd f18, FPU_CTX_F18_OFF(sp)
  75. fsd f19, FPU_CTX_F19_OFF(sp)
  76. fsd f20, FPU_CTX_F20_OFF(sp)
  77. fsd f21, FPU_CTX_F21_OFF(sp)
  78. fsd f22, FPU_CTX_F22_OFF(sp)
  79. fsd f23, FPU_CTX_F23_OFF(sp)
  80. fsd f24, FPU_CTX_F24_OFF(sp)
  81. fsd f25, FPU_CTX_F25_OFF(sp)
  82. fsd f26, FPU_CTX_F26_OFF(sp)
  83. fsd f27, FPU_CTX_F27_OFF(sp)
  84. fsd f28, FPU_CTX_F28_OFF(sp)
  85. fsd f29, FPU_CTX_F29_OFF(sp)
  86. fsd f30, FPU_CTX_F30_OFF(sp)
  87. fsd f31, FPU_CTX_F31_OFF(sp)
  88. /* clr FS domain */
  89. csrc sstatus, t0
  90. /* clean status would clr sr_sd; */
  91. li t0, SSTATUS_FS_CLEAN
  92. csrs sstatus, t0
  93. #endif /* ENABLE_FPU */
  94. /* save general registers */
  95. addi sp, sp, -CTX_GENERAL_REG_NR * REGBYTES
  96. STORE x1, 1 * REGBYTES(sp)
  97. csrr x1, sstatus
  98. STORE x1, 2 * REGBYTES(sp)
  99. csrr x1, sepc
  100. STORE x1, 0 * REGBYTES(sp)
  101. STORE x3, 3 * REGBYTES(sp)
  102. STORE x4, 4 * REGBYTES(sp)
  103. STORE x5, 5 * REGBYTES(sp)
  104. STORE x6, 6 * REGBYTES(sp)
  105. STORE x7, 7 * REGBYTES(sp)
  106. STORE x8, 8 * REGBYTES(sp)
  107. STORE x9, 9 * REGBYTES(sp)
  108. STORE x10, 10 * REGBYTES(sp)
  109. STORE x11, 11 * REGBYTES(sp)
  110. STORE x12, 12 * REGBYTES(sp)
  111. STORE x13, 13 * REGBYTES(sp)
  112. STORE x14, 14 * REGBYTES(sp)
  113. STORE x15, 15 * REGBYTES(sp)
  114. STORE x16, 16 * REGBYTES(sp)
  115. STORE x17, 17 * REGBYTES(sp)
  116. STORE x18, 18 * REGBYTES(sp)
  117. STORE x19, 19 * REGBYTES(sp)
  118. STORE x20, 20 * REGBYTES(sp)
  119. STORE x21, 21 * REGBYTES(sp)
  120. STORE x22, 22 * REGBYTES(sp)
  121. STORE x23, 23 * REGBYTES(sp)
  122. STORE x24, 24 * REGBYTES(sp)
  123. STORE x25, 25 * REGBYTES(sp)
  124. STORE x26, 26 * REGBYTES(sp)
  125. STORE x27, 27 * REGBYTES(sp)
  126. STORE x28, 28 * REGBYTES(sp)
  127. STORE x29, 29 * REGBYTES(sp)
  128. STORE x30, 30 * REGBYTES(sp)
  129. STORE x31, 31 * REGBYTES(sp)
  130. csrr t0, sscratch
  131. STORE t0, 32 * REGBYTES(sp)
  132. .endm
  133. .macro RESTORE_ALL
  134. /* restore general register */
  135. /* resw ra to sepc */
  136. LOAD x1, 0 * REGBYTES(sp)
  137. csrw sepc, x1
  138. LOAD x1, 2 * REGBYTES(sp)
  139. csrw sstatus, x1
  140. LOAD x1, 1 * REGBYTES(sp)
  141. LOAD x3, 3 * REGBYTES(sp)
  142. LOAD x4, 4 * REGBYTES(sp)
  143. LOAD x5, 5 * REGBYTES(sp)
  144. LOAD x6, 6 * REGBYTES(sp)
  145. LOAD x7, 7 * REGBYTES(sp)
  146. LOAD x8, 8 * REGBYTES(sp)
  147. LOAD x9, 9 * REGBYTES(sp)
  148. LOAD x10, 10 * REGBYTES(sp)
  149. LOAD x11, 11 * REGBYTES(sp)
  150. LOAD x12, 12 * REGBYTES(sp)
  151. LOAD x13, 13 * REGBYTES(sp)
  152. LOAD x14, 14 * REGBYTES(sp)
  153. LOAD x15, 15 * REGBYTES(sp)
  154. LOAD x16, 16 * REGBYTES(sp)
  155. LOAD x17, 17 * REGBYTES(sp)
  156. LOAD x18, 18 * REGBYTES(sp)
  157. LOAD x19, 19 * REGBYTES(sp)
  158. LOAD x20, 20 * REGBYTES(sp)
  159. LOAD x21, 21 * REGBYTES(sp)
  160. LOAD x22, 22 * REGBYTES(sp)
  161. LOAD x23, 23 * REGBYTES(sp)
  162. LOAD x24, 24 * REGBYTES(sp)
  163. LOAD x25, 25 * REGBYTES(sp)
  164. LOAD x26, 26 * REGBYTES(sp)
  165. LOAD x27, 27 * REGBYTES(sp)
  166. LOAD x28, 28 * REGBYTES(sp)
  167. LOAD x29, 29 * REGBYTES(sp)
  168. LOAD x30, 30 * REGBYTES(sp)
  169. LOAD x31, 31 * REGBYTES(sp)
  170. #ifdef ENABLE_FPU
  171. /* restore float register */
  172. mv t2, sp
  173. addi t2, t2, CTX_GENERAL_REG_NR * REGBYTES /* skip all normal reg */
  174. li t0, SSTATUS_FS
  175. csrs sstatus, t0
  176. fld f0, FPU_CTX_F0_OFF(t2)
  177. fld f1, FPU_CTX_F1_OFF(t2)
  178. fld f2, FPU_CTX_F2_OFF(t2)
  179. fld f3, FPU_CTX_F3_OFF(t2)
  180. fld f4, FPU_CTX_F4_OFF(t2)
  181. fld f5, FPU_CTX_F5_OFF(t2)
  182. fld f6, FPU_CTX_F6_OFF(t2)
  183. fld f7, FPU_CTX_F7_OFF(t2)
  184. fld f8, FPU_CTX_F8_OFF(t2)
  185. fld f9, FPU_CTX_F9_OFF(t2)
  186. fld f10,FPU_CTX_F10_OFF(t2)
  187. fld f11,FPU_CTX_F11_OFF(t2)
  188. fld f12,FPU_CTX_F12_OFF(t2)
  189. fld f13,FPU_CTX_F13_OFF(t2)
  190. fld f14,FPU_CTX_F14_OFF(t2)
  191. fld f15,FPU_CTX_F15_OFF(t2)
  192. fld f16,FPU_CTX_F16_OFF(t2)
  193. fld f17,FPU_CTX_F17_OFF(t2)
  194. fld f18,FPU_CTX_F18_OFF(t2)
  195. fld f19,FPU_CTX_F19_OFF(t2)
  196. fld f20,FPU_CTX_F20_OFF(t2)
  197. fld f21,FPU_CTX_F21_OFF(t2)
  198. fld f22,FPU_CTX_F22_OFF(t2)
  199. fld f23,FPU_CTX_F23_OFF(t2)
  200. fld f24,FPU_CTX_F24_OFF(t2)
  201. fld f25,FPU_CTX_F25_OFF(t2)
  202. fld f26,FPU_CTX_F26_OFF(t2)
  203. fld f27,FPU_CTX_F27_OFF(t2)
  204. fld f28,FPU_CTX_F28_OFF(t2)
  205. fld f29,FPU_CTX_F29_OFF(t2)
  206. fld f30,FPU_CTX_F30_OFF(t2)
  207. fld f31,FPU_CTX_F31_OFF(t2)
  208. /* clr FS domain */
  209. csrc sstatus, t0
  210. /* clean status would clr sr_sd; */
  211. li t0, SSTATUS_FS_CLEAN
  212. csrs sstatus, t0
  213. #endif /* ENABLE_FPU */
  214. /* restore user sp */
  215. LOAD sp, 32 * REGBYTES(sp)
  216. .endm
  217. .macro RESTORE_SYS_GP
  218. .option push
  219. .option norelax
  220. la gp, __global_pointer$
  221. .option pop
  222. .endm
  223. .macro OPEN_INTERRUPT
  224. csrsi sstatus, 2
  225. .endm
  226. .macro CLOSE_INTERRUPT
  227. csrci sstatus, 2
  228. .endm
  229. #endif