mips_context.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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. * 2016-9-7 Urey the first version
  9. */
  10. #ifndef _MIPS_CONTEXT_ASM_H_
  11. #define _MIPS_CONTEXT_ASM_H_
  12. #define CONTEXT_SIZE ( STK_CTX_SIZE + FPU_ADJ )
  13. #ifdef __mips_hard_float
  14. #define FPU_ADJ (32 * 4 + 8) /* FP0-FP31 + CP1_STATUS */
  15. #define FPU_CTX ( CONTEXT_SIZE - FPU_ADJ )
  16. #else
  17. #define FPU_ADJ 0
  18. #endif
  19. #ifdef __ASSEMBLY__
  20. #ifdef __mips_hard_float
  21. .global _fpctx_save
  22. .global _fpctx_load
  23. #endif
  24. .macro SAVE_CONTEXT
  25. .set push
  26. .set noat
  27. .set noreorder
  28. .set volatile
  29. //save SP
  30. move k1, sp
  31. move k0, sp
  32. subu sp, k1, CONTEXT_SIZE
  33. sw k0, (29 * 4)(sp)
  34. //save REG
  35. sw $0, ( 0 * 4)(sp)
  36. sw $1, ( 1 * 4)(sp)
  37. sw $2, ( 2 * 4)(sp)
  38. sw $3, ( 3 * 4)(sp)
  39. sw $4, ( 4 * 4)(sp)
  40. sw $5, ( 5 * 4)(sp)
  41. sw $6, ( 6 * 4)(sp)
  42. sw $7, ( 7 * 4)(sp)
  43. sw $8, ( 8 * 4)(sp)
  44. sw $9, ( 9 * 4)(sp)
  45. sw $10, (10 * 4)(sp)
  46. sw $11, (11 * 4)(sp)
  47. sw $12, (12 * 4)(sp)
  48. sw $13, (13 * 4)(sp)
  49. sw $14, (14 * 4)(sp)
  50. sw $15, (15 * 4)(sp)
  51. sw $16, (16 * 4)(sp)
  52. sw $17, (17 * 4)(sp)
  53. sw $18, (18 * 4)(sp)
  54. sw $19, (19 * 4)(sp)
  55. sw $20, (20 * 4)(sp)
  56. sw $21, (21 * 4)(sp)
  57. sw $22, (22 * 4)(sp)
  58. sw $23, (23 * 4)(sp)
  59. sw $24, (24 * 4)(sp)
  60. sw $25, (25 * 4)(sp)
  61. /* K0 K1 */
  62. sw $28, (28 * 4)(sp)
  63. /* SP */
  64. sw $30, (30 * 4)(sp)
  65. sw $31, (31 * 4)(sp)
  66. /* STATUS CAUSE EPC.... */
  67. mfc0 $2, CP0_STATUS
  68. sw $2, STK_OFFSET_SR(sp)
  69. mfc0 $2, CP0_CAUSE
  70. sw $2, STK_OFFSET_CAUSE(sp)
  71. mfc0 $2, CP0_BADVADDR
  72. sw $2, STK_OFFSET_BADVADDR(sp)
  73. MFC0 $2, CP0_EPC
  74. sw $2, STK_OFFSET_EPC(sp)
  75. mfhi $2
  76. sw $2, STK_OFFSET_HI(sp)
  77. mflo $2
  78. sw $2, STK_OFFSET_LO(sp)
  79. #ifdef __mips_hard_float
  80. add a0, sp,STK_CTX_SIZE
  81. mfc0 t0, CP0_STATUS
  82. .set push
  83. .set at
  84. or t0, M_StatusCU1
  85. .set push
  86. mtc0 t0, CP0_STATUS
  87. cfc1 t0, CP1_STATUS
  88. sw t0 , 0x00(a0)
  89. swc1 $f0,(0x04 * 1)(a0)
  90. swc1 $f1,(0x04 * 2)(a0)
  91. swc1 $f2,(0x04 * 3)(a0)
  92. swc1 $f3,(0x04 * 4)(a0)
  93. swc1 $f4,(0x04 * 5)(a0)
  94. swc1 $f5,(0x04 * 6)(a0)
  95. swc1 $f6,(0x04 * 7)(a0)
  96. swc1 $f7,(0x04 * 8)(a0)
  97. swc1 $f8,(0x04 * 9)(a0)
  98. swc1 $f9,(0x04 * 10)(a0)
  99. swc1 $f10,(0x04 * 11)(a0)
  100. swc1 $f11,(0x04 * 12)(a0)
  101. swc1 $f12,(0x04 * 13)(a0)
  102. swc1 $f13,(0x04 * 14)(a0)
  103. swc1 $f14,(0x04 * 15)(a0)
  104. swc1 $f15,(0x04 * 16)(a0)
  105. swc1 $f16,(0x04 * 17)(a0)
  106. swc1 $f17,(0x04 * 18)(a0)
  107. swc1 $f18,(0x04 * 19)(a0)
  108. swc1 $f19,(0x04 * 20)(a0)
  109. swc1 $f20,(0x04 * 21)(a0)
  110. swc1 $f21,(0x04 * 22)(a0)
  111. swc1 $f22,(0x04 * 23)(a0)
  112. swc1 $f23,(0x04 * 24)(a0)
  113. swc1 $f24,(0x04 * 25)(a0)
  114. swc1 $f25,(0x04 * 26)(a0)
  115. swc1 $f26,(0x04 * 27)(a0)
  116. swc1 $f27,(0x04 * 28)(a0)
  117. swc1 $f28,(0x04 * 29)(a0)
  118. swc1 $f29,(0x04 * 30)(a0)
  119. swc1 $f30,(0x04 * 31)(a0)
  120. swc1 $f31,(0x04 * 32)(a0)
  121. nop
  122. #endif
  123. //restore a0
  124. lw a0, (REG_A0 * 4)(sp)
  125. .set pop
  126. .endm
  127. .macro RESTORE_CONTEXT
  128. .set push
  129. .set noat
  130. .set noreorder
  131. .set volatile
  132. #ifdef __mips_hard_float
  133. add a0, sp,STK_CTX_SIZE
  134. mfc0 t0, CP0_STATUS
  135. .set push
  136. .set at
  137. or t0, M_StatusCU1
  138. .set noat
  139. mtc0 t0, CP0_STATUS
  140. lw t0 , 0x00(a0)
  141. lwc1 $f0,(0x04 * 1)(a0)
  142. lwc1 $f1,(0x04 * 2)(a0)
  143. lwc1 $f2,(0x04 * 3)(a0)
  144. lwc1 $f3,(0x04 * 4)(a0)
  145. lwc1 $f4,(0x04 * 5)(a0)
  146. lwc1 $f5,(0x04 * 6)(a0)
  147. lwc1 $f6,(0x04 * 7)(a0)
  148. lwc1 $f7,(0x04 * 8)(a0)
  149. lwc1 $f8,(0x04 * 9)(a0)
  150. lwc1 $f9,(0x04 * 10)(a0)
  151. lwc1 $f10,(0x04 * 11)(a0)
  152. lwc1 $f11,(0x04 * 12)(a0)
  153. lwc1 $f12,(0x04 * 13)(a0)
  154. lwc1 $f13,(0x04 * 14)(a0)
  155. lwc1 $f14,(0x04 * 15)(a0)
  156. lwc1 $f15,(0x04 * 16)(a0)
  157. lwc1 $f16,(0x04 * 17)(a0)
  158. lwc1 $f17,(0x04 * 18)(a0)
  159. lwc1 $f18,(0x04 * 19)(a0)
  160. lwc1 $f19,(0x04 * 20)(a0)
  161. lwc1 $f20,(0x04 * 21)(a0)
  162. lwc1 $f21,(0x04 * 22)(a0)
  163. lwc1 $f22,(0x04 * 23)(a0)
  164. lwc1 $f23,(0x04 * 24)(a0)
  165. lwc1 $f24,(0x04 * 25)(a0)
  166. lwc1 $f25,(0x04 * 26)(a0)
  167. lwc1 $f26,(0x04 * 27)(a0)
  168. lwc1 $f27,(0x04 * 28)(a0)
  169. lwc1 $f28,(0x04 * 29)(a0)
  170. lwc1 $f29,(0x04 * 30)(a0)
  171. lwc1 $f30,(0x04 * 31)(a0)
  172. lwc1 $f31,(0x04 * 32)(a0)
  173. ctc1 t0, CP1_STATUS ;/* restore fpp status reg */
  174. nop
  175. #endif
  176. /* ͨ通用寄存器 */
  177. /* ZERO */
  178. lw $1, ( 1 * 4)(sp)
  179. /* V0 */
  180. lw $3, ( 3 * 4)(sp)
  181. lw $4, ( 4 * 4)(sp)
  182. lw $5, ( 5 * 4)(sp)
  183. lw $6, ( 6 * 4)(sp)
  184. lw $7, ( 7 * 4)(sp)
  185. lw $8, ( 8 * 4)(sp)
  186. lw $9, ( 9 * 4)(sp)
  187. lw $10, (10 * 4)(sp)
  188. lw $11, (11 * 4)(sp)
  189. lw $12, (12 * 4)(sp)
  190. lw $13, (13 * 4)(sp)
  191. lw $14, (14 * 4)(sp)
  192. lw $15, (15 * 4)(sp)
  193. lw $16, (16 * 4)(sp)
  194. lw $17, (17 * 4)(sp)
  195. lw $18, (18 * 4)(sp)
  196. lw $19, (19 * 4)(sp)
  197. lw $20, (20 * 4)(sp)
  198. lw $21, (21 * 4)(sp)
  199. lw $22, (22 * 4)(sp)
  200. lw $23, (23 * 4)(sp)
  201. lw $24, (24 * 4)(sp)
  202. lw $25, (25 * 4)(sp)
  203. lw $26, (26 * 4)(sp)
  204. lw $27, (27 * 4)(sp)
  205. lw $28, (28 * 4)(sp)
  206. /* SP */
  207. lw $30, (30 * 4)(sp)
  208. lw $31, (31 * 4)(sp)
  209. /* STATUS CAUSE EPC.... */
  210. lw $2, STK_OFFSET_HI(sp)
  211. mthi $2
  212. lw $2, STK_OFFSET_LO(sp)
  213. mtlo $2
  214. lw $2, STK_OFFSET_SR(sp)
  215. mtc0 $2, CP0_STATUS
  216. lw $2, STK_OFFSET_BADVADDR(sp)
  217. mtc0 $2, CP0_BADVADDR
  218. lw $2, STK_OFFSET_CAUSE(sp)
  219. mtc0 $2, CP0_CAUSE
  220. lw $2, STK_OFFSET_EPC(sp)
  221. MTC0 $2, CP0_EPC
  222. //restore $2
  223. lw $2, ( 2 * 4)(sp)
  224. //restore sp
  225. lw $29, (29 * 4)(sp)
  226. eret
  227. nop
  228. .set pop
  229. .endm
  230. #endif
  231. #endif /* _MIPS_CONTEXT_ASM_H_ */