diff --git a/sys/amd64/linux/syscalls.master b/sys/amd64/linux/syscalls.master index d99aaa01911..51f9fe00eb7 100644 --- a/sys/amd64/linux/syscalls.master +++ b/sys/amd64/linux/syscalls.master @@ -839,7 +839,7 @@ int linux_rt_sigtimedwait( l_sigset_t *mask, l_siginfo_t *ptr, - struct l_timeval *timeout, + struct l_timespec *timeout, l_size_t sigsetsize ); } diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master index d3a124c6e8c..79ee1f30a00 100644 --- a/sys/amd64/linux32/syscalls.master +++ b/sys/amd64/linux32/syscalls.master @@ -949,7 +949,7 @@ int linux_rt_sigtimedwait( l_sigset_t *mask, l_siginfo_t *ptr, - struct l_timeval *timeout, + struct l_timespec *timeout, l_size_t sigsetsize ); } diff --git a/sys/arm/linux/syscalls.master b/sys/arm/linux/syscalls.master index 02a50445976..d67f9c3b206 100644 --- a/sys/arm/linux/syscalls.master +++ b/sys/arm/linux/syscalls.master @@ -804,7 +804,7 @@ int linux_rt_sigtimedwait( l_sigset_t *mask, l_siginfo_t *ptr, - struct l_timeval *timeout, + struct l_timespec *timeout, l_size_t sigsetsize ); } diff --git a/sys/arm64/linux/syscalls.master b/sys/arm64/linux/syscalls.master index c8e7a2da812..202425581e8 100644 --- a/sys/arm64/linux/syscalls.master +++ b/sys/arm64/linux/syscalls.master @@ -829,7 +829,7 @@ int linux_rt_sigtimedwait( l_sigset_t *mask, l_siginfo_t *ptr, - struct l_timeval *timeout, + struct l_timespec *timeout, l_size_t sigsetsize ); } diff --git a/sys/compat/linux/linux_signal.c b/sys/compat/linux/linux_signal.c index 51f08d61bef..a479c9cc769 100644 --- a/sys/compat/linux/linux_signal.c +++ b/sys/compat/linux/linux_signal.c @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include #endif #include +#include #include #include #include @@ -392,9 +393,8 @@ linux_rt_sigtimedwait(struct thread *td, struct linux_rt_sigtimedwait_args *args) { int error, sig; - l_timeval ltv; - struct timeval tv; struct timespec ts, *tsa; + struct l_timespec lts; l_sigset_t lset; sigset_t bset; l_siginfo_t linfo; @@ -409,27 +409,15 @@ linux_rt_sigtimedwait(struct thread *td, tsa = NULL; if (args->timeout) { - if ((error = copyin(args->timeout, <v, sizeof(ltv)))) + if ((error = copyin(args->timeout, <s, sizeof(lts)))) + return (error); + error = linux_to_native_timespec(&ts, <s); + if (error != 0) return (error); - tv.tv_sec = (long)ltv.tv_sec; - tv.tv_usec = (suseconds_t)ltv.tv_usec; - if (itimerfix(&tv)) { - /* - * The timeout was invalid. Convert it to something - * valid that will act as it does under Linux. - */ - tv.tv_sec += tv.tv_usec / 1000000; - tv.tv_usec %= 1000000; - if (tv.tv_usec < 0) { - tv.tv_sec -= 1; - tv.tv_usec += 1000000; - } - if (tv.tv_sec < 0) - timevalclear(&tv); - } - TIMEVAL_TO_TIMESPEC(&tv, &ts); tsa = &ts; - } + } else + tsa = NULL; + error = kern_sigtimedwait(td, bset, &info, tsa); if (error) return (error); diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master index 7e1ab24e9f7..aa6eb7c1c46 100644 --- a/sys/i386/linux/syscalls.master +++ b/sys/i386/linux/syscalls.master @@ -974,7 +974,7 @@ int linux_rt_sigtimedwait( l_sigset_t *mask, l_siginfo_t *ptr, - struct l_timeval *timeout, + struct l_timespec *timeout, l_size_t sigsetsize ); }