1 // SPDX-License-Identifier: GPL-2.0+
2 
3 #include <linux/kernel.h>
4 #include <linux/kprobes.h>
5 #include <linux/random.h>
6 #include <kunit/test.h>
7 #include "test_kprobes.h"
8 
9 static struct kprobe kp;
10 
setup_kprobe(struct kunit * test,struct kprobe * kp,const char * symbol,int offset)11 static void setup_kprobe(struct kunit *test, struct kprobe *kp,
12 			 const char *symbol, int offset)
13 {
14 	kp->offset = offset;
15 	kp->addr = NULL;
16 	kp->symbol_name = symbol;
17 }
18 
test_kprobe_offset(struct kunit * test,struct kprobe * kp,const char * target,int offset)19 static void test_kprobe_offset(struct kunit *test, struct kprobe *kp,
20 			       const char *target, int offset)
21 {
22 	int ret;
23 
24 	setup_kprobe(test, kp, target, 0);
25 	ret = register_kprobe(kp);
26 	if (!ret)
27 		unregister_kprobe(kp);
28 	KUNIT_EXPECT_EQ(test, 0, ret);
29 	setup_kprobe(test, kp, target, offset);
30 	ret = register_kprobe(kp);
31 	KUNIT_EXPECT_EQ(test, -EINVAL, ret);
32 	if (!ret)
33 		unregister_kprobe(kp);
34 }
35 
test_kprobe_odd(struct kunit * test)36 static void test_kprobe_odd(struct kunit *test)
37 {
38 	test_kprobe_offset(test, &kp, "kprobes_target_odd",
39 			   kprobes_target_odd_offs);
40 }
41 
test_kprobe_in_insn4(struct kunit * test)42 static void test_kprobe_in_insn4(struct kunit *test)
43 {
44 	test_kprobe_offset(test, &kp, "kprobes_target_in_insn4",
45 			   kprobes_target_in_insn4_offs);
46 }
47 
test_kprobe_in_insn6_lo(struct kunit * test)48 static void test_kprobe_in_insn6_lo(struct kunit *test)
49 {
50 	test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_lo",
51 			   kprobes_target_in_insn6_lo_offs);
52 }
53 
test_kprobe_in_insn6_hi(struct kunit * test)54 static void test_kprobe_in_insn6_hi(struct kunit *test)
55 {
56 	test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_hi",
57 			   kprobes_target_in_insn6_hi_offs);
58 }
59 
60 static struct kunit_case kprobes_testcases[] = {
61 	KUNIT_CASE(test_kprobe_odd),
62 	KUNIT_CASE(test_kprobe_in_insn4),
63 	KUNIT_CASE(test_kprobe_in_insn6_lo),
64 	KUNIT_CASE(test_kprobe_in_insn6_hi),
65 	{}
66 };
67 
68 static struct kunit_suite kprobes_test_suite = {
69 	.name = "kprobes_test_s390",
70 	.test_cases = kprobes_testcases,
71 };
72 
73 kunit_test_suites(&kprobes_test_suite);
74 
75 MODULE_LICENSE("GPL");
76