| From b7b7452f292f03eefafa6fd1da9bcfc933dee15a Mon Sep 17 00:00:00 2001 |
| From: Alistair Francis <alistair.francis@wdc.com> |
| Date: Wed, 18 Sep 2019 09:28:49 -0700 |
| Subject: [PATCH] date: Use 64 prefix syscall if we have to |
| |
| Some 32-bit architectures no longer have the 32-bit time_t syscalls. |
| Instead they have suffixed syscalls that returns a 64-bit time_t. If |
| the architecture doesn't have the non-suffixed syscall and is using a |
| 64-bit time_t let's use the suffixed syscall instead. |
| |
| This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel |
| headers. |
| |
| If an architecture only supports the suffixed syscalls, but is still |
| using a 32-bit time_t fall back to the libc call. |
| |
| Upstream-Status: Backport [https://git.busybox.net/busybox/commit/?id=b7b7452f292f03eefafa6fd1da9bcfc933dee15a] |
| Signed-off-by: Alistair Francis <alistair.francis@wdc.com> |
| Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> |
| --- |
| coreutils/date.c | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| --- a/coreutils/date.c |
| +++ b/coreutils/date.c |
| @@ -36,7 +36,7 @@ |
| //config:# defaults to "no": stat's nanosecond field is a bit non-portable |
| //config:config FEATURE_DATE_NANO |
| //config: bool "Support %[num]N nanosecond format specifier" |
| -//config: default n # syscall(__NR_clock_gettime) |
| +//config: default n # syscall(__NR_clock_gettime) or syscall(__NR_clock_gettime64) |
| //config: depends on DATE |
| //config: select PLATFORM_LINUX |
| //config: help |
| @@ -271,10 +271,17 @@ int date_main(int argc UNUSED_PARAM, cha |
| */ |
| #endif |
| } else { |
| -#if ENABLE_FEATURE_DATE_NANO |
| +#if ENABLE_FEATURE_DATE_NANO && defined(__NR_clock_gettime) |
| /* libc has incredibly messy way of doing this, |
| * typically requiring -lrt. We just skip all this mess */ |
| syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts); |
| +#elif ENABLE_FEATURE_DATE_NANO && __TIMESIZE == 64 |
| + /* Let's only support the 64 suffix syscalls for 64-bit time_t. |
| + * This simplifies the code for us as we don't need to convert |
| + * between 64-bit and 32-bit. We also don't have a way to |
| + * report overflow errors here. |
| + */ |
| + syscall(__NR_clock_gettime64, CLOCK_REALTIME, &ts); |
| #else |
| time(&ts.tv_sec); |
| #endif |