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