[PATCH 2/3] tools/nolibc: add a helper to split a 64-bit argument into 32-bit halves

From: Thomas Weißschuh

Date: Thu May 21 2026 - 13:32:27 EST


From: Daniel Palmer <daniel@xxxxxxxxx>

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@xxxxxxxxx>
Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx>

---
Lifted from https://lore.kernel.org/lkml/20260507090353.356764-2-daniel@xxxxxxxxx/
---
tools/include/nolibc/sys.h | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
index 33f9c970ae57..548f94d96ed2 100644
--- a/tools/include/nolibc/sys.h
+++ b/tools/include/nolibc/sys.h
@@ -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

--
2.54.0