On Fri, May 26, 2023, at 09:15, Thomas Weißschuh wrote:
On 2023-05-25 01:57:24+0800, Zhangjin Wu wrote:
rv32 uses the generic include/uapi/asm-generic/unistd.h and it has no
+/* needed by time64 syscalls */ +struct timespec64 {
- time64_t tv_sec; /* seconds */
- long tv_nsec; /* nanoseconds */
+};
A question to you and Willy, as it's also done the same for other types:
What is the advantage of custom definitions over using the one from the kernel (maybe via a typedef).
From linux/time_types.h:
struct __kernel_timespec { __kernel_time64_t tv_set; long long tv_nsec; };
I agree the __kernel_* types are what we should be using when interacting with system calls directly, that is definitely what they are intended for.
I would go further here and completely drop support for 32-bit time_t/off_t and derived types in nolibc. Unfortunately, the kernel's include/uapi/linux/time.h header still defines the old types, this is one of the last remnants the time32 syscalls definitions in the kernel headers, and this already conflicts with the glibc and musl definitions, so anything that includes this header is broken on real systems. I think it makes most sense for nolibc to just use the linux/time_types.h header instead and use something like
#define timespec __kernel_timespec #define itimerspec __kernel_itimerspec typedef __kernel_time64_t time_t; /* timeval is only provided for users, not compatible with syscalls */ struct timeval { __kernel_time64_t tv_sec; __s64 tv_nsec; };
so we can drop all the fallbacks for old 32-bit targets. This also allows running with CONFIG_COMPAT_32BIT_TIME disabled.
Arnd