| // 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_DESCRIPTION("KUnit tests for kprobes"); |
| MODULE_LICENSE("GPL"); |