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