1 // SPDX-License-Identifier: GPL-2.0+ 2 3 #include <linux/kernel.h> 4 #include <linux/kprobes.h> 5 #include <linux/random.h> 6 #include <kunit/test.h> 7 #include "test_kprobes.h" 8 9 static struct kprobe kp; 10 11 static void setup_kprobe(struct kunit *test, struct kprobe *kp, 12 const char *symbol, int offset) 13 { 14 kp->offset = offset; 15 kp->addr = NULL; 16 kp->symbol_name = symbol; 17 } 18 19 static void test_kprobe_offset(struct kunit *test, struct kprobe *kp, 20 const char *target, int offset) 21 { 22 int ret; 23 24 setup_kprobe(test, kp, target, 0); 25 ret = register_kprobe(kp); 26 if (!ret) 27 unregister_kprobe(kp); 28 KUNIT_EXPECT_EQ(test, 0, ret); 29 setup_kprobe(test, kp, target, offset); 30 ret = register_kprobe(kp); 31 KUNIT_EXPECT_EQ(test, -EINVAL, ret); 32 if (!ret) 33 unregister_kprobe(kp); 34 } 35 36 static void test_kprobe_odd(struct kunit *test) 37 { 38 test_kprobe_offset(test, &kp, "kprobes_target_odd", 39 kprobes_target_odd_offs); 40 } 41 42 static void test_kprobe_in_insn4(struct kunit *test) 43 { 44 test_kprobe_offset(test, &kp, "kprobes_target_in_insn4", 45 kprobes_target_in_insn4_offs); 46 } 47 48 static void test_kprobe_in_insn6_lo(struct kunit *test) 49 { 50 test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_lo", 51 kprobes_target_in_insn6_lo_offs); 52 } 53 54 static void test_kprobe_in_insn6_hi(struct kunit *test) 55 { 56 test_kprobe_offset(test, &kp, "kprobes_target_in_insn6_hi", 57 kprobes_target_in_insn6_hi_offs); 58 } 59 60 static struct kunit_case kprobes_testcases[] = { 61 KUNIT_CASE(test_kprobe_odd), 62 KUNIT_CASE(test_kprobe_in_insn4), 63 KUNIT_CASE(test_kprobe_in_insn6_lo), 64 KUNIT_CASE(test_kprobe_in_insn6_hi), 65 {} 66 }; 67 68 static struct kunit_suite kprobes_test_suite = { 69 .name = "kprobes_test_s390", 70 .test_cases = kprobes_testcases, 71 }; 72 73 kunit_test_suites(&kprobes_test_suite); 74 75 MODULE_LICENSE("GPL"); 76