New y2038 safe 32-bit architectures (like RISC-V) don't support old
syscalls with a 32-bit time_t. The kernel defines new *_time64 versions
of these syscalls. Add some more #ifdefs to syscall.c in linux-user to
allow us to compile without these old syscalls.
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
linux-user/strace.c | 2 ++
linux-user/syscall.c | 18 ++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 3d4d684450..2eb8ae3d31 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -770,6 +770,7 @@ print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
#define TARGET_TIME_OOP 3 /* leap second in progress */
#define TARGET_TIME_WAIT 4 /* leap second has occurred */
#define TARGET_TIME_ERROR 5 /* clock not synchronized */
+#ifdef TARGET_NR_adjtimex
static void
print_syscall_ret_adjtimex(const struct syscallname *name, abi_long ret)
{
@@ -808,6 +809,7 @@ print_syscall_ret_adjtimex(const struct syscallname *name, abi_long ret)
gemu_log("\n");
}
+#endif
UNUSED static struct flags access_flags[] = {
FLAG_GENERIC(F_OK),
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index c930577686..44632a7f6a 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -738,8 +738,10 @@ safe_syscall3(ssize_t, read, int, fd, void *, buff, size_t, count)
safe_syscall3(ssize_t, write, int, fd, const void *, buff, size_t, count)
safe_syscall4(int, openat, int, dirfd, const char *, pathname, \
int, flags, mode_t, mode)
+#if defined(TARGET_NR_wait4)
safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, int, options, \
struct rusage *, rusage)
+#endif
safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
int, options, struct rusage *, rusage)
safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
@@ -776,8 +778,10 @@ safe_syscall4(int, rt_sigtimedwait, const sigset_t *, these, siginfo_t *, uinfo,
const struct timespec *, uts, size_t, sigsetsize)
safe_syscall4(int, accept4, int, fd, struct sockaddr *, addr, socklen_t *, len,
int, flags)
+#if defined(TARGET_NR_nanosleep)
safe_syscall2(int, nanosleep, const struct timespec *, req,
struct timespec *, rem)
+#endif
#ifdef TARGET_NR_clock_nanosleep
safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags,
const struct timespec *, req, struct timespec *, rem)
@@ -1063,6 +1067,7 @@ static inline abi_long host_to_target_rusage(abi_ulong target_addr,
return 0;
}
+#ifdef TARGET_NR_setrlimit
static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
{
abi_ulong target_rlim_swap;
@@ -1078,7 +1083,9 @@ static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
return result;
}
+#endif
+#if defined(TARGET_NR_getrlimit) || defined (TARGET_NR_ugetrlimit)
static inline abi_ulong host_to_target_rlim(rlim_t rlim)
{
abi_ulong target_rlim_swap;
@@ -1092,6 +1099,7 @@ static inline abi_ulong host_to_target_rlim(rlim_t rlim)
return result;
}
+#endif
static inline int target_to_host_resource(int code)
{
@@ -8584,6 +8592,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
}
}
return ret;
+#if defined(TARGET_NR_gettimeofday)
case TARGET_NR_gettimeofday:
{
struct timeval tv;
@@ -8594,6 +8603,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
}
}
return ret;
+#endif
+#if defined(TARGET_NR_settimeofday)
case TARGET_NR_settimeofday:
{
struct timeval tv, *ptv = NULL;
@@ -8615,6 +8626,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
return get_errno(settimeofday(ptv, ptz));
}
+#endif
#if defined(TARGET_NR_select)
case TARGET_NR_select:
#if defined(TARGET_WANT_NI_OLD_SELECT)
@@ -9260,6 +9272,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5,
arg6, arg7, arg8, 0);
#endif
+#if defined(TARGET_NR_wait4)
case TARGET_NR_wait4:
{
int status;
@@ -9287,6 +9300,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
}
}
return ret;
+#endif
#ifdef TARGET_NR_swapoff
case TARGET_NR_swapoff:
if (!(p = lock_user_string(arg1)))
@@ -9431,6 +9445,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
return do_vm86(cpu_env, arg1, arg2);
#endif
#endif
+#if defined(TARGET_NR_adjtimex)
case TARGET_NR_adjtimex:
{
struct timex host_buf;
@@ -9446,6 +9461,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
}
}
return ret;
+#endif
#if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
case TARGET_NR_clock_adjtime:
{
@@ -9971,6 +9987,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
}
}
return ret;
+#if defined(TARGET_NR_nanosleep)
case TARGET_NR_nanosleep:
{
struct timespec req, rem;
@@ -9981,6 +9998,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
}
}
return ret;
+#endif
case TARGET_NR_prctl:
switch (arg1) {
case PR_GET_PDEATHSIG:
--
2.25.0
On 2/21/20 12:18 AM, Alistair Francis wrote:
> New y2038 safe 32-bit architectures (like RISC-V) don't support old
> syscalls with a 32-bit time_t. The kernel defines new *_time64 versions
> of these syscalls. Add some more #ifdefs to syscall.c in linux-user to
> allow us to compile without these old syscalls.
>
> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
> ---
> linux-user/strace.c | 2 ++
> linux-user/syscall.c | 18 ++++++++++++++++++
> 2 files changed, 20 insertions(+)
>
> diff --git a/linux-user/strace.c b/linux-user/strace.c
> index 3d4d684450..2eb8ae3d31 100644
> --- a/linux-user/strace.c
> +++ b/linux-user/strace.c
> @@ -770,6 +770,7 @@ print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
> #define TARGET_TIME_OOP 3 /* leap second in progress */
> #define TARGET_TIME_WAIT 4 /* leap second has occurred */
> #define TARGET_TIME_ERROR 5 /* clock not synchronized */
> +#ifdef TARGET_NR_adjtimex
> static void
> print_syscall_ret_adjtimex(const struct syscallname *name, abi_long ret)
> {
> @@ -808,6 +809,7 @@ print_syscall_ret_adjtimex(const struct syscallname *name, abi_long ret)
>
> gemu_log("\n");
> }
> +#endif
>
> UNUSED static struct flags access_flags[] = {
> FLAG_GENERIC(F_OK),
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index c930577686..44632a7f6a 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -738,8 +738,10 @@ safe_syscall3(ssize_t, read, int, fd, void *, buff, size_t, count)
> safe_syscall3(ssize_t, write, int, fd, const void *, buff, size_t, count)
> safe_syscall4(int, openat, int, dirfd, const char *, pathname, \
> int, flags, mode_t, mode)
> +#if defined(TARGET_NR_wait4)
> safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, int, options, \
> struct rusage *, rusage)
> +#endif
> safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
> int, options, struct rusage *, rusage)
> safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
> @@ -776,8 +778,10 @@ safe_syscall4(int, rt_sigtimedwait, const sigset_t *, these, siginfo_t *, uinfo,
> const struct timespec *, uts, size_t, sigsetsize)
> safe_syscall4(int, accept4, int, fd, struct sockaddr *, addr, socklen_t *, len,
> int, flags)
> +#if defined(TARGET_NR_nanosleep)
> safe_syscall2(int, nanosleep, const struct timespec *, req,
> struct timespec *, rem)
> +#endif
> #ifdef TARGET_NR_clock_nanosleep
> safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags,
> const struct timespec *, req, struct timespec *, rem)
> @@ -1063,6 +1067,7 @@ static inline abi_long host_to_target_rusage(abi_ulong target_addr,
> return 0;
> }
>
> +#ifdef TARGET_NR_setrlimit
> static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
> {
> abi_ulong target_rlim_swap;
> @@ -1078,7 +1083,9 @@ static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
>
> return result;
> }
> +#endif
>
> +#if defined(TARGET_NR_getrlimit) || defined (TARGET_NR_ugetrlimit)
> static inline abi_ulong host_to_target_rlim(rlim_t rlim)
> {
> abi_ulong target_rlim_swap;
> @@ -1092,6 +1099,7 @@ static inline abi_ulong host_to_target_rlim(rlim_t rlim)
>
> return result;
> }
> +#endif
>
> static inline int target_to_host_resource(int code)
> {
> @@ -8584,6 +8592,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> }
> }
> return ret;
> +#if defined(TARGET_NR_gettimeofday)
> case TARGET_NR_gettimeofday:
> {
> struct timeval tv;
> @@ -8594,6 +8603,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> }
> }
> return ret;
> +#endif
> +#if defined(TARGET_NR_settimeofday)
> case TARGET_NR_settimeofday:
> {
> struct timeval tv, *ptv = NULL;
> @@ -8615,6 +8626,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
>
> return get_errno(settimeofday(ptv, ptz));
> }
> +#endif
> #if defined(TARGET_NR_select)
> case TARGET_NR_select:
> #if defined(TARGET_WANT_NI_OLD_SELECT)
> @@ -9260,6 +9272,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5,
> arg6, arg7, arg8, 0);
> #endif
> +#if defined(TARGET_NR_wait4)
> case TARGET_NR_wait4:
> {
> int status;
> @@ -9287,6 +9300,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> }
> }
> return ret;
> +#endif
> #ifdef TARGET_NR_swapoff
> case TARGET_NR_swapoff:
> if (!(p = lock_user_string(arg1)))
> @@ -9431,6 +9445,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> return do_vm86(cpu_env, arg1, arg2);
> #endif
> #endif
> +#if defined(TARGET_NR_adjtimex)
> case TARGET_NR_adjtimex:
> {
> struct timex host_buf;
> @@ -9446,6 +9461,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> }
> }
> return ret;
> +#endif
> #if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
> case TARGET_NR_clock_adjtime:
> {
> @@ -9971,6 +9987,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> }
> }
> return ret;
> +#if defined(TARGET_NR_nanosleep)
> case TARGET_NR_nanosleep:
> {
> struct timespec req, rem;
> @@ -9981,6 +9998,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
> }
> }
> return ret;
> +#endif
> case TARGET_NR_prctl:
> switch (arg1) {
> case PR_GET_PDEATHSIG:
>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
© 2016 - 2026 Red Hat, Inc.