summaryrefslogtreecommitdiff
path: root/arch/s390/lib/test_kprobes.c
blob: 9e62d62812e52f996e76488f1b396b23d2470bb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// SPDX-License-Identifier: GPL-2.0+

#include <linux/kernel.h>
#include <linux/kprobes.h>
#include <linux/random.h>
#include <kunit/test.h>
#include "test_kprobes.h"

static struct kprobe kp;

static void setup_kprobe(struct kunit *test, struct kprobe *kp,
			 const char *symbol, int offset)
{
	kp->offset = offset;
	kp->addr = NULL;
	kp->symbol_name = symbol;
}

static void test_kprobe_offset(struct kunit *test, struct kprobe *kp,
			       const char *target, int offset)
{
	int ret;

	setup_kprobe(test, kp, target, 0);
	ret = register_kprobe(kp);
	if (!ret)
		unregister_kprobe(kp);
	KUNIT_EXPECT_EQ(test, 0, ret);
	setup_kprobe(test, kp, target, offset);
	ret = register_kprobe(kp);
	KUNIT_EXPECT_EQ(test, -EINVAL, ret);
	if (!ret)
		unregister_kprobe(kp);
}

static void test_kprobe_odd(struct kunit *test)
{
	test_kprobe_offset(test, &kp, "kprobes_target_odd",
			   kprobes_target_odd_offs);
}

static void test_kprobe_in_insn4(struct kunit *test)
{
	test_kprobe_offset(test, &kp, "kprobes_target_in_insn4",
			   kprobes_target_in_insn4_offs);
}

static void test_kprobe_in_insn6_lo(struct kunit *test)
{
	test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_lo",
			   kprobes_target_in_insn6_lo_offs);
}

static void test_kprobe_in_insn6_hi(struct kunit *test)
{
	test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_hi",
			   kprobes_target_in_insn6_hi_offs);
}

static struct kunit_case kprobes_testcases[] = {
	KUNIT_CASE(test_kprobe_odd),
	KUNIT_CASE(test_kprobe_in_insn4),
	KUNIT_CASE(test_kprobe_in_insn6_lo),
	KUNIT_CASE(test_kprobe_in_insn6_hi),
	{}
};

static struct kunit_suite kprobes_test_suite = {
	.name = "kprobes_test_s390",
	.test_cases = kprobes_testcases,
};

kunit_test_suites(&kprobes_test_suite);

MODULE_LICENSE("GPL");