1 // SPDX-License-Identifier: GPL-2.0+
2
3 #include <linux/kernel.h>
4 #include <linux/kprobes.h>
5 #include <kunit/test.h>
6 #include "test-kprobes.h"
7
kprobe_dummy_handler(struct kprobe * kp,struct pt_regs * regs)8 static int kprobe_dummy_handler(struct kprobe *kp, struct pt_regs *regs)
9 {
10 return 0;
11 }
12
test_kprobe_riscv(struct kunit * test)13 static void test_kprobe_riscv(struct kunit *test)
14 {
15 unsigned int num_kprobe = 0;
16 long (*func)(void);
17 struct kprobe *kp;
18 int i;
19
20 while (test_kprobes_addresses[num_kprobe])
21 num_kprobe++;
22
23 kp = kcalloc(num_kprobe, sizeof(*kp), GFP_KERNEL);
24 KUNIT_EXPECT_TRUE(test, kp);
25 if (!kp)
26 return;
27
28 for (i = 0; i < num_kprobe; ++i) {
29 kp[i].addr = test_kprobes_addresses[i];
30 kp[i].pre_handler = kprobe_dummy_handler;
31 KUNIT_EXPECT_EQ(test, 0, register_kprobe(&kp[i]));
32 }
33
34 for (i = 0;; ++i) {
35 func = test_kprobes_functions[i];
36 if (!func)
37 break;
38 KUNIT_EXPECT_EQ_MSG(test, KPROBE_TEST_MAGIC, func(), "function %d broken", i);
39 }
40
41 for (i = 0; i < num_kprobe; ++i)
42 unregister_kprobe(&kp[i]);
43 kfree(kp);
44 }
45
46 static struct kunit_case kprobes_testcases[] = {
47 KUNIT_CASE(test_kprobe_riscv),
48 {}
49 };
50
51 static struct kunit_suite kprobes_test_suite = {
52 .name = "kprobes_test_riscv",
53 .test_cases = kprobes_testcases,
54 };
55
56 kunit_test_suites(&kprobes_test_suite);
57