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
78SYM_CODE_START(arch_rethook_trampoline)
79	addi.d	sp, sp, -PT_SIZE
80	save_all_base_regs
81
82	addi.d	t0, sp, PT_SIZE
83	LONG_S	t0, sp, PT_R3
84
85	move a0, sp /* pt_regs */
86
87	bl arch_rethook_trampoline_callback
88
89	/* use the result as the return-address */
90	move ra, a0
91
92	restore_all_base_regs
93	addi.d	sp, sp, PT_SIZE
94
95	jr ra
96SYM_CODE_END(arch_rethook_trampoline)
97