stackframe.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-12-04 Jiaxun Yang Initial version
  9. */
  10. #ifndef __STACKFRAME_H__
  11. #define __STACKFRAME_H__
  12. #include "asm.h"
  13. #include "mips_regs.h"
  14. #include "ptrace.h"
  15. /* You MUST ensure FP is enabled before SAVE_FPU! */
  16. .macro SAVE_FPU
  17. .set push
  18. .set noreorder
  19. #ifdef RT_USING_FPU
  20. /* Ensure CU1 (FPU) is enabled */
  21. MFC0 v1, CP0_STATUS
  22. lui t1, %hi(ST0_CU1)
  23. addiu t1, t1, %lo(ST0_CU1)
  24. or v1, v1, t1
  25. MTC0 v1, CP0_STATUS
  26. SSNOP
  27. cfc1 v1, fcr31
  28. /* Store as delay slot */
  29. s.d $f0, PT_FPU_R0(sp)
  30. s.d $f2, PT_FPU_R2(sp)
  31. s.d $f4, PT_FPU_R4(sp)
  32. s.d $f6, PT_FPU_R6(sp)
  33. s.d $f8, PT_FPU_R8(sp)
  34. s.d $f10, PT_FPU_R10(sp)
  35. s.d $f12, PT_FPU_R12(sp)
  36. s.d $f14, PT_FPU_R14(sp)
  37. s.d $f16, PT_FPU_R16(sp)
  38. s.d $f18, PT_FPU_R18(sp)
  39. s.d $f20, PT_FPU_R20(sp)
  40. s.d $f22, PT_FPU_R22(sp)
  41. s.d $f24, PT_FPU_R24(sp)
  42. s.d $f26, PT_FPU_R26(sp)
  43. s.d $f28, PT_FPU_R28(sp)
  44. s.d $f30, PT_FPU_R30(sp)
  45. LONG_S v1, PT_FPU_FCSR31(sp)
  46. #endif
  47. .set reorder
  48. .set pop
  49. .endm
  50. .macro SAVE_AT
  51. .set push
  52. .set noat
  53. LONG_S $1, PT_R1(sp)
  54. .set pop
  55. .endm
  56. .macro SAVE_TEMP
  57. mfhi v1
  58. LONG_S $8, PT_R8(sp)
  59. LONG_S $9, PT_R9(sp)
  60. sw v1, PT_HI(sp)
  61. mflo v1
  62. LONG_S $10, PT_R10(sp)
  63. LONG_S $11, PT_R11(sp)
  64. sw v1, PT_LO(sp)
  65. LONG_S $12, PT_R12(sp)
  66. LONG_S $13, PT_R13(sp)
  67. LONG_S $14, PT_R14(sp)
  68. LONG_S $15, PT_R15(sp)
  69. LONG_S $24, PT_R24(sp)
  70. .endm
  71. .macro SAVE_STATIC
  72. LONG_S $16, PT_R16(sp)
  73. LONG_S $17, PT_R17(sp)
  74. LONG_S $18, PT_R18(sp)
  75. LONG_S $19, PT_R19(sp)
  76. LONG_S $20, PT_R20(sp)
  77. LONG_S $21, PT_R21(sp)
  78. LONG_S $22, PT_R22(sp)
  79. LONG_S $23, PT_R23(sp)
  80. LONG_S $30, PT_R30(sp)
  81. .endm
  82. .macro SAVE_SOME
  83. .set push
  84. .set noat
  85. .set reorder
  86. move k1, sp
  87. move k0, sp
  88. PTR_SUBU sp, k1, PT_SIZE
  89. LONG_S k0, PT_R29(sp)
  90. LONG_S $3, PT_R3(sp)
  91. LONG_S $0, PT_R0(sp)
  92. MFC0 v1, CP0_STATUS
  93. LONG_S $2, PT_R2(sp)
  94. LONG_S v1, PT_STATUS(sp)
  95. LONG_S $4, PT_R4(sp)
  96. MFC0 v1, CP0_CAUSE
  97. LONG_S $5, PT_R5(sp)
  98. LONG_S v1, PT_CAUSE(sp)
  99. LONG_S $6, PT_R6(sp)
  100. MFC0 v1, CP0_EPC
  101. LONG_S $7, PT_R7(sp)
  102. LONG_S v1, PT_EPC(sp)
  103. LONG_S $25, PT_R25(sp)
  104. LONG_S $28, PT_R28(sp)
  105. LONG_S $31, PT_R31(sp)
  106. .set pop
  107. .endm
  108. .macro SAVE_ALL
  109. SAVE_SOME
  110. SAVE_AT
  111. SAVE_TEMP
  112. SAVE_FPU
  113. SAVE_STATIC
  114. .endm
  115. .macro RESTORE_FPU
  116. .set push
  117. .set noreorder
  118. #ifdef RT_USING_FPU
  119. /* Ensure CU1 (FPU) is enabled */
  120. MFC0 v1, CP0_STATUS
  121. lui t1, %hi(ST0_CU1)
  122. addiu t1, t1, %lo(ST0_CU1)
  123. or v1, v1, t1
  124. MTC0 v1, CP0_STATUS
  125. SSNOP
  126. LONG_L v1, PT_FPU_FCSR31(sp)
  127. ctc1 v1, fcr31
  128. l.d $f0, PT_FPU_R0(sp)
  129. l.d $f2, PT_FPU_R2(sp)
  130. l.d $f4, PT_FPU_R4(sp)
  131. l.d $f6, PT_FPU_R6(sp)
  132. l.d $f8, PT_FPU_R8(sp)
  133. l.d $f10, PT_FPU_R10(sp)
  134. l.d $f12, PT_FPU_R12(sp)
  135. l.d $f14, PT_FPU_R14(sp)
  136. l.d $f16, PT_FPU_R16(sp)
  137. l.d $f18, PT_FPU_R18(sp)
  138. l.d $f20, PT_FPU_R20(sp)
  139. l.d $f22, PT_FPU_R22(sp)
  140. l.d $f24, PT_FPU_R24(sp)
  141. l.d $f26, PT_FPU_R26(sp)
  142. l.d $f28, PT_FPU_R28(sp)
  143. l.d $f30, PT_FPU_R30(sp)
  144. #endif
  145. .set reorder
  146. .set pop
  147. .endm
  148. .macro RESTORE_AT
  149. .set push
  150. .set noat
  151. LONG_L $1, PT_R1(sp)
  152. .set pop
  153. .endm
  154. .macro RESTORE_TEMP
  155. lw $24, PT_LO(sp)
  156. LONG_L $8, PT_R8(sp)
  157. LONG_L $9, PT_R9(sp)
  158. mtlo $24
  159. lw $24, PT_HI(sp)
  160. LONG_L $10, PT_R10(sp)
  161. LONG_L $11, PT_R11(sp)
  162. mthi $24
  163. LONG_L $12, PT_R12(sp)
  164. LONG_L $13, PT_R13(sp)
  165. LONG_L $14, PT_R14(sp)
  166. LONG_L $15, PT_R15(sp)
  167. LONG_L $24, PT_R24(sp)
  168. .endm
  169. .macro RESTORE_STATIC
  170. LONG_L $16, PT_R16(sp)
  171. LONG_L $17, PT_R17(sp)
  172. LONG_L $18, PT_R18(sp)
  173. LONG_L $19, PT_R19(sp)
  174. LONG_L $20, PT_R20(sp)
  175. LONG_L $21, PT_R21(sp)
  176. LONG_L $22, PT_R22(sp)
  177. LONG_L $23, PT_R23(sp)
  178. LONG_L $30, PT_R30(sp)
  179. .endm
  180. #define STATMASK 0x1f
  181. .macro RESTORE_SOME
  182. .set push
  183. .set reorder
  184. .set noat
  185. mfc0 a0, CP0_STATUS
  186. ori a0, STATMASK
  187. xori a0, STATMASK
  188. mtc0 a0, CP0_STATUS
  189. li v1, (ST0_CU1 | ST0_FR | ST0_IM)
  190. and a0, v1, a0
  191. LONG_L v0, PT_STATUS(sp)
  192. li v1, ~(ST0_CU1 | ST0_FR | ST0_IM)
  193. and v0, v1
  194. or v0, a0
  195. li v1, (ST0_KX | ST0_SX | ST0_UX)
  196. or v0, v1
  197. mtc0 v0, CP0_STATUS
  198. LONG_L v1, PT_EPC(sp)
  199. MTC0 v1, CP0_EPC
  200. LONG_L $31, PT_R31(sp)
  201. LONG_L $28, PT_R28(sp)
  202. LONG_L $25, PT_R25(sp)
  203. LONG_L $7, PT_R7(sp)
  204. LONG_L $6, PT_R6(sp)
  205. LONG_L $5, PT_R5(sp)
  206. LONG_L $4, PT_R4(sp)
  207. LONG_L $3, PT_R3(sp)
  208. LONG_L $2, PT_R2(sp)
  209. .set pop
  210. .endm
  211. .macro RESTORE_SP_AND_RET
  212. LONG_L sp, PT_R29(sp)
  213. eret
  214. nop
  215. .endm
  216. .macro RESTORE_SP
  217. LONG_L sp, PT_R29(sp)
  218. .endm
  219. .macro RESTORE_ALL
  220. RESTORE_TEMP
  221. RESTORE_FPU
  222. RESTORE_STATIC
  223. RESTORE_AT
  224. RESTORE_SOME
  225. RESTORE_SP
  226. .endm
  227. .macro RESTORE_ALL_AND_RET
  228. RESTORE_TEMP
  229. RESTORE_FPU
  230. RESTORE_STATIC
  231. RESTORE_AT
  232. RESTORE_SOME
  233. RESTORE_SP_AND_RET
  234. .endm
  235. #endif /* end of __STACKFRAME_H__ */