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