#if IS_BUILTIN(CONFIG_KUNIT)
 
 static char *filter_glob_param;
+static char *action_param;
+
 module_param_named(filter_glob, filter_glob_param, charp, 0);
 MODULE_PARM_DESC(filter_glob,
                "Filter which KUnit test suites/tests run at boot-time, e.g. list* or list*.*del_test");
+module_param_named(action, action_param, charp, 0);
+MODULE_PARM_DESC(action,
+                "Changes KUnit executor behavior, valid values are:\n"
+                "<none>: run the tests like normal\n"
+                "'list' to list test names instead of running them.\n");
 
 /* glob_match() needs NULL terminated strings, so we need a copy of filter_glob_param. */
 struct kunit_test_filter {
        pr_info("1..%d\n", num_of_suites);
 }
 
-int kunit_run_all_tests(void)
+static void kunit_exec_run_tests(struct suite_set *suite_set)
 {
        struct kunit_suite * const * const *suites;
+
+       kunit_print_tap_header(suite_set);
+
+       for (suites = suite_set->start; suites < suite_set->end; suites++)
+               __kunit_test_suites_init(*suites);
+}
+
+static void kunit_exec_list_tests(struct suite_set *suite_set)
+{
+       unsigned int i;
+       struct kunit_suite * const * const *suites;
+       struct kunit_case *test_case;
+
+       /* Hack: print a tap header so kunit.py can find the start of KUnit output. */
+       pr_info("TAP version 14\n");
+
+       for (suites = suite_set->start; suites < suite_set->end; suites++)
+               for (i = 0; (*suites)[i] != NULL; i++) {
+                       kunit_suite_for_each_test_case((*suites)[i], test_case) {
+                               pr_info("%s.%s\n", (*suites)[i]->name, test_case->name);
+                       }
+               }
+}
+
+int kunit_run_all_tests(void)
+{
        struct suite_set suite_set = {
                .start = __kunit_suites_start,
                .end = __kunit_suites_end,
        if (filter_glob_param)
                suite_set = kunit_filter_suites(&suite_set, filter_glob_param);
 
-       kunit_print_tap_header(&suite_set);
-
-       for (suites = suite_set.start; suites < suite_set.end; suites++)
-               __kunit_test_suites_init(*suites);
+       if (!action_param)
+               kunit_exec_run_tests(&suite_set);
+       else if (strcmp(action_param, "list") == 0)
+               kunit_exec_list_tests(&suite_set);
+       else
+               pr_err("kunit executor: unknown action '%s'\n", action_param);
 
        if (filter_glob_param) { /* a copy was made of each array */
                kunit_free_suite_set(suite_set);