1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2fca08f32SWang Nan /*
3fca08f32SWang Nan  * arch/arm/probes/kprobes/test-core.h
4fca08f32SWang Nan  *
5fca08f32SWang Nan  * Copyright (C) 2011 Jon Medhurst <tixy@yxit.co.uk>.
6fca08f32SWang Nan  */
7fca08f32SWang Nan 
8fca08f32SWang Nan #define VERBOSE 0 /* Set to '1' for more logging of test cases */
9fca08f32SWang Nan 
10fca08f32SWang Nan #ifdef CONFIG_THUMB2_KERNEL
11fca08f32SWang Nan #define NORMAL_ISA "16"
12fca08f32SWang Nan #else
13fca08f32SWang Nan #define NORMAL_ISA "32"
14fca08f32SWang Nan #endif
15fca08f32SWang Nan 
16fca08f32SWang Nan 
17fca08f32SWang Nan /* Flags used in kprobe_test_flags */
18fca08f32SWang Nan #define TEST_FLAG_NO_ITBLOCK	(1<<0)
19fca08f32SWang Nan #define TEST_FLAG_FULL_ITBLOCK	(1<<1)
20fca08f32SWang Nan #define TEST_FLAG_NARROW_INSTR	(1<<2)
21fca08f32SWang Nan 
22fca08f32SWang Nan extern int kprobe_test_flags;
23fca08f32SWang Nan extern int kprobe_test_cc_position;
24fca08f32SWang Nan 
25fca08f32SWang Nan 
26fca08f32SWang Nan #define TEST_MEMORY_SIZE 256
27fca08f32SWang Nan 
28fca08f32SWang Nan 
29fca08f32SWang Nan /*
30fca08f32SWang Nan  * Test case structures.
31fca08f32SWang Nan  *
32fca08f32SWang Nan  * The arguments given to test cases can be one of three types.
33fca08f32SWang Nan  *
34fca08f32SWang Nan  *   ARG_TYPE_REG
35fca08f32SWang Nan  *	Load a register with the given value.
36fca08f32SWang Nan  *
37fca08f32SWang Nan  *   ARG_TYPE_PTR
38fca08f32SWang Nan  *	Load a register with a pointer into the stack buffer (SP + given value).
39fca08f32SWang Nan  *
40fca08f32SWang Nan  *   ARG_TYPE_MEM
41fca08f32SWang Nan  *	Store the given value into the stack buffer at [SP+index].
42fca08f32SWang Nan  *
43fca08f32SWang Nan  */
44fca08f32SWang Nan 
45fca08f32SWang Nan #define	ARG_TYPE_END		0
46fca08f32SWang Nan #define	ARG_TYPE_REG		1
47fca08f32SWang Nan #define	ARG_TYPE_PTR		2
48fca08f32SWang Nan #define	ARG_TYPE_MEM		3
494cd872d9SJon Medhurst (Tixy) #define	ARG_TYPE_REG_MASKED	4
50fca08f32SWang Nan 
51fca08f32SWang Nan #define ARG_FLAG_UNSUPPORTED	0x01
52fca08f32SWang Nan #define ARG_FLAG_SUPPORTED	0x02
53fca08f32SWang Nan #define ARG_FLAG_THUMB		0x10	/* Must be 16 so TEST_ISA can be used */
54fca08f32SWang Nan #define ARG_FLAG_ARM		0x20	/* Must be 32 so TEST_ISA can be used */
55fca08f32SWang Nan 
56fca08f32SWang Nan struct test_arg {
57fca08f32SWang Nan 	u8	type;		/* ARG_TYPE_x */
58fca08f32SWang Nan 	u8	_padding[7];
59fca08f32SWang Nan };
60fca08f32SWang Nan 
61fca08f32SWang Nan struct test_arg_regptr {
624cd872d9SJon Medhurst (Tixy) 	u8	type;		/* ARG_TYPE_REG or ARG_TYPE_PTR or ARG_TYPE_REG_MASKED */
63fca08f32SWang Nan 	u8	reg;
64fca08f32SWang Nan 	u8	_padding[2];
65fca08f32SWang Nan 	u32	val;
66fca08f32SWang Nan };
67fca08f32SWang Nan 
68fca08f32SWang Nan struct test_arg_mem {
69fca08f32SWang Nan 	u8	type;		/* ARG_TYPE_MEM */
70fca08f32SWang Nan 	u8	index;
71fca08f32SWang Nan 	u8	_padding[2];
72fca08f32SWang Nan 	u32	val;
73fca08f32SWang Nan };
74fca08f32SWang Nan 
75fca08f32SWang Nan struct test_arg_end {
76fca08f32SWang Nan 	u8	type;		/* ARG_TYPE_END */
77fca08f32SWang Nan 	u8	flags;		/* ARG_FLAG_x */
78fca08f32SWang Nan 	u16	code_offset;
79fca08f32SWang Nan 	u16	branch_offset;
80fca08f32SWang Nan 	u16	end_offset;
81fca08f32SWang Nan };
82fca08f32SWang Nan 
83fca08f32SWang Nan 
84fca08f32SWang Nan /*
85fca08f32SWang Nan  * Building blocks for test cases.
86fca08f32SWang Nan  *
87fca08f32SWang Nan  * Each test case is wrapped between TESTCASE_START and TESTCASE_END.
88fca08f32SWang Nan  *
89fca08f32SWang Nan  * To specify arguments for a test case the TEST_ARG_{REG,PTR,MEM} macros are
90fca08f32SWang Nan  * used followed by a terminating TEST_ARG_END.
91fca08f32SWang Nan  *
92fca08f32SWang Nan  * After this, the instruction to be tested is defined with TEST_INSTRUCTION.
93fca08f32SWang Nan  * Or for branches, TEST_BRANCH_B and TEST_BRANCH_F (branch forwards/backwards).
94fca08f32SWang Nan  *
95fca08f32SWang Nan  * Some specific test cases may make use of other custom constructs.
96fca08f32SWang Nan  */
97fca08f32SWang Nan 
98fca08f32SWang Nan #if VERBOSE
99fca08f32SWang Nan #define verbose(fmt, ...) pr_info(fmt, ##__VA_ARGS__)
100fca08f32SWang Nan #else
1013583ab22SArnd Bergmann #define verbose(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
102fca08f32SWang Nan #endif
103fca08f32SWang Nan 
104fca08f32SWang Nan #define TEST_GROUP(title)					\
105fca08f32SWang Nan 	verbose("\n");						\
106fca08f32SWang Nan 	verbose(title"\n");					\
107fca08f32SWang Nan 	verbose("---------------------------------------------------------\n");
108fca08f32SWang Nan 
109fca08f32SWang Nan #define TESTCASE_START(title)					\
110fca08f32SWang Nan 	__asm__ __volatile__ (					\
1117c182ebaSNick Desaulniers 	".syntax unified				\n\t"	\
112fca08f32SWang Nan 	"bl	__kprobes_test_case_start		\n\t"	\
113fca08f32SWang Nan 	".pushsection .rodata				\n\t"	\
114fca08f32SWang Nan 	"10:						\n\t"	\
115fca08f32SWang Nan 	/* don't use .asciz here as 'title' may be */		\
116fca08f32SWang Nan 	/* multiple strings to be concatenated.  */		\
117fca08f32SWang Nan 	".ascii "#title"				\n\t"	\
118fca08f32SWang Nan 	".byte	0					\n\t"	\
119fca08f32SWang Nan 	".popsection					\n\t"	\
120fca08f32SWang Nan 	".word	10b					\n\t"
121fca08f32SWang Nan 
122fca08f32SWang Nan #define	TEST_ARG_REG(reg, val)					\
123fca08f32SWang Nan 	".byte	"__stringify(ARG_TYPE_REG)"		\n\t"	\
124fca08f32SWang Nan 	".byte	"#reg"					\n\t"	\
125fca08f32SWang Nan 	".short	0					\n\t"	\
126fca08f32SWang Nan 	".word	"#val"					\n\t"
127fca08f32SWang Nan 
128fca08f32SWang Nan #define	TEST_ARG_PTR(reg, val)					\
129fca08f32SWang Nan 	".byte	"__stringify(ARG_TYPE_PTR)"		\n\t"	\
130fca08f32SWang Nan 	".byte	"#reg"					\n\t"	\
131fca08f32SWang Nan 	".short	0					\n\t"	\
132fca08f32SWang Nan 	".word	"#val"					\n\t"
133fca08f32SWang Nan 
134fca08f32SWang Nan #define	TEST_ARG_MEM(index, val)				\
135fca08f32SWang Nan 	".byte	"__stringify(ARG_TYPE_MEM)"		\n\t"	\
136fca08f32SWang Nan 	".byte	"#index"				\n\t"	\
137fca08f32SWang Nan 	".short	0					\n\t"	\
138fca08f32SWang Nan 	".word	"#val"					\n\t"
139fca08f32SWang Nan 
1404cd872d9SJon Medhurst (Tixy) #define	TEST_ARG_REG_MASKED(reg, val)				\
1414cd872d9SJon Medhurst (Tixy) 	".byte	"__stringify(ARG_TYPE_REG_MASKED)"	\n\t"	\
1424cd872d9SJon Medhurst (Tixy) 	".byte	"#reg"					\n\t"	\
1434cd872d9SJon Medhurst (Tixy) 	".short	0					\n\t"	\
1444cd872d9SJon Medhurst (Tixy) 	".word	"#val"					\n\t"
1454cd872d9SJon Medhurst (Tixy) 
146fca08f32SWang Nan #define	TEST_ARG_END(flags)					\
147fca08f32SWang Nan 	".byte	"__stringify(ARG_TYPE_END)"		\n\t"	\
148fca08f32SWang Nan 	".byte	"TEST_ISA flags"			\n\t"	\
149fca08f32SWang Nan 	".short	50f-0f					\n\t"	\
150fca08f32SWang Nan 	".short	2f-0f					\n\t"	\
151fca08f32SWang Nan 	".short	99f-0f					\n\t"	\
152fca08f32SWang Nan 	".code "TEST_ISA"				\n\t"	\
153fca08f32SWang Nan 	"0:						\n\t"
154fca08f32SWang Nan 
155fca08f32SWang Nan #define TEST_INSTRUCTION(instruction)				\
156fca08f32SWang Nan 	"50:	nop					\n\t"	\
157fca08f32SWang Nan 	"1:	"instruction"				\n\t"	\
158fca08f32SWang Nan 	"	nop					\n\t"
159fca08f32SWang Nan 
160fca08f32SWang Nan #define TEST_BRANCH_F(instruction)				\
161fca08f32SWang Nan 	TEST_INSTRUCTION(instruction)				\
162fca08f32SWang Nan 	"	b	99f				\n\t"	\
163fca08f32SWang Nan 	"2:	nop					\n\t"
164fca08f32SWang Nan 
165fca08f32SWang Nan #define TEST_BRANCH_B(instruction)				\
166fca08f32SWang Nan 	"	b	50f				\n\t"	\
167fca08f32SWang Nan 	"	b	99f				\n\t"	\
168fca08f32SWang Nan 	"2:	nop					\n\t"	\
169fca08f32SWang Nan 	"	b	99f				\n\t"	\
170fca08f32SWang Nan 	TEST_INSTRUCTION(instruction)
171fca08f32SWang Nan 
172fca08f32SWang Nan #define TEST_BRANCH_FX(instruction, codex)			\
173fca08f32SWang Nan 	TEST_INSTRUCTION(instruction)				\
174fca08f32SWang Nan 	"	b	99f				\n\t"	\
175fca08f32SWang Nan 	codex"						\n\t"	\
176fca08f32SWang Nan 	"	b	99f				\n\t"	\
177fca08f32SWang Nan 	"2:	nop					\n\t"
178fca08f32SWang Nan 
179fca08f32SWang Nan #define TEST_BRANCH_BX(instruction, codex)			\
180fca08f32SWang Nan 	"	b	50f				\n\t"	\
181fca08f32SWang Nan 	"	b	99f				\n\t"	\
182fca08f32SWang Nan 	"2:	nop					\n\t"	\
183fca08f32SWang Nan 	"	b	99f				\n\t"	\
184fca08f32SWang Nan 	codex"						\n\t"	\
185fca08f32SWang Nan 	TEST_INSTRUCTION(instruction)
186fca08f32SWang Nan 
187fca08f32SWang Nan #define TESTCASE_END						\
188fca08f32SWang Nan 	"2:						\n\t"	\
189fca08f32SWang Nan 	"99:						\n\t"	\
190fca08f32SWang Nan 	"	bl __kprobes_test_case_end_"TEST_ISA"	\n\t"	\
191fca08f32SWang Nan 	".code "NORMAL_ISA"				\n\t"	\
192fca08f32SWang Nan 	: :							\
193fca08f32SWang Nan 	: "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"	\
194fca08f32SWang Nan 	);
195fca08f32SWang Nan 
196fca08f32SWang Nan 
197fca08f32SWang Nan /*
198fca08f32SWang Nan  * Macros to define test cases.
199fca08f32SWang Nan  *
200fca08f32SWang Nan  * Those of the form TEST_{R,P,M}* can be used to define test cases
201fca08f32SWang Nan  * which take combinations of the three basic types of arguments. E.g.
202fca08f32SWang Nan  *
203fca08f32SWang Nan  *   TEST_R	One register argument
204fca08f32SWang Nan  *   TEST_RR	Two register arguments
205fca08f32SWang Nan  *   TEST_RPR	A register, a pointer, then a register argument
206fca08f32SWang Nan  *
207fca08f32SWang Nan  * For testing instructions which may branch, there are macros TEST_BF_*
208fca08f32SWang Nan  * and TEST_BB_* for branching forwards and backwards.
209fca08f32SWang Nan  *
210fca08f32SWang Nan  * TEST_SUPPORTED and TEST_UNSUPPORTED don't cause the code to be executed,
211fca08f32SWang Nan  * the just verify that a kprobe is or is not allowed on the given instruction.
212fca08f32SWang Nan  */
213fca08f32SWang Nan 
214fca08f32SWang Nan #define TEST(code)				\
215fca08f32SWang Nan 	TESTCASE_START(code)			\
216fca08f32SWang Nan 	TEST_ARG_END("")			\
217fca08f32SWang Nan 	TEST_INSTRUCTION(code)			\
218fca08f32SWang Nan 	TESTCASE_END
219fca08f32SWang Nan 
220fca08f32SWang Nan #define TEST_UNSUPPORTED(code)					\
221fca08f32SWang Nan 	TESTCASE_START(code)					\
222fca08f32SWang Nan 	TEST_ARG_END("|"__stringify(ARG_FLAG_UNSUPPORTED))	\
223fca08f32SWang Nan 	TEST_INSTRUCTION(code)					\
224fca08f32SWang Nan 	TESTCASE_END
225fca08f32SWang Nan 
226fca08f32SWang Nan #define TEST_SUPPORTED(code)					\
227fca08f32SWang Nan 	TESTCASE_START(code)					\
228fca08f32SWang Nan 	TEST_ARG_END("|"__stringify(ARG_FLAG_SUPPORTED))	\
229fca08f32SWang Nan 	TEST_INSTRUCTION(code)					\
230fca08f32SWang Nan 	TESTCASE_END
231fca08f32SWang Nan 
232fca08f32SWang Nan #define TEST_R(code1, reg, val, code2)			\
233fca08f32SWang Nan 	TESTCASE_START(code1 #reg code2)		\
234fca08f32SWang Nan 	TEST_ARG_REG(reg, val)				\
235fca08f32SWang Nan 	TEST_ARG_END("")				\
236fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg code2)		\
237fca08f32SWang Nan 	TESTCASE_END
238fca08f32SWang Nan 
239fca08f32SWang Nan #define TEST_RR(code1, reg1, val1, code2, reg2, val2, code3)	\
240fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3)		\
241fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)				\
242fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)				\
243fca08f32SWang Nan 	TEST_ARG_END("")					\
244fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3)		\
245fca08f32SWang Nan 	TESTCASE_END
246fca08f32SWang Nan 
247fca08f32SWang Nan #define TEST_RRR(code1, reg1, val1, code2, reg2, val2, code3, reg3, val3, code4)\
248fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
249fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)						\
250fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)						\
251fca08f32SWang Nan 	TEST_ARG_REG(reg3, val3)						\
252fca08f32SWang Nan 	TEST_ARG_END("")							\
253fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
254fca08f32SWang Nan 	TESTCASE_END
255fca08f32SWang Nan 
256fca08f32SWang Nan #define TEST_RRRR(code1, reg1, val1, code2, reg2, val2, code3, reg3, val3, code4, reg4, val4)	\
257fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3 #reg3 code4 #reg4)		\
258fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)						\
259fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)						\
260fca08f32SWang Nan 	TEST_ARG_REG(reg3, val3)						\
261fca08f32SWang Nan 	TEST_ARG_REG(reg4, val4)						\
262fca08f32SWang Nan 	TEST_ARG_END("")							\
263fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3 #reg3 code4 #reg4)	\
264fca08f32SWang Nan 	TESTCASE_END
265fca08f32SWang Nan 
266fca08f32SWang Nan #define TEST_P(code1, reg1, val1, code2)	\
267fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2)	\
268fca08f32SWang Nan 	TEST_ARG_PTR(reg1, val1)		\
269fca08f32SWang Nan 	TEST_ARG_END("")			\
270fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2)	\
271fca08f32SWang Nan 	TESTCASE_END
272fca08f32SWang Nan 
273fca08f32SWang Nan #define TEST_PR(code1, reg1, val1, code2, reg2, val2, code3)	\
274fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3)		\
275fca08f32SWang Nan 	TEST_ARG_PTR(reg1, val1)				\
276fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)				\
277fca08f32SWang Nan 	TEST_ARG_END("")					\
278fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3)		\
279fca08f32SWang Nan 	TESTCASE_END
280fca08f32SWang Nan 
281fca08f32SWang Nan #define TEST_RP(code1, reg1, val1, code2, reg2, val2, code3)	\
282fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3)		\
283fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)				\
284fca08f32SWang Nan 	TEST_ARG_PTR(reg2, val2)				\
285fca08f32SWang Nan 	TEST_ARG_END("")					\
286fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3)		\
287fca08f32SWang Nan 	TESTCASE_END
288fca08f32SWang Nan 
289fca08f32SWang Nan #define TEST_PRR(code1, reg1, val1, code2, reg2, val2, code3, reg3, val3, code4)\
290fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
291fca08f32SWang Nan 	TEST_ARG_PTR(reg1, val1)						\
292fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)						\
293fca08f32SWang Nan 	TEST_ARG_REG(reg3, val3)						\
294fca08f32SWang Nan 	TEST_ARG_END("")							\
295fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
296fca08f32SWang Nan 	TESTCASE_END
297fca08f32SWang Nan 
298fca08f32SWang Nan #define TEST_RPR(code1, reg1, val1, code2, reg2, val2, code3, reg3, val3, code4)\
299fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
300fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)						\
301fca08f32SWang Nan 	TEST_ARG_PTR(reg2, val2)						\
302fca08f32SWang Nan 	TEST_ARG_REG(reg3, val3)						\
303fca08f32SWang Nan 	TEST_ARG_END("")							\
304fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
305fca08f32SWang Nan 	TESTCASE_END
306fca08f32SWang Nan 
307fca08f32SWang Nan #define TEST_RRP(code1, reg1, val1, code2, reg2, val2, code3, reg3, val3, code4)\
308fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
309fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)						\
310fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)						\
311fca08f32SWang Nan 	TEST_ARG_PTR(reg3, val3)						\
312fca08f32SWang Nan 	TEST_ARG_END("")							\
313fca08f32SWang Nan 	TEST_INSTRUCTION(code1 #reg1 code2 #reg2 code3 #reg3 code4)		\
314fca08f32SWang Nan 	TESTCASE_END
315fca08f32SWang Nan 
316fca08f32SWang Nan #define TEST_BF_P(code1, reg1, val1, code2)	\
317fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2)	\
318fca08f32SWang Nan 	TEST_ARG_PTR(reg1, val1)		\
319fca08f32SWang Nan 	TEST_ARG_END("")			\
320fca08f32SWang Nan 	TEST_BRANCH_F(code1 #reg1 code2)	\
321fca08f32SWang Nan 	TESTCASE_END
322fca08f32SWang Nan 
323fca08f32SWang Nan #define TEST_BF(code)				\
324fca08f32SWang Nan 	TESTCASE_START(code)			\
325fca08f32SWang Nan 	TEST_ARG_END("")			\
326fca08f32SWang Nan 	TEST_BRANCH_F(code)			\
327fca08f32SWang Nan 	TESTCASE_END
328fca08f32SWang Nan 
329fca08f32SWang Nan #define TEST_BB(code)				\
330fca08f32SWang Nan 	TESTCASE_START(code)			\
331fca08f32SWang Nan 	TEST_ARG_END("")			\
332fca08f32SWang Nan 	TEST_BRANCH_B(code)			\
333fca08f32SWang Nan 	TESTCASE_END
334fca08f32SWang Nan 
335fca08f32SWang Nan #define TEST_BF_R(code1, reg, val, code2)	\
336fca08f32SWang Nan 	TESTCASE_START(code1 #reg code2)	\
337fca08f32SWang Nan 	TEST_ARG_REG(reg, val)			\
338fca08f32SWang Nan 	TEST_ARG_END("")			\
339fca08f32SWang Nan 	TEST_BRANCH_F(code1 #reg code2)		\
340fca08f32SWang Nan 	TESTCASE_END
341fca08f32SWang Nan 
342fca08f32SWang Nan #define TEST_BB_R(code1, reg, val, code2)	\
343fca08f32SWang Nan 	TESTCASE_START(code1 #reg code2)	\
344fca08f32SWang Nan 	TEST_ARG_REG(reg, val)			\
345fca08f32SWang Nan 	TEST_ARG_END("")			\
346fca08f32SWang Nan 	TEST_BRANCH_B(code1 #reg code2)		\
347fca08f32SWang Nan 	TESTCASE_END
348fca08f32SWang Nan 
349fca08f32SWang Nan #define TEST_BF_RR(code1, reg1, val1, code2, reg2, val2, code3)	\
350fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3)		\
351fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)				\
352fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)				\
353fca08f32SWang Nan 	TEST_ARG_END("")					\
354fca08f32SWang Nan 	TEST_BRANCH_F(code1 #reg1 code2 #reg2 code3)		\
355fca08f32SWang Nan 	TESTCASE_END
356fca08f32SWang Nan 
357fca08f32SWang Nan #define TEST_BF_X(code, codex)			\
358fca08f32SWang Nan 	TESTCASE_START(code)			\
359fca08f32SWang Nan 	TEST_ARG_END("")			\
360fca08f32SWang Nan 	TEST_BRANCH_FX(code, codex)		\
361fca08f32SWang Nan 	TESTCASE_END
362fca08f32SWang Nan 
363fca08f32SWang Nan #define TEST_BB_X(code, codex)			\
364fca08f32SWang Nan 	TESTCASE_START(code)			\
365fca08f32SWang Nan 	TEST_ARG_END("")			\
366fca08f32SWang Nan 	TEST_BRANCH_BX(code, codex)		\
367fca08f32SWang Nan 	TESTCASE_END
368fca08f32SWang Nan 
369fca08f32SWang Nan #define TEST_BF_RX(code1, reg, val, code2, codex)	\
370fca08f32SWang Nan 	TESTCASE_START(code1 #reg code2)		\
371fca08f32SWang Nan 	TEST_ARG_REG(reg, val)				\
372fca08f32SWang Nan 	TEST_ARG_END("")				\
373fca08f32SWang Nan 	TEST_BRANCH_FX(code1 #reg code2, codex)		\
374fca08f32SWang Nan 	TESTCASE_END
375fca08f32SWang Nan 
376fca08f32SWang Nan #define TEST_X(code, codex)			\
377fca08f32SWang Nan 	TESTCASE_START(code)			\
378fca08f32SWang Nan 	TEST_ARG_END("")			\
379fca08f32SWang Nan 	TEST_INSTRUCTION(code)			\
380fca08f32SWang Nan 	"	b	99f		\n\t"	\
381fca08f32SWang Nan 	"	"codex"			\n\t"	\
382fca08f32SWang Nan 	TESTCASE_END
383fca08f32SWang Nan 
384fca08f32SWang Nan #define TEST_RX(code1, reg, val, code2, codex)		\
385fca08f32SWang Nan 	TESTCASE_START(code1 #reg code2)		\
386fca08f32SWang Nan 	TEST_ARG_REG(reg, val)				\
387fca08f32SWang Nan 	TEST_ARG_END("")				\
388fca08f32SWang Nan 	TEST_INSTRUCTION(code1 __stringify(reg) code2)	\
389fca08f32SWang Nan 	"	b	99f		\n\t"		\
390fca08f32SWang Nan 	"	"codex"			\n\t"		\
391fca08f32SWang Nan 	TESTCASE_END
392fca08f32SWang Nan 
393fca08f32SWang Nan #define TEST_RRX(code1, reg1, val1, code2, reg2, val2, code3, codex)		\
394fca08f32SWang Nan 	TESTCASE_START(code1 #reg1 code2 #reg2 code3)				\
395fca08f32SWang Nan 	TEST_ARG_REG(reg1, val1)						\
396fca08f32SWang Nan 	TEST_ARG_REG(reg2, val2)						\
397fca08f32SWang Nan 	TEST_ARG_END("")							\
398fca08f32SWang Nan 	TEST_INSTRUCTION(code1 __stringify(reg1) code2 __stringify(reg2) code3)	\
399fca08f32SWang Nan 	"	b	99f		\n\t"					\
400fca08f32SWang Nan 	"	"codex"			\n\t"					\
401fca08f32SWang Nan 	TESTCASE_END
402fca08f32SWang Nan 
4034cd872d9SJon Medhurst (Tixy) #define TEST_RMASKED(code1, reg, mask, code2)		\
4044cd872d9SJon Medhurst (Tixy) 	TESTCASE_START(code1 #reg code2)		\
4054cd872d9SJon Medhurst (Tixy) 	TEST_ARG_REG_MASKED(reg, mask)			\
4064cd872d9SJon Medhurst (Tixy) 	TEST_ARG_END("")				\
4074cd872d9SJon Medhurst (Tixy) 	TEST_INSTRUCTION(code1 #reg code2)		\
4084cd872d9SJon Medhurst (Tixy) 	TESTCASE_END
4094cd872d9SJon Medhurst (Tixy) 
4104cd872d9SJon Medhurst (Tixy) /*
4114cd872d9SJon Medhurst (Tixy)  * We ignore the state of the imprecise abort disable flag (CPSR.A) because this
4124cd872d9SJon Medhurst (Tixy)  * can change randomly as the kernel doesn't take care to preserve or initialise
4134cd872d9SJon Medhurst (Tixy)  * this across context switches. Also, with Security Extensions, the flag may
4144cd872d9SJon Medhurst (Tixy)  * not be under control of the kernel; for this reason we ignore the state of
4154cd872d9SJon Medhurst (Tixy)  * the FIQ disable flag CPSR.F as well.
4164cd872d9SJon Medhurst (Tixy)  */
4174cd872d9SJon Medhurst (Tixy) #define PSR_IGNORE_BITS (PSR_A_BIT | PSR_F_BIT)
4184cd872d9SJon Medhurst (Tixy) 
419fca08f32SWang Nan 
420fca08f32SWang Nan /*
421fca08f32SWang Nan  * Macros for defining space directives spread over multiple lines.
422fca08f32SWang Nan  * These are required so the compiler guesses better the length of inline asm
423fca08f32SWang Nan  * code and will spill the literal pool early enough to avoid generating PC
424fca08f32SWang Nan  * relative loads with out of range offsets.
425fca08f32SWang Nan  */
426fca08f32SWang Nan #define TWICE(x)	x x
427fca08f32SWang Nan #define SPACE_0x8	TWICE(".space 4\n\t")
428fca08f32SWang Nan #define SPACE_0x10	TWICE(SPACE_0x8)
429fca08f32SWang Nan #define SPACE_0x20	TWICE(SPACE_0x10)
430fca08f32SWang Nan #define SPACE_0x40	TWICE(SPACE_0x20)
431fca08f32SWang Nan #define SPACE_0x80	TWICE(SPACE_0x40)
432fca08f32SWang Nan #define SPACE_0x100	TWICE(SPACE_0x80)
433fca08f32SWang Nan #define SPACE_0x200	TWICE(SPACE_0x100)
434fca08f32SWang Nan #define SPACE_0x400	TWICE(SPACE_0x200)
435fca08f32SWang Nan #define SPACE_0x800	TWICE(SPACE_0x400)
436fca08f32SWang Nan #define SPACE_0x1000	TWICE(SPACE_0x800)
437fca08f32SWang Nan 
438fca08f32SWang Nan 
439fca08f32SWang Nan /* Various values used in test cases... */
440fca08f32SWang Nan #define N(val)	(val ^ 0xffffffff)
441fca08f32SWang Nan #define VAL1	0x12345678
442fca08f32SWang Nan #define VAL2	N(VAL1)
443fca08f32SWang Nan #define VAL3	0xa5f801
444fca08f32SWang Nan #define VAL4	N(VAL3)
445fca08f32SWang Nan #define VALM	0x456789ab
446fca08f32SWang Nan #define VALR	0xdeaddead
447fca08f32SWang Nan #define HH1	0x0123fecb
448fca08f32SWang Nan #define HH2	0xa9874567
449fca08f32SWang Nan 
450fca08f32SWang Nan 
451fca08f32SWang Nan #ifdef CONFIG_THUMB2_KERNEL
452fca08f32SWang Nan void kprobe_thumb16_test_cases(void);
453fca08f32SWang Nan void kprobe_thumb32_test_cases(void);
454fca08f32SWang Nan #else
455fca08f32SWang Nan void kprobe_arm_test_cases(void);
456fca08f32SWang Nan #endif
457*1b9c3ddcSArnd Bergmann 
458*1b9c3ddcSArnd Bergmann void __kprobes_test_case_start(void);
459*1b9c3ddcSArnd Bergmann void __kprobes_test_case_end_16(void);
460*1b9c3ddcSArnd Bergmann void __kprobes_test_case_end_32(void);
461