rethook_trampoline.S 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. #include <linux/linkage.h>
  3. #include <asm/stackframe.h>
  4. .text
  5. .macro save_all_base_regs
  6. cfi_st ra, PT_R1
  7. cfi_st tp, PT_R2
  8. cfi_st a0, PT_R4
  9. cfi_st a1, PT_R5
  10. cfi_st a2, PT_R6
  11. cfi_st a3, PT_R7
  12. cfi_st a4, PT_R8
  13. cfi_st a5, PT_R9
  14. cfi_st a6, PT_R10
  15. cfi_st a7, PT_R11
  16. cfi_st t0, PT_R12
  17. cfi_st t1, PT_R13
  18. cfi_st t2, PT_R14
  19. cfi_st t3, PT_R15
  20. cfi_st t4, PT_R16
  21. cfi_st t5, PT_R17
  22. cfi_st t6, PT_R18
  23. cfi_st t7, PT_R19
  24. cfi_st t8, PT_R20
  25. cfi_st u0, PT_R21
  26. cfi_st fp, PT_R22
  27. cfi_st s0, PT_R23
  28. cfi_st s1, PT_R24
  29. cfi_st s2, PT_R25
  30. cfi_st s3, PT_R26
  31. cfi_st s4, PT_R27
  32. cfi_st s5, PT_R28
  33. cfi_st s6, PT_R29
  34. cfi_st s7, PT_R30
  35. cfi_st s8, PT_R31
  36. csrrd t0, LOONGARCH_CSR_CRMD
  37. andi t0, t0, 0x7 /* extract bit[1:0] PLV, bit[2] IE */
  38. LONG_S t0, sp, PT_CRMD
  39. .endm
  40. .macro restore_all_base_regs
  41. cfi_ld tp, PT_R2
  42. cfi_ld a0, PT_R4
  43. cfi_ld a1, PT_R5
  44. cfi_ld a2, PT_R6
  45. cfi_ld a3, PT_R7
  46. cfi_ld a4, PT_R8
  47. cfi_ld a5, PT_R9
  48. cfi_ld a6, PT_R10
  49. cfi_ld a7, PT_R11
  50. cfi_ld t0, PT_R12
  51. cfi_ld t1, PT_R13
  52. cfi_ld t2, PT_R14
  53. cfi_ld t3, PT_R15
  54. cfi_ld t4, PT_R16
  55. cfi_ld t5, PT_R17
  56. cfi_ld t6, PT_R18
  57. cfi_ld t7, PT_R19
  58. cfi_ld t8, PT_R20
  59. cfi_ld u0, PT_R21
  60. cfi_ld fp, PT_R22
  61. cfi_ld s0, PT_R23
  62. cfi_ld s1, PT_R24
  63. cfi_ld s2, PT_R25
  64. cfi_ld s3, PT_R26
  65. cfi_ld s4, PT_R27
  66. cfi_ld s5, PT_R28
  67. cfi_ld s6, PT_R29
  68. cfi_ld s7, PT_R30
  69. cfi_ld s8, PT_R31
  70. LONG_L t0, sp, PT_CRMD
  71. li.d t1, 0x7 /* mask bit[1:0] PLV, bit[2] IE */
  72. csrxchg t0, t1, LOONGARCH_CSR_CRMD
  73. .endm
  74. SYM_CODE_START(arch_rethook_trampoline)
  75. UNWIND_HINT_UNDEFINED
  76. addi.d sp, sp, -PT_SIZE
  77. save_all_base_regs
  78. addi.d t0, sp, PT_SIZE
  79. LONG_S t0, sp, PT_R3
  80. move a0, sp /* pt_regs */
  81. bl arch_rethook_trampoline_callback
  82. /* use the result as the return-address */
  83. move ra, a0
  84. restore_all_base_regs
  85. addi.d sp, sp, PT_SIZE
  86. jr ra
  87. SYM_CODE_END(arch_rethook_trampoline)