tools/nolibc: add a helper to split a 64-bit argument into 32-bit halves

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>
This commit is contained in:
Daniel Palmer
2026-05-21 19:31:03 +02:00
committed by Thomas Weißschuh
parent f66d6bc35e
commit acbbec1519

View 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