genex.S 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /*
  2. * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle
  3. * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  4. * Copyright (C) 2002, 2007 Maciej W. Rozycki
  5. * Copyright (C) 2001, 2012 MIPS Technologies, Inc. All rights reserved.
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <asm/asm.h>
  10. #include <asm/regdef.h>
  11. #include <asm/mipsregs.h>
  12. #include <asm/asm-offsets.h>
  13. #define STATMASK 0x1f
  14. .set noreorder
  15. /*
  16. * Macros copied and adapted from Linux MIPS
  17. */
  18. .macro SAVE_AT
  19. .set push
  20. .set noat
  21. LONG_S $1, PT_R1(sp)
  22. .set pop
  23. .endm
  24. .macro SAVE_TEMP
  25. #if __mips_isa_rev < 6
  26. mfhi v1
  27. #endif
  28. #ifdef CONFIG_32BIT
  29. LONG_S $8, PT_R8(sp)
  30. LONG_S $9, PT_R9(sp)
  31. #endif
  32. LONG_S $10, PT_R10(sp)
  33. LONG_S $11, PT_R11(sp)
  34. LONG_S $12, PT_R12(sp)
  35. #if __mips_isa_rev < 6
  36. LONG_S v1, PT_HI(sp)
  37. mflo v1
  38. #endif
  39. LONG_S $13, PT_R13(sp)
  40. LONG_S $14, PT_R14(sp)
  41. LONG_S $15, PT_R15(sp)
  42. LONG_S $24, PT_R24(sp)
  43. #if __mips_isa_rev < 6
  44. LONG_S v1, PT_LO(sp)
  45. #endif
  46. .endm
  47. .macro SAVE_STATIC
  48. LONG_S $16, PT_R16(sp)
  49. LONG_S $17, PT_R17(sp)
  50. LONG_S $18, PT_R18(sp)
  51. LONG_S $19, PT_R19(sp)
  52. LONG_S $20, PT_R20(sp)
  53. LONG_S $21, PT_R21(sp)
  54. LONG_S $22, PT_R22(sp)
  55. LONG_S $23, PT_R23(sp)
  56. LONG_S $30, PT_R30(sp)
  57. .endm
  58. .macro SAVE_SOME
  59. .set push
  60. .set noat
  61. PTR_SUBU k1, sp, PT_SIZE
  62. LONG_S sp, PT_R29(k1)
  63. move sp, k1
  64. LONG_S $3, PT_R3(sp)
  65. LONG_S $0, PT_R0(sp)
  66. mfc0 v1, CP0_STATUS
  67. LONG_S $2, PT_R2(sp)
  68. LONG_S v1, PT_STATUS(sp)
  69. LONG_S $4, PT_R4(sp)
  70. mfc0 v1, CP0_CAUSE
  71. LONG_S $5, PT_R5(sp)
  72. LONG_S v1, PT_CAUSE(sp)
  73. LONG_S $6, PT_R6(sp)
  74. MFC0 v1, CP0_EPC
  75. LONG_S $7, PT_R7(sp)
  76. #ifdef CONFIG_64BIT
  77. LONG_S $8, PT_R8(sp)
  78. LONG_S $9, PT_R9(sp)
  79. #endif
  80. LONG_S v1, PT_EPC(sp)
  81. LONG_S $25, PT_R25(sp)
  82. LONG_S $28, PT_R28(sp)
  83. LONG_S $31, PT_R31(sp)
  84. .set pop
  85. .endm
  86. .macro RESTORE_AT
  87. .set push
  88. .set noat
  89. LONG_L $1, PT_R1(sp)
  90. .set pop
  91. .endm
  92. .macro RESTORE_TEMP
  93. #if __mips_isa_rev < 6
  94. LONG_L $24, PT_LO(sp)
  95. mtlo $24
  96. LONG_L $24, PT_HI(sp)
  97. mthi $24
  98. #endif
  99. #ifdef CONFIG_32BIT
  100. LONG_L $8, PT_R8(sp)
  101. LONG_L $9, PT_R9(sp)
  102. #endif
  103. LONG_L $10, PT_R10(sp)
  104. LONG_L $11, PT_R11(sp)
  105. LONG_L $12, PT_R12(sp)
  106. LONG_L $13, PT_R13(sp)
  107. LONG_L $14, PT_R14(sp)
  108. LONG_L $15, PT_R15(sp)
  109. LONG_L $24, PT_R24(sp)
  110. .endm
  111. .macro RESTORE_STATIC
  112. LONG_L $16, PT_R16(sp)
  113. LONG_L $17, PT_R17(sp)
  114. LONG_L $18, PT_R18(sp)
  115. LONG_L $19, PT_R19(sp)
  116. LONG_L $20, PT_R20(sp)
  117. LONG_L $21, PT_R21(sp)
  118. LONG_L $22, PT_R22(sp)
  119. LONG_L $23, PT_R23(sp)
  120. LONG_L $30, PT_R30(sp)
  121. .endm
  122. .macro RESTORE_SOME
  123. .set push
  124. .set reorder
  125. .set noat
  126. mfc0 a0, CP0_STATUS
  127. ori a0, STATMASK
  128. xori a0, STATMASK
  129. mtc0 a0, CP0_STATUS
  130. li v1, ST0_CU1 | ST0_FR | ST0_IM
  131. and a0, v1
  132. LONG_L v0, PT_STATUS(sp)
  133. nor v1, $0, v1
  134. and v0, v1
  135. or v0, a0
  136. mtc0 v0, CP0_STATUS
  137. LONG_L v1, PT_EPC(sp)
  138. MTC0 v1, CP0_EPC
  139. LONG_L $31, PT_R31(sp)
  140. LONG_L $28, PT_R28(sp)
  141. LONG_L $25, PT_R25(sp)
  142. #ifdef CONFIG_64BIT
  143. LONG_L $8, PT_R8(sp)
  144. LONG_L $9, PT_R9(sp)
  145. #endif
  146. LONG_L $7, PT_R7(sp)
  147. LONG_L $6, PT_R6(sp)
  148. LONG_L $5, PT_R5(sp)
  149. LONG_L $4, PT_R4(sp)
  150. LONG_L $3, PT_R3(sp)
  151. LONG_L $2, PT_R2(sp)
  152. .set pop
  153. .endm
  154. .macro RESTORE_SP
  155. LONG_L sp, PT_R29(sp)
  156. .endm
  157. NESTED(except_vec3_generic, 0, sp)
  158. PTR_LA k1, handle_reserved
  159. jr k1
  160. nop
  161. END(except_vec3_generic)
  162. NESTED(except_vec_ejtag_debug, 0, sp)
  163. PTR_LA k1, handle_ejtag_debug
  164. jr k1
  165. nop
  166. END(except_vec_ejtag_debug)
  167. NESTED(handle_reserved, PT_SIZE, sp)
  168. SAVE_SOME
  169. SAVE_AT
  170. SAVE_TEMP
  171. SAVE_STATIC
  172. PTR_LA t9, do_reserved
  173. jr t9
  174. move a0, sp
  175. END(handle_reserved)
  176. NESTED(handle_ejtag_debug, PT_SIZE, sp)
  177. .set push
  178. .set noat
  179. MTC0 k1, CP0_DESAVE
  180. /* Check for SDBBP */
  181. MFC0 k1, CP0_DEBUG
  182. sll k1, k1, 30
  183. bgez k1, ejtag_return
  184. nop
  185. SAVE_SOME
  186. SAVE_AT
  187. SAVE_TEMP
  188. SAVE_STATIC
  189. PTR_LA t9, do_ejtag_debug
  190. jalr t9
  191. move a0, sp
  192. RESTORE_TEMP
  193. RESTORE_STATIC
  194. RESTORE_AT
  195. RESTORE_SOME
  196. RESTORE_SP
  197. ejtag_return:
  198. MFC0 k1, CP0_DESAVE
  199. deret
  200. .set pop
  201. END(handle_ejtag_debug)