]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
kselftest/arm64: Convert tpidr2 test to use kselftest.h
authorMark Brown <broonie@kernel.org>
Mon, 9 Jun 2025 13:29:10 +0000 (14:29 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Thu, 3 Jul 2025 09:44:15 +0000 (10:44 +0100)
Recent work by Thomas Weißschuh means that it is now possible to use
kselftest.h with nolibc. Convert the tpidr2 test which is nolibc specific
to use kselftest.h, making it look more standard and ensuring it gets the
benefit of any work done on kselftest.h.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250609-kselftest-arm64-nolibc-header-v1-1-16ee1c6fbfed@kernel.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
tools/testing/selftests/arm64/abi/Makefile
tools/testing/selftests/arm64/abi/tpidr2.c

index a6d30c620908424c2a49928455ec8e6173ad82a6..483488f8c2adc57b48a2c817a28835fe3621b026 100644 (file)
@@ -12,4 +12,4 @@ $(OUTPUT)/syscall-abi: syscall-abi.c syscall-abi-asm.S
 $(OUTPUT)/tpidr2: tpidr2.c
        $(CC) -fno-asynchronous-unwind-tables -fno-ident -s -Os -nostdlib \
                -static -include ../../../../include/nolibc/nolibc.h \
-               -ffreestanding -Wall $^ -o $@ -lgcc
+               -I../.. -ffreestanding -Wall $^ -o $@ -lgcc
index eb19dcc37a755998da99a392922bd97e6a9b325b..f58a9f89b952c42c5393b93a2db4fefe3f335e5a 100644 (file)
@@ -3,31 +3,12 @@
 #include <linux/sched.h>
 #include <linux/wait.h>
 
+#include "kselftest.h"
+
 #define SYS_TPIDR2 "S3_3_C13_C0_5"
 
 #define EXPECTED_TESTS 5
 
-static void putstr(const char *str)
-{
-       write(1, str, strlen(str));
-}
-
-static void putnum(unsigned int num)
-{
-       char c;
-
-       if (num / 10)
-               putnum(num / 10);
-
-       c = '0' + (num % 10);
-       write(1, &c, 1);
-}
-
-static int tests_run;
-static int tests_passed;
-static int tests_failed;
-static int tests_skipped;
-
 static void set_tpidr2(uint64_t val)
 {
        asm volatile (
@@ -50,20 +31,6 @@ static uint64_t get_tpidr2(void)
        return val;
 }
 
-static void print_summary(void)
-{
-       if (tests_passed + tests_failed + tests_skipped != EXPECTED_TESTS)
-               putstr("# UNEXPECTED TEST COUNT: ");
-
-       putstr("# Totals: pass:");
-       putnum(tests_passed);
-       putstr(" fail:");
-       putnum(tests_failed);
-       putstr(" xfail:0 xpass:0 skip:");
-       putnum(tests_skipped);
-       putstr(" error:0\n");
-}
-
 /* Processes should start with TPIDR2 == 0 */
 static int default_value(void)
 {
@@ -105,9 +72,8 @@ static int write_fork_read(void)
        if (newpid == 0) {
                /* In child */
                if (get_tpidr2() != oldpid) {
-                       putstr("# TPIDR2 changed in child: ");
-                       putnum(get_tpidr2());
-                       putstr("\n");
+                       ksft_print_msg("TPIDR2 changed in child: %llx\n",
+                                      get_tpidr2());
                        exit(0);
                }
 
@@ -115,14 +81,12 @@ static int write_fork_read(void)
                if (get_tpidr2() == getpid()) {
                        exit(1);
                } else {
-                       putstr("# Failed to set TPIDR2 in child\n");
+                       ksft_print_msg("Failed to set TPIDR2 in child\n");
                        exit(0);
                }
        }
        if (newpid < 0) {
-               putstr("# fork() failed: -");
-               putnum(-newpid);
-               putstr("\n");
+               ksft_print_msg("fork() failed: %d\n", newpid);
                return 0;
        }
 
@@ -132,23 +96,22 @@ static int write_fork_read(void)
                if (waiting < 0) {
                        if (errno == EINTR)
                                continue;
-                       putstr("# waitpid() failed: ");
-                       putnum(errno);
-                       putstr("\n");
+                       ksft_print_msg("waitpid() failed: %d\n", errno);
                        return 0;
                }
                if (waiting != newpid) {
-                       putstr("# waitpid() returned wrong PID\n");
+                       ksft_print_msg("waitpid() returned wrong PID: %d != %d\n",
+                                      waiting, newpid);
                        return 0;
                }
 
                if (!WIFEXITED(status)) {
-                       putstr("# child did not exit\n");
+                       ksft_print_msg("child did not exit\n");
                        return 0;
                }
 
                if (getpid() != get_tpidr2()) {
-                       putstr("# TPIDR2 corrupted in parent\n");
+                       ksft_print_msg("TPIDR2 corrupted in parent\n");
                        return 0;
                }
 
@@ -188,35 +151,32 @@ static int write_clone_read(void)
 
        stack = malloc(__STACK_SIZE);
        if (!stack) {
-               putstr("# malloc() failed\n");
+               ksft_print_msg("malloc() failed\n");
                return 0;
        }
 
        ret = sys_clone(CLONE_VM, (unsigned long)stack + __STACK_SIZE,
                        &parent_tid, 0, &child_tid);
        if (ret == -1) {
-               putstr("# clone() failed\n");
-               putnum(errno);
-               putstr("\n");
+               ksft_print_msg("clone() failed: %d\n", errno);
                return 0;
        }
 
        if (ret == 0) {
                /* In child */
                if (get_tpidr2() != 0) {
-                       putstr("# TPIDR2 non-zero in child: ");
-                       putnum(get_tpidr2());
-                       putstr("\n");
+                       ksft_print_msg("TPIDR2 non-zero in child: %llx\n",
+                                      get_tpidr2());
                        exit(0);
                }
 
                if (gettid() == 0)
-                       putstr("# Child TID==0\n");
+                       ksft_print_msg("Child TID==0\n");
                set_tpidr2(gettid());
                if (get_tpidr2() == gettid()) {
                        exit(1);
                } else {
-                       putstr("# Failed to set TPIDR2 in child\n");
+                       ksft_print_msg("Failed to set TPIDR2 in child\n");
                        exit(0);
                }
        }
@@ -227,25 +187,22 @@ static int write_clone_read(void)
                if (waiting < 0) {
                        if (errno == EINTR)
                                continue;
-                       putstr("# wait4() failed: ");
-                       putnum(errno);
-                       putstr("\n");
+                       ksft_print_msg("wait4() failed: %d\n", errno);
                        return 0;
                }
                if (waiting != ret) {
-                       putstr("# wait4() returned wrong PID ");
-                       putnum(waiting);
-                       putstr("\n");
+                       ksft_print_msg("wait4() returned wrong PID %d\n",
+                                      waiting);
                        return 0;
                }
 
                if (!WIFEXITED(status)) {
-                       putstr("# child did not exit\n");
+                       ksft_print_msg("child did not exit\n");
                        return 0;
                }
 
                if (parent != get_tpidr2()) {
-                       putstr("# TPIDR2 corrupted in parent\n");
+                       ksft_print_msg("TPIDR2 corrupted in parent\n");
                        return 0;
                }
 
@@ -253,35 +210,14 @@ static int write_clone_read(void)
        }
 }
 
-#define run_test(name)                      \
-       if (name()) {                        \
-               tests_passed++;              \
-       } else {                             \
-               tests_failed++;              \
-               putstr("not ");              \
-       }                                    \
-       putstr("ok ");                       \
-       putnum(++tests_run);                 \
-       putstr(" " #name "\n");
-
-#define skip_test(name)                             \
-       tests_skipped++;                     \
-       putstr("ok ");                       \
-       putnum(++tests_run);                 \
-       putstr(" # SKIP " #name "\n");
-
 int main(int argc, char **argv)
 {
        int ret;
 
-       putstr("TAP version 13\n");
-       putstr("1..");
-       putnum(EXPECTED_TESTS);
-       putstr("\n");
+       ksft_print_header();
+       ksft_set_plan(5);
 
-       putstr("# PID: ");
-       putnum(getpid());
-       putstr("\n");
+       ksft_print_msg("PID: %d\n", getpid());
 
        /*
         * This test is run with nolibc which doesn't support hwcap and
@@ -290,23 +226,21 @@ int main(int argc, char **argv)
         */
        ret = open("/proc/sys/abi/sme_default_vector_length", O_RDONLY, 0);
        if (ret >= 0) {
-               run_test(default_value);
-               run_test(write_read);
-               run_test(write_sleep_read);
-               run_test(write_fork_read);
-               run_test(write_clone_read);
+               ksft_test_result(default_value(), "default_value\n");
+               ksft_test_result(write_read, "write_read\n");
+               ksft_test_result(write_sleep_read, "write_sleep_read\n");
+               ksft_test_result(write_fork_read, "write_fork_read\n");
+               ksft_test_result(write_clone_read, "write_clone_read\n");
 
        } else {
-               putstr("# SME support not present\n");
+               ksft_print_msg("SME support not present\n");
 
-               skip_test(default_value);
-               skip_test(write_read);
-               skip_test(write_sleep_read);
-               skip_test(write_fork_read);
-               skip_test(write_clone_read);
+               ksft_test_result_skip("default_value\n");
+               ksft_test_result_skip("write_read\n");
+               ksft_test_result_skip("write_sleep_read\n");
+               ksft_test_result_skip("write_fork_read\n");
+               ksft_test_result_skip("write_clone_read\n");
        }
 
-       print_summary();
-
-       return 0;
+       ksft_finished();
 }