xref: /linux/arch/riscv/kernel/tests/kprobes/test-kprobes.c (revision cb7e3669c683669d93139184adff68a7d9000536)
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