xref: /linux/arch/riscv/kernel/tests/kprobes/test-kprobes-asm.S (revision cb7e3669c683669d93139184adff68a7d9000536)
1*f2fab612SNam Cao/* SPDX-License-Identifier: GPL-2.0+ */
2*f2fab612SNam Cao
3*f2fab612SNam Cao#include <linux/linkage.h>
4*f2fab612SNam Cao#include <asm/asm.h>
5*f2fab612SNam Cao#include "test-kprobes.h"
6*f2fab612SNam Cao
7*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_add)
8*f2fab612SNam Cao	li a1, KPROBE_TEST_MAGIC_UPPER
9*f2fab612SNam Cao	li a2, KPROBE_TEST_MAGIC_LOWER
10*f2fab612SNam Caotest_kprobes_add_addr1:
11*f2fab612SNam Cao	add a1, a1, a2
12*f2fab612SNam Caotest_kprobes_add_addr2:
13*f2fab612SNam Cao	add a0, a1, x0
14*f2fab612SNam Cao	ret
15*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_add)
16*f2fab612SNam Cao
17*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_jal)
18*f2fab612SNam Cao	li a0, 0
19*f2fab612SNam Cao	mv a1, ra
20*f2fab612SNam Cao	.option push
21*f2fab612SNam Cao	.option norvc
22*f2fab612SNam Caotest_kprobes_jal_addr1:
23*f2fab612SNam Cao	jal x0, 2f
24*f2fab612SNam Cao	ret
25*f2fab612SNam Cao	.option pop
26*f2fab612SNam Cao1:	li a0, KPROBE_TEST_MAGIC_UPPER
27*f2fab612SNam Cao	ret
28*f2fab612SNam Cao	.option push
29*f2fab612SNam Cao	.option norvc
30*f2fab612SNam Caotest_kprobes_jal_addr2:
31*f2fab612SNam Cao2:	jal 1b
32*f2fab612SNam Cao	.option pop
33*f2fab612SNam Cao	li a2, KPROBE_TEST_MAGIC_LOWER
34*f2fab612SNam Cao	add a0, a0, a2
35*f2fab612SNam Cao	jr a1
36*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_jal)
37*f2fab612SNam Cao
38*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_jalr)
39*f2fab612SNam Cao	la a0, 1f
40*f2fab612SNam Cao	mv a1, ra
41*f2fab612SNam Cao	.option push
42*f2fab612SNam Cao	.option norvc
43*f2fab612SNam Caotest_kprobes_jalr_addr:
44*f2fab612SNam Cao	jalr a0
45*f2fab612SNam Cao	.option pop
46*f2fab612SNam Cao	li t0, KPROBE_TEST_MAGIC_UPPER
47*f2fab612SNam Cao	add a0, a0, t0
48*f2fab612SNam Cao	jr a1
49*f2fab612SNam Cao1:	li a0, KPROBE_TEST_MAGIC_LOWER
50*f2fab612SNam Cao	ret
51*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_jalr)
52*f2fab612SNam Cao
53*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_auipc)
54*f2fab612SNam Caotest_kprobes_auipc_addr:
55*f2fab612SNam Cao	auipc a0, KPROBE_TEST_MAGIC_LOWER
56*f2fab612SNam Cao	la a1, test_kprobes_auipc_addr
57*f2fab612SNam Cao	sub a0, a0, a1
58*f2fab612SNam Cao	srli a0, a0, 12
59*f2fab612SNam Cao	li a1, KPROBE_TEST_MAGIC_UPPER
60*f2fab612SNam Cao	add a0, a0, a1
61*f2fab612SNam Cao	ret
62*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_auipc)
63*f2fab612SNam Cao
64*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_branch)
65*f2fab612SNam Cao	.option push
66*f2fab612SNam Cao	.option norvc
67*f2fab612SNam Cao	li a0, 0
68*f2fab612SNam Cao	li a1, 1
69*f2fab612SNam Cao	li a2, 2
70*f2fab612SNam Caotest_kprobes_branch_addr1:
71*f2fab612SNam Cao	beqz a0, 1f
72*f2fab612SNam Cao	ret
73*f2fab612SNam Cao1:
74*f2fab612SNam Caotest_kprobes_branch_addr2:
75*f2fab612SNam Cao	beqz a1, 3f
76*f2fab612SNam Caotest_kprobes_branch_addr3:
77*f2fab612SNam Cao	bnez a0, 3f
78*f2fab612SNam Caotest_kprobes_branch_addr4:
79*f2fab612SNam Cao	bnez a2, 1f
80*f2fab612SNam Cao	ret
81*f2fab612SNam Cao1:
82*f2fab612SNam Caotest_kprobes_branch_addr5:
83*f2fab612SNam Cao	bge a1, a2, 3f
84*f2fab612SNam Caotest_kprobes_branch_addr6:
85*f2fab612SNam Cao	bge a2, a1, 2f
86*f2fab612SNam Cao	ret
87*f2fab612SNam Cao1:
88*f2fab612SNam Cao	li t0, KPROBE_TEST_MAGIC_UPPER
89*f2fab612SNam Cao	add a0, a0, t0
90*f2fab612SNam Cao	ret
91*f2fab612SNam Cao2:
92*f2fab612SNam Caotest_kprobes_branch_addr7:
93*f2fab612SNam Cao	blt a2, a1, 3f
94*f2fab612SNam Cao	li a0, KPROBE_TEST_MAGIC_LOWER
95*f2fab612SNam Caotest_kprobes_branch_addr8:
96*f2fab612SNam Cao	blt a1, a2, 1b
97*f2fab612SNam Cao3:
98*f2fab612SNam Cao	li a0, 0
99*f2fab612SNam Cao	ret
100*f2fab612SNam Cao	.option pop
101*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_branch)
102*f2fab612SNam Cao
103*f2fab612SNam Cao#ifdef CONFIG_RISCV_ISA_C
104*f2fab612SNam Cao
105*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_c_j)
106*f2fab612SNam Cao	li a0, 0
107*f2fab612SNam Caotest_kprobes_branch_c_j_addr1:
108*f2fab612SNam Cao	c.j 2f
109*f2fab612SNam Cao1:
110*f2fab612SNam Cao	li a1, KPROBE_TEST_MAGIC_UPPER
111*f2fab612SNam Cao	add a0, a0, a1
112*f2fab612SNam Cao	ret
113*f2fab612SNam Cao2:	li a0, KPROBE_TEST_MAGIC_LOWER
114*f2fab612SNam Caotest_kprobes_branch_c_j_addr2:
115*f2fab612SNam Cao	c.j 1b
116*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_c_j)
117*f2fab612SNam Cao
118*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_c_jr)
119*f2fab612SNam Cao	la a0, 2f
120*f2fab612SNam Caotest_kprobes_c_jr_addr1:
121*f2fab612SNam Cao	c.jr a0
122*f2fab612SNam Cao	ret
123*f2fab612SNam Cao1:	li a1, KPROBE_TEST_MAGIC_LOWER
124*f2fab612SNam Cao	add a0, a0, a1
125*f2fab612SNam Cao	ret
126*f2fab612SNam Cao2:
127*f2fab612SNam Cao	li a0, KPROBE_TEST_MAGIC_UPPER
128*f2fab612SNam Cao	la a1, 1b
129*f2fab612SNam Caotest_kprobes_c_jr_addr2:
130*f2fab612SNam Cao	c.jr a1
131*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_c_jr)
132*f2fab612SNam Cao
133*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_c_jalr)
134*f2fab612SNam Cao	mv a1, ra
135*f2fab612SNam Cao	la a0, 1f
136*f2fab612SNam Caotest_kprobes_c_jalr_addr:
137*f2fab612SNam Cao	c.jalr a0
138*f2fab612SNam Cao	li a2, KPROBE_TEST_MAGIC_UPPER
139*f2fab612SNam Cao	add a0, a0, a2
140*f2fab612SNam Cao	jr a1
141*f2fab612SNam Cao1:	li a0, KPROBE_TEST_MAGIC_LOWER
142*f2fab612SNam Cao	ret
143*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_c_jalr)
144*f2fab612SNam Cao
145*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_c_beqz)
146*f2fab612SNam Cao	li a0, 0
147*f2fab612SNam Cao	li a1, 1
148*f2fab612SNam Caotest_kprobes_c_beqz_addr1:
149*f2fab612SNam Cao	c.beqz a0, 2f
150*f2fab612SNam Cao	ret
151*f2fab612SNam Cao1:	li a1, KPROBE_TEST_MAGIC_UPPER
152*f2fab612SNam Cao	add a0, a0, a1
153*f2fab612SNam Cao	ret
154*f2fab612SNam Caotest_kprobes_c_beqz_addr2:
155*f2fab612SNam Cao2:	c.beqz a1, 3f
156*f2fab612SNam Cao	li a0, KPROBE_TEST_MAGIC_LOWER
157*f2fab612SNam Cao	mv a1, x0
158*f2fab612SNam Caotest_kprobes_c_beqz_addr3:
159*f2fab612SNam Cao	c.beqz a1, 1b
160*f2fab612SNam Cao3:	li a0, 0
161*f2fab612SNam Cao	ret
162*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_c_beqz)
163*f2fab612SNam Cao
164*f2fab612SNam CaoSYM_FUNC_START(test_kprobes_c_bnez)
165*f2fab612SNam Cao	li a0, 0
166*f2fab612SNam Cao	li a1, 1
167*f2fab612SNam Caotest_kprobes_c_bnez_addr1:
168*f2fab612SNam Cao	c.bnez a1, 2f
169*f2fab612SNam Cao	ret
170*f2fab612SNam Cao1:	li a1, KPROBE_TEST_MAGIC_UPPER
171*f2fab612SNam Cao	add a0, a0, a1
172*f2fab612SNam Cao	ret
173*f2fab612SNam Caotest_kprobes_c_bnez_addr2:
174*f2fab612SNam Cao2:	c.bnez a0, 3f
175*f2fab612SNam Cao	li a0, KPROBE_TEST_MAGIC_LOWER
176*f2fab612SNam Caotest_kprobes_c_bnez_addr3:
177*f2fab612SNam Cao	c.bnez a0, 1b
178*f2fab612SNam Cao3:	li a0, 0
179*f2fab612SNam Cao	ret
180*f2fab612SNam CaoSYM_FUNC_END(test_kprobes_c_bnez)
181*f2fab612SNam Cao
182*f2fab612SNam Cao#endif /* CONFIG_RISCV_ISA_C */
183*f2fab612SNam Cao
184*f2fab612SNam CaoSYM_DATA_START(test_kprobes_addresses)
185*f2fab612SNam Cao	RISCV_PTR test_kprobes_add_addr1
186*f2fab612SNam Cao	RISCV_PTR test_kprobes_add_addr2
187*f2fab612SNam Cao	RISCV_PTR test_kprobes_jal_addr1
188*f2fab612SNam Cao	RISCV_PTR test_kprobes_jal_addr2
189*f2fab612SNam Cao	RISCV_PTR test_kprobes_jalr_addr
190*f2fab612SNam Cao	RISCV_PTR test_kprobes_auipc_addr
191*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr1
192*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr2
193*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr3
194*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr4
195*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr5
196*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr6
197*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr7
198*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_addr8
199*f2fab612SNam Cao#ifdef CONFIG_RISCV_ISA_C
200*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_c_j_addr1
201*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch_c_j_addr2
202*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_jr_addr1
203*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_jr_addr2
204*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_jalr_addr
205*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_beqz_addr1
206*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_beqz_addr2
207*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_beqz_addr3
208*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_bnez_addr1
209*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_bnez_addr2
210*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_bnez_addr3
211*f2fab612SNam Cao#endif /* CONFIG_RISCV_ISA_C */
212*f2fab612SNam Cao	RISCV_PTR 0
213*f2fab612SNam CaoSYM_DATA_END(test_kprobes_addresses)
214*f2fab612SNam Cao
215*f2fab612SNam CaoSYM_DATA_START(test_kprobes_functions)
216*f2fab612SNam Cao	RISCV_PTR test_kprobes_add
217*f2fab612SNam Cao	RISCV_PTR test_kprobes_jal
218*f2fab612SNam Cao	RISCV_PTR test_kprobes_jalr
219*f2fab612SNam Cao	RISCV_PTR test_kprobes_auipc
220*f2fab612SNam Cao	RISCV_PTR test_kprobes_branch
221*f2fab612SNam Cao#ifdef CONFIG_RISCV_ISA_C
222*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_j
223*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_jr
224*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_jalr
225*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_beqz
226*f2fab612SNam Cao	RISCV_PTR test_kprobes_c_bnez
227*f2fab612SNam Cao#endif /* CONFIG_RISCV_ISA_C */
228*f2fab612SNam Cao	RISCV_PTR 0
229*f2fab612SNam CaoSYM_DATA_END(test_kprobes_functions)
230