0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <linux/kprobes.h>
0010 #include <linux/random.h>
0011 #include <kunit/test.h>
0012
0013 #define div_factor 3
0014
0015 static u32 rand1, preh_val, posth_val;
0016 static u32 (*target)(u32 value);
0017 static u32 (*target2)(u32 value);
0018 static struct kunit *current_test;
0019
0020 static unsigned long (*internal_target)(void);
0021 static unsigned long (*stacktrace_target)(void);
0022 static unsigned long (*stacktrace_driver)(void);
0023 static unsigned long target_return_address[2];
0024
0025 static noinline u32 kprobe_target(u32 value)
0026 {
0027 return (value / div_factor);
0028 }
0029
0030 static int kp_pre_handler(struct kprobe *p, struct pt_regs *regs)
0031 {
0032 KUNIT_EXPECT_FALSE(current_test, preemptible());
0033 preh_val = (rand1 / div_factor);
0034 return 0;
0035 }
0036
0037 static void kp_post_handler(struct kprobe *p, struct pt_regs *regs,
0038 unsigned long flags)
0039 {
0040 KUNIT_EXPECT_FALSE(current_test, preemptible());
0041 KUNIT_EXPECT_EQ(current_test, preh_val, (rand1 / div_factor));
0042 posth_val = preh_val + div_factor;
0043 }
0044
0045 static struct kprobe kp = {
0046 .symbol_name = "kprobe_target",
0047 .pre_handler = kp_pre_handler,
0048 .post_handler = kp_post_handler
0049 };
0050
0051 static void test_kprobe(struct kunit *test)
0052 {
0053 current_test = test;
0054 KUNIT_EXPECT_EQ(test, 0, register_kprobe(&kp));
0055 target(rand1);
0056 unregister_kprobe(&kp);
0057 KUNIT_EXPECT_NE(test, 0, preh_val);
0058 KUNIT_EXPECT_NE(test, 0, posth_val);
0059 }
0060
0061 static noinline u32 kprobe_target2(u32 value)
0062 {
0063 return (value / div_factor) + 1;
0064 }
0065
0066 static noinline unsigned long kprobe_stacktrace_internal_target(void)
0067 {
0068 if (!target_return_address[0])
0069 target_return_address[0] = (unsigned long)__builtin_return_address(0);
0070 return target_return_address[0];
0071 }
0072
0073 static noinline unsigned long kprobe_stacktrace_target(void)
0074 {
0075 if (!target_return_address[1])
0076 target_return_address[1] = (unsigned long)__builtin_return_address(0);
0077
0078 if (internal_target)
0079 internal_target();
0080
0081 return target_return_address[1];
0082 }
0083
0084 static noinline unsigned long kprobe_stacktrace_driver(void)
0085 {
0086 if (stacktrace_target)
0087 stacktrace_target();
0088
0089
0090 return (unsigned long)__builtin_return_address(0);
0091 }
0092
0093 static int kp_pre_handler2(struct kprobe *p, struct pt_regs *regs)
0094 {
0095 preh_val = (rand1 / div_factor) + 1;
0096 return 0;
0097 }
0098
0099 static void kp_post_handler2(struct kprobe *p, struct pt_regs *regs,
0100 unsigned long flags)
0101 {
0102 KUNIT_EXPECT_EQ(current_test, preh_val, (rand1 / div_factor) + 1);
0103 posth_val = preh_val + div_factor;
0104 }
0105
0106 static struct kprobe kp2 = {
0107 .symbol_name = "kprobe_target2",
0108 .pre_handler = kp_pre_handler2,
0109 .post_handler = kp_post_handler2
0110 };
0111
0112 static void test_kprobes(struct kunit *test)
0113 {
0114 struct kprobe *kps[2] = {&kp, &kp2};
0115
0116 current_test = test;
0117
0118
0119 kp.addr = NULL;
0120 kp.flags = 0;
0121
0122 KUNIT_EXPECT_EQ(test, 0, register_kprobes(kps, 2));
0123 preh_val = 0;
0124 posth_val = 0;
0125 target(rand1);
0126
0127 KUNIT_EXPECT_NE(test, 0, preh_val);
0128 KUNIT_EXPECT_NE(test, 0, posth_val);
0129
0130 preh_val = 0;
0131 posth_val = 0;
0132 target2(rand1);
0133
0134 KUNIT_EXPECT_NE(test, 0, preh_val);
0135 KUNIT_EXPECT_NE(test, 0, posth_val);
0136 unregister_kprobes(kps, 2);
0137 }
0138
0139 #ifdef CONFIG_KRETPROBES
0140 static u32 krph_val;
0141
0142 static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
0143 {
0144 KUNIT_EXPECT_FALSE(current_test, preemptible());
0145 krph_val = (rand1 / div_factor);
0146 return 0;
0147 }
0148
0149 static int return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
0150 {
0151 unsigned long ret = regs_return_value(regs);
0152
0153 KUNIT_EXPECT_FALSE(current_test, preemptible());
0154 KUNIT_EXPECT_EQ(current_test, ret, rand1 / div_factor);
0155 KUNIT_EXPECT_NE(current_test, krph_val, 0);
0156 krph_val = rand1;
0157 return 0;
0158 }
0159
0160 static struct kretprobe rp = {
0161 .handler = return_handler,
0162 .entry_handler = entry_handler,
0163 .kp.symbol_name = "kprobe_target"
0164 };
0165
0166 static void test_kretprobe(struct kunit *test)
0167 {
0168 current_test = test;
0169 KUNIT_EXPECT_EQ(test, 0, register_kretprobe(&rp));
0170 target(rand1);
0171 unregister_kretprobe(&rp);
0172 KUNIT_EXPECT_EQ(test, krph_val, rand1);
0173 }
0174
0175 static int return_handler2(struct kretprobe_instance *ri, struct pt_regs *regs)
0176 {
0177 unsigned long ret = regs_return_value(regs);
0178
0179 KUNIT_EXPECT_EQ(current_test, ret, (rand1 / div_factor) + 1);
0180 KUNIT_EXPECT_NE(current_test, krph_val, 0);
0181 krph_val = rand1;
0182 return 0;
0183 }
0184
0185 static struct kretprobe rp2 = {
0186 .handler = return_handler2,
0187 .entry_handler = entry_handler,
0188 .kp.symbol_name = "kprobe_target2"
0189 };
0190
0191 static void test_kretprobes(struct kunit *test)
0192 {
0193 struct kretprobe *rps[2] = {&rp, &rp2};
0194
0195 current_test = test;
0196
0197 rp.kp.addr = NULL;
0198 rp.kp.flags = 0;
0199 KUNIT_EXPECT_EQ(test, 0, register_kretprobes(rps, 2));
0200
0201 krph_val = 0;
0202 target(rand1);
0203 KUNIT_EXPECT_EQ(test, krph_val, rand1);
0204
0205 krph_val = 0;
0206 target2(rand1);
0207 KUNIT_EXPECT_EQ(test, krph_val, rand1);
0208 unregister_kretprobes(rps, 2);
0209 }
0210
0211 #ifdef CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE
0212 #define STACK_BUF_SIZE 16
0213 static unsigned long stack_buf[STACK_BUF_SIZE];
0214
0215 static int stacktrace_return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
0216 {
0217 unsigned long retval = regs_return_value(regs);
0218 int i, ret;
0219
0220 KUNIT_EXPECT_FALSE(current_test, preemptible());
0221 KUNIT_EXPECT_EQ(current_test, retval, target_return_address[1]);
0222
0223
0224
0225
0226
0227
0228 ret = stack_trace_save(stack_buf, STACK_BUF_SIZE, 0);
0229 KUNIT_EXPECT_NE(current_test, ret, 0);
0230
0231 for (i = 0; i < ret; i++) {
0232 if (stack_buf[i] == target_return_address[1])
0233 break;
0234 }
0235 KUNIT_EXPECT_NE(current_test, i, ret);
0236
0237 #if !IS_MODULE(CONFIG_KPROBES_SANITY_TEST)
0238
0239
0240
0241
0242 ret = stack_trace_save_regs(regs, stack_buf, STACK_BUF_SIZE, 0);
0243 KUNIT_EXPECT_NE(current_test, ret, 0);
0244 KUNIT_EXPECT_EQ(current_test, stack_buf[0], target_return_address[1]);
0245 #endif
0246
0247 return 0;
0248 }
0249
0250 static struct kretprobe rp3 = {
0251 .handler = stacktrace_return_handler,
0252 .kp.symbol_name = "kprobe_stacktrace_target"
0253 };
0254
0255 static void test_stacktrace_on_kretprobe(struct kunit *test)
0256 {
0257 unsigned long myretaddr = (unsigned long)__builtin_return_address(0);
0258
0259 current_test = test;
0260 rp3.kp.addr = NULL;
0261 rp3.kp.flags = 0;
0262
0263
0264
0265
0266
0267
0268
0269 KUNIT_ASSERT_NE(test, myretaddr, stacktrace_driver());
0270
0271 KUNIT_ASSERT_EQ(test, 0, register_kretprobe(&rp3));
0272 KUNIT_ASSERT_NE(test, myretaddr, stacktrace_driver());
0273 unregister_kretprobe(&rp3);
0274 }
0275
0276 static int stacktrace_internal_return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
0277 {
0278 unsigned long retval = regs_return_value(regs);
0279 int i, ret;
0280
0281 KUNIT_EXPECT_FALSE(current_test, preemptible());
0282 KUNIT_EXPECT_EQ(current_test, retval, target_return_address[0]);
0283
0284
0285
0286
0287
0288
0289 ret = stack_trace_save(stack_buf, STACK_BUF_SIZE, 0);
0290 KUNIT_EXPECT_NE(current_test, ret, 0);
0291
0292 for (i = 0; i < ret - 1; i++) {
0293 if (stack_buf[i] == target_return_address[0]) {
0294 KUNIT_EXPECT_EQ(current_test, stack_buf[i + 1], target_return_address[1]);
0295 break;
0296 }
0297 }
0298 KUNIT_EXPECT_NE(current_test, i, ret);
0299
0300 #if !IS_MODULE(CONFIG_KPROBES_SANITY_TEST)
0301
0302 ret = stack_trace_save_regs(regs, stack_buf, STACK_BUF_SIZE, 0);
0303 KUNIT_EXPECT_NE(current_test, ret, 0);
0304 KUNIT_EXPECT_EQ(current_test, stack_buf[0], target_return_address[0]);
0305 KUNIT_EXPECT_EQ(current_test, stack_buf[1], target_return_address[1]);
0306 #endif
0307
0308 return 0;
0309 }
0310
0311 static struct kretprobe rp4 = {
0312 .handler = stacktrace_internal_return_handler,
0313 .kp.symbol_name = "kprobe_stacktrace_internal_target"
0314 };
0315
0316 static void test_stacktrace_on_nested_kretprobe(struct kunit *test)
0317 {
0318 unsigned long myretaddr = (unsigned long)__builtin_return_address(0);
0319 struct kretprobe *rps[2] = {&rp3, &rp4};
0320
0321 current_test = test;
0322 rp3.kp.addr = NULL;
0323 rp3.kp.flags = 0;
0324
0325
0326
0327 KUNIT_ASSERT_EQ(test, 0, register_kretprobes(rps, 2));
0328 KUNIT_ASSERT_NE(test, myretaddr, stacktrace_driver());
0329 unregister_kretprobes(rps, 2);
0330 }
0331 #endif
0332
0333 #endif
0334
0335 static int kprobes_test_init(struct kunit *test)
0336 {
0337 target = kprobe_target;
0338 target2 = kprobe_target2;
0339 stacktrace_target = kprobe_stacktrace_target;
0340 internal_target = kprobe_stacktrace_internal_target;
0341 stacktrace_driver = kprobe_stacktrace_driver;
0342
0343 do {
0344 rand1 = prandom_u32();
0345 } while (rand1 <= div_factor);
0346 return 0;
0347 }
0348
0349 static struct kunit_case kprobes_testcases[] = {
0350 KUNIT_CASE(test_kprobe),
0351 KUNIT_CASE(test_kprobes),
0352 #ifdef CONFIG_KRETPROBES
0353 KUNIT_CASE(test_kretprobe),
0354 KUNIT_CASE(test_kretprobes),
0355 #ifdef CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE
0356 KUNIT_CASE(test_stacktrace_on_kretprobe),
0357 KUNIT_CASE(test_stacktrace_on_nested_kretprobe),
0358 #endif
0359 #endif
0360 {}
0361 };
0362
0363 static struct kunit_suite kprobes_test_suite = {
0364 .name = "kprobes_test",
0365 .init = kprobes_test_init,
0366 .test_cases = kprobes_testcases,
0367 };
0368
0369 kunit_test_suites(&kprobes_test_suite);
0370
0371 MODULE_LICENSE("GPL");