]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/nolibc: test compatibility of nolibc and kernel time types
authorThomas Weißschuh <linux@weissschuh.net>
Sat, 20 Dec 2025 13:55:54 +0000 (14:55 +0100)
committerThomas Weißschuh <linux@weissschuh.net>
Tue, 6 Jan 2026 11:08:04 +0000 (12:08 +0100)
Keeping 'struct timespec' and 'struct __kernel_timespec' compatible
allows the source code to stay simple.

Validate that the types stay compatible.

The test is specific to nolibc and does not compile on other libcs, so
skip it there.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Acked-by: Willy Tarreau <w@1wt.eu>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20251220-nolibc-uapi-types-v3-10-c662992f75d7@weissschuh.net
tools/testing/selftests/nolibc/nolibc-test.c

index 6888b20af25944fd14fc877c5546fc1e772fd193..3986d55a6ff67d7f1a6c5d9b1779aee16e547cdd 100644 (file)
@@ -1430,6 +1430,34 @@ int test_difftime(void)
        return 0;
 }
 
+int test_time_types(void)
+{
+#ifdef NOLIBC
+       struct __kernel_timespec kts;
+       struct timespec ts;
+
+       if (!__builtin_types_compatible_p(time_t, __kernel_time64_t))
+               return 1;
+
+       if (sizeof(ts) != sizeof(kts))
+               return 1;
+
+       if (!__builtin_types_compatible_p(__typeof__(ts.tv_sec), __typeof__(kts.tv_sec)))
+               return 1;
+
+       if (!__builtin_types_compatible_p(__typeof__(ts.tv_nsec), __typeof__(kts.tv_nsec)))
+               return 1;
+
+       if (offsetof(__typeof__(ts), tv_sec) != offsetof(__typeof__(kts), tv_sec))
+               return 1;
+
+       if (offsetof(__typeof__(ts), tv_nsec) != offsetof(__typeof__(kts), tv_nsec))
+               return 1;
+#endif /* NOLIBC */
+
+       return 0;
+}
+
 int run_stdlib(int min, int max)
 {
        int test;
@@ -1555,6 +1583,7 @@ int run_stdlib(int min, int max)
                CASE_TEST(difftime);                EXPECT_ZR(1, test_difftime()); break;
                CASE_TEST(memchr_foobar6_o);        EXPECT_STREQ(1, memchr("foobar", 'o', 6), "oobar"); break;
                CASE_TEST(memchr_foobar3_b);        EXPECT_STRZR(1, memchr("foobar", 'b', 3)); break;
+               CASE_TEST(time_types);              EXPECT_ZR(is_nolibc, test_time_types()); break;
 
                case __LINE__:
                        return ret; /* must be last */