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
9static struct kprobe kp;
10
11static 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
19static 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
36static void test_kprobe_odd(struct kunit *test)
37{
38	test_kprobe_offset(test, &kp, "kprobes_target_odd",
39			   kprobes_target_odd_offs);
40}
41
42static 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
48static 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
54static 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
60static 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
68static struct kunit_suite kprobes_test_suite = {
69	.name = "kprobes_test_s390",
70	.test_cases = kprobes_testcases,
71};
72
73kunit_test_suites(&kprobes_test_suite);
74
75MODULE_LICENSE("GPL");
76