mips_context.h 6.3 KB

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