mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
To: Andy Lutomirski <luto@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	 Vincenzo Frascino <vincenzo.frascino@arm.com>,
	 Shuah Khan <shuah@kernel.org>
Cc: "Arnd Bergmann" <arnd@arndb.de>,
	linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
	"Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
Subject: [PATCH v2 03/14] selftests: vDSO: Introduce vdso_syscalls.h
Date: Thu, 13 Nov 2025 16:30:19 +0100	[thread overview]
Message-ID: <20251113-vdso-test-types-v2-3-0427eff70d08@linutronix.de> (raw)
In-Reply-To: <20251113-vdso-test-types-v2-0-0427eff70d08@linutronix.de>

The vDSO selftests use raw system call wrapper to validate the
correctness of the vDSO implementation. The exactly available system
calls differ between architectures and kernel configurations.
Raw system calls should not use libc types as these are not necessarily
compatible.

Introduce a helper header which uses the correct types and fallbacks.

Link: https://lore.kernel.org/lkml/29dd9e11-9ae8-415a-acb3-b96af56550b0@app.fastmail.com/
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_syscalls.h | 93 ++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)

diff --git a/tools/testing/selftests/vDSO/vdso_syscalls.h b/tools/testing/selftests/vDSO/vdso_syscalls.h
new file mode 100644
index 0000000000000000000000000000000000000000..1419f8dd3ea831beaf582c47f6acf2ce5d5d12f8
--- /dev/null
+++ b/tools/testing/selftests/vDSO/vdso_syscalls.h
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2025 Thomas Weißschuh <thomas.weissschuh@linutronix.de>, Linutronix GmbH
+ *
+ * System call wrappers to use for vDSO testing.
+ *
+ * vDSO calls are expected to return the same data as the equivalent system call.
+ * To ensure this the tests need to trigger system calls. Calling into libc may
+ * silently use the vDSO, so explicit system calls are necessary.
+ * Not all system calls are available on all platforms, so some fallback logic
+ * is needed. Use __NR_ constants from the kernel's UAPI headers over SYS_ from
+ * ones from libc to avoid any potential interference from libc.
+ * Always prefer the 64-bit time variants of the system calls as 32-bit ones
+ * may not be present on the platform or disabled in the kernel configuration.
+ */
+#ifndef __VDSO_SYSCALLS_H__
+#define __VDSO_SYSCALLS_H__
+
+#include "vdso_types.h"
+
+#include <stddef.h>
+#include <sys/syscall.h>
+#include <linux/unistd.h>
+
+#define typeof_member(T, m)	typeof(((T*)0)->m)
+#define sizeof_member(T, m)	sizeof(typeof_member(T, m))
+
+/*
+ * To keep the fallback logic simple we assume that although the types between
+ * the wrapper and the system call are different they are compatible.
+ * Validate that assumption.
+ * On x32 tv_nsec of __kernel_old_timespec is smaller than the one from
+ * __kernel_timespec. This is fine, as only the lower 4 bytes are relevant and
+ * it is a little-endian architecture.
+ */
+#define ASSERT_TIMESPEC_COMPATIBLE(T1, T2)							\
+	do {											\
+		_Static_assert(sizeof(T2) == sizeof(T2));					\
+		_Static_assert(offsetof(T1, tv_sec) == offsetof(T2, tv_sec));			\
+		_Static_assert(sizeof_member(T1, tv_sec) == sizeof_member(T2, tv_sec));		\
+		_Static_assert(offsetof(T1, tv_nsec) == offsetof(T2, tv_nsec));			\
+		_Static_assert(sizeof_member(T1, tv_nsec) == sizeof_member(T2, tv_nsec) ||	\
+			       (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && 			\
+			       sizeof_member(T1, tv_nsec) > sizeof_member(T2, tv_nsec)));	\
+	} while(0)
+
+static inline
+int sys_clock_getres(__kernel_clockid_t clock, struct __kernel_timespec *ts)
+{
+#ifdef __NR_clock_getres_time64
+	return syscall(__NR_clock_getres_time64, clock, ts);
+#else
+	ASSERT_TIMESPEC_COMPATIBLE(typeof(*ts), struct __kernel_old_timespec);
+	return syscall(__NR_clock_getres, clock, ts);
+#endif
+}
+
+static inline
+int sys_clock_gettime(__kernel_clockid_t clock, struct __kernel_timespec *ts)
+{
+#ifdef __NR_clock_gettime64
+	return syscall(__NR_clock_gettime64, clock, ts);
+#else
+	ASSERT_TIMESPEC_COMPATIBLE(typeof(*ts), struct __kernel_old_timespec);
+	return syscall(__NR_clock_gettime, clock, ts);
+#endif
+}
+
+static inline
+int sys_gettimeofday(struct __kernel_old_timeval *tv, struct kernel_timezone *tz)
+{
+#ifdef __NR_gettimeofday
+	return syscall(__NR_gettimeofday, tv, tz);
+#else
+	/* Architectures with vdso_gettimeofday() also have __NR_gettimeofday */
+	errno = ENOSYS;
+	return -1;
+#endif
+}
+
+static inline
+__kernel_old_time_t sys_time(__kernel_old_time_t *tloc)
+{
+#ifdef __NR_time
+	return syscall(__NR_time, tloc);
+#else
+	/* Architectures with vdso_time() also have __NR_time */
+	errno = ENOSYS;
+	return -1;
+#endif
+}
+
+#endif /* __VDSO_SYSCALLS_H__ */

-- 
2.51.0


  parent reply	other threads:[~2025-11-13 15:31 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-13 15:30 [PATCH v2 00/14] selftests: vDSO: Stop using libc types for vDSO calls Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 01/14] Revert "selftests: vDSO: parse_vdso: Use UAPI headers instead of libc headers" Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 02/14] selftests: vDSO: Introduce vdso_types.h Thomas Weißschuh
2025-11-13 15:30 ` Thomas Weißschuh [this message]
2025-11-14  8:13   ` [PATCH v2 03/14] selftests: vDSO: Introduce vdso_syscalls.h Arnd Bergmann
2025-11-14  8:48     ` Thomas Weißschuh
2025-11-14  9:16       ` Arnd Bergmann
2025-11-14 10:02         ` Thomas Weißschuh
2025-11-14 10:40           ` Arnd Bergmann
2025-11-18 14:22             ` Thomas Weißschuh
2025-11-18 21:40               ` Arnd Bergmann
2025-11-20 13:27                 ` Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 04/14] selftests: vDSO: vdso_test_gettimeofday: Remove nolibc checks Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 05/14] selftests: vDSO: vdso_test_gettimeofday: Use types from vdso_types.h Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 06/14] selftests: vDSO: vdso_test_abi: " Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 07/14] selftests: vDSO: vdso_test_abi: Validate return value of syscall(clock_getres) Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 08/14] selftests: vDSO: vdso_test_abi: Use system call wrappers from vdso_syscalls.h Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 09/14] selftests: vDSO: vdso_test_correctness: Drop SYS_getcpu fallbacks Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 10/14] selftests: vDSO: vdso_test_correctness: Make ts_leq() and tv_leq() more generic Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 11/14] selftests: vDSO: vdso_test_correctness: Use types from vdso_types.h Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 12/14] selftests: vDSO: vdso_test_correctness: Use system call wrappers from vdso_syscalls.h Thomas Weißschuh
2025-11-14  8:01   ` Arnd Bergmann
2025-11-13 15:30 ` [PATCH v2 13/14] selftests: vDSO: vdso_test_correctness: Use facilities from parse_vdso.c Thomas Weißschuh
2025-11-13 15:30 ` [PATCH v2 14/14] selftests: vDSO: vdso_test_correctness: Add a test for time() Thomas Weißschuh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251113-vdso-test-types-v2-3-0427eff70d08@linutronix.de \
    --to=thomas.weissschuh@linutronix.de \
    --cc=arnd@arndb.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=shuah@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=vincenzo.frascino@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®