]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tools/nolibc: add a helper to split a 64-bit argument into 32-bit halves
authorDaniel Palmer <daniel@thingy.jp>
Thu, 21 May 2026 17:31:03 +0000 (19:31 +0200)
committerThomas Weißschuh <linux@weissschuh.net>
Sun, 24 May 2026 21:57:59 +0000 (23:57 +0200)
On 32-bit architectures some system calls require a single 64-bit
argument to be passed as two 32-bit halves.

Add a helper to easily split such arguments. This works on little and
bit endian.

Signed-off-by: Daniel Palmer <daniel@thingy.jp>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://patch.msgid.link/20260521-nolibc-ftruncate-v1-2-5384a83b2402@weissschuh.net
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
tools/include/nolibc/sys.h

index 33f9c970ae5766bc6f003d7cdc936f45c455255f..548f94d96ed203a9c73e84a9933f0938e04b3cb3 100644 (file)
@@ -70,6 +70,17 @@ static __inline__ int __nolibc_enosys(const char *syscall, ...)
 }
 #endif
 
+
+/*
+ * Helper for 32-bit machines where a 64-bit syscall arg needs to be split into
+ * two 32-bit parts while making sure the order of the low/high parts are correct
+ * for the endianness:
+ * __NOLIBC_LLARGPART(x, 0), __NOLIBC_LLARGPART(x, 1)
+ */
+#define __NOLIBC_LLARGPART(_arg, _part) \
+       (((union { long long ll; long l[2]; }) { .ll = _arg }).l[_part])
+
+
 /* Functions in this file only describe syscalls. They're declared static so
  * that the compiler usually decides to inline them while still being allowed
  * to pass a pointer to one of their instances. Each syscall exists in two