lib/test_fprobe: Add private entry_data testcases
authorMasami Hiramatsu (Google) <mhiramat@kernel.org>
Wed, 1 Feb 2023 15:56:10 +0000 (00:56 +0900)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Tue, 28 Mar 2023 22:52:22 +0000 (18:52 -0400)
Add test cases for checking whether private entry_data is
correctly passed or not.

Link: https://lkml.kernel.org/r/167526697074.433354.17790288501657876219.stgit@mhiramat.roam.corp.google.com
Cc: Florent Revest <revest@chromium.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
lib/test_fprobe.c

index e4f65d114ed23e591819b8c92b6fb7e7547c1efb..6c7ef5acea21351f9ff46f64e0c105cc8e9862ee 100644 (file)
@@ -38,6 +38,12 @@ static notrace void fp_entry_handler(struct fprobe *fp, unsigned long ip,
        if (ip != target_ip)
                KUNIT_EXPECT_EQ(current_test, ip, target2_ip);
        entry_val = (rand1 / div_factor);
+       if (fp->entry_data_size) {
+               KUNIT_EXPECT_NOT_NULL(current_test, data);
+               if (data)
+                       *(u32 *)data = entry_val;
+       } else
+               KUNIT_EXPECT_NULL(current_test, data);
 }
 
 static notrace void fp_exit_handler(struct fprobe *fp, unsigned long ip,
@@ -53,6 +59,12 @@ static notrace void fp_exit_handler(struct fprobe *fp, unsigned long ip,
                KUNIT_EXPECT_EQ(current_test, ret, (rand1 / div_factor));
        KUNIT_EXPECT_EQ(current_test, entry_val, (rand1 / div_factor));
        exit_val = entry_val + div_factor;
+       if (fp->entry_data_size) {
+               KUNIT_EXPECT_NOT_NULL(current_test, data);
+               if (data)
+                       KUNIT_EXPECT_EQ(current_test, *(u32 *)data, entry_val);
+       } else
+               KUNIT_EXPECT_NULL(current_test, data);
 }
 
 /* Test entry only (no rethook) */
@@ -134,6 +146,23 @@ static void test_fprobe_syms(struct kunit *test)
        KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp));
 }
 
+/* Test private entry_data */
+static void test_fprobe_data(struct kunit *test)
+{
+       struct fprobe fp = {
+               .entry_handler = fp_entry_handler,
+               .exit_handler = fp_exit_handler,
+               .entry_data_size = sizeof(u32),
+       };
+
+       current_test = test;
+       KUNIT_EXPECT_EQ(test, 0, register_fprobe(&fp, "fprobe_selftest_target", NULL));
+
+       target(rand1);
+
+       KUNIT_EXPECT_EQ(test, 0, unregister_fprobe(&fp));
+}
+
 static unsigned long get_ftrace_location(void *func)
 {
        unsigned long size, addr = (unsigned long)func;
@@ -159,6 +188,7 @@ static struct kunit_case fprobe_testcases[] = {
        KUNIT_CASE(test_fprobe_entry),
        KUNIT_CASE(test_fprobe),
        KUNIT_CASE(test_fprobe_syms),
+       KUNIT_CASE(test_fprobe_data),
        {}
 };