genex.S 3.8 KB

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