xref: /linux/arch/loongarch/kernel/rethook_trampoline.S (revision effce1cb87ee0d8b3a8cbe7722968f4ea7efd360)
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	fp, PT_R22
28	cfi_st	s0, PT_R23
29	cfi_st	s1, PT_R24
30	cfi_st	s2, PT_R25
31	cfi_st	s3, PT_R26
32	cfi_st	s4, PT_R27
33	cfi_st	s5, PT_R28
34	cfi_st	s6, PT_R29
35	cfi_st	s7, PT_R30
36	cfi_st	s8, PT_R31
37	csrrd	t0, LOONGARCH_CSR_CRMD
38	andi	t0, t0, 0x7 /* extract bit[1:0] PLV, bit[2] IE */
39	LONG_S	t0, sp, PT_CRMD
40	.endm
41
42	.macro restore_all_base_regs
43	cfi_ld	tp, PT_R2
44	cfi_ld	a0, PT_R4
45	cfi_ld	a1, PT_R5
46	cfi_ld	a2, PT_R6
47	cfi_ld	a3, PT_R7
48	cfi_ld	a4, PT_R8
49	cfi_ld	a5, PT_R9
50	cfi_ld	a6, PT_R10
51	cfi_ld	a7, PT_R11
52	cfi_ld	t0, PT_R12
53	cfi_ld	t1, PT_R13
54	cfi_ld	t2, PT_R14
55	cfi_ld	t3, PT_R15
56	cfi_ld	t4, PT_R16
57	cfi_ld	t5, PT_R17
58	cfi_ld	t6, PT_R18
59	cfi_ld	t7, PT_R19
60	cfi_ld	t8, PT_R20
61	cfi_ld	fp, PT_R22
62	cfi_ld	s0, PT_R23
63	cfi_ld	s1, PT_R24
64	cfi_ld	s2, PT_R25
65	cfi_ld	s3, PT_R26
66	cfi_ld	s4, PT_R27
67	cfi_ld	s5, PT_R28
68	cfi_ld	s6, PT_R29
69	cfi_ld	s7, PT_R30
70	cfi_ld	s8, PT_R31
71	LONG_L  t0, sp, PT_CRMD
72	LONG_LI	t1, 0x7 /* mask bit[1:0] PLV, bit[2] IE */
73	csrxchg t0, t1, LOONGARCH_CSR_CRMD
74	.endm
75
76SYM_CODE_START(arch_rethook_trampoline)
77	UNWIND_HINT_UNDEFINED
78	PTR_ADDI sp, sp, -PT_SIZE
79	save_all_base_regs
80
81	PTR_ADDI t0, sp, PT_SIZE
82	LONG_S	 t0, sp, PT_R3
83
84	move	 a0, sp /* pt_regs */
85
86	bl	 arch_rethook_trampoline_callback
87
88	/* use the result as the return-address */
89	move	 ra, a0
90
91	restore_all_base_regs
92	PTR_ADDI sp, sp, PT_SIZE
93
94	jr	 ra
95SYM_CODE_END(arch_rethook_trampoline)
96