Fix nanosleep(2) on 64-bit archs. Do not call native nanosleep

syscall, but rather a modified version the will take care of `struct
timespec' conversions.
This commit is contained in:
njoly 2008-11-12 18:07:40 +00:00
parent 7181375540
commit cf19223289
10 changed files with 87 additions and 28 deletions

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.62 2008/04/04 12:38:52 njoly Exp $
$NetBSD: syscalls.master,v 1.63 2008/11/12 18:07:40 njoly Exp $
;
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -537,8 +537,9 @@
337 UNIMPL sched_rr_get_interval
338 UNIMPL afs_syscall
339 STD { int linux_sys_uname(struct linux_utsname *up); }
340 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
340 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
341 STD { void *linux_sys_mremap(void *old_address, \
size_t old_size, size_t new_size, u_long flags); }
342 UNIMPL nfsservctl

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.24 2008/10/26 20:25:49 christos Exp $
$NetBSD: syscalls.master,v 1.25 2008/11/12 18:07:40 njoly Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -125,8 +125,9 @@
32 NOARGS { int sys_dup(u_int fd); }
33 NOARGS { int sys_dup2(u_int from, u_int to); }
34 STD { int linux_sys_pause(void); }
35 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
35 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
36 NOARGS { int sys_getitimer(u_int which, \
struct itimerval *itv); }
37 STD { int linux_sys_alarm(unsigned int secs); }

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.35 2008/04/23 14:07:49 ad Exp $
$NetBSD: syscalls.master,v 1.36 2008/11/12 18:07:40 njoly Exp $
; Derived from sys/compat/linux/arch/*/syscalls.master
; and from Linux 2.4.12 arch/arm/kernel/calls.S
@ -273,8 +273,9 @@
159 STD { int linux_sys_sched_get_priority_max(int policy); }
160 STD { int linux_sys_sched_get_priority_min(int policy); }
161 UNIMPL sched_rr_get_interval
162 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
162 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
163 STD { void *linux_sys_mremap(void *old_address, \
size_t old_size, size_t new_size, u_long flags); }
164 STD { int linux_sys_setresuid16(linux_uid16_t ruid, \

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.93 2008/10/26 16:38:22 christos Exp $
$NetBSD: syscalls.master,v 1.94 2008/11/12 18:07:40 njoly Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -284,8 +284,9 @@
159 STD { int linux_sys_sched_get_priority_max(int policy); }
160 STD { int linux_sys_sched_get_priority_min(int policy); }
161 UNIMPL sys_sched_rr_get_interval
162 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
162 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
163 STD { void *linux_sys_mremap(void *old_address, \
size_t old_size, size_t new_size, u_long flags); }
164 STD { int linux_sys_setresuid16(linux_uid16_t ruid, \

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.62 2008/06/18 12:21:20 tsutsui Exp $
$NetBSD: syscalls.master,v 1.63 2008/11/12 18:07:40 njoly Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -291,8 +291,9 @@
159 STD { int linux_sys_sched_get_priority_max(int policy); }
160 STD { int linux_sys_sched_get_priority_min(int policy); }
161 UNIMPL sched_rr_get_interval
162 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
162 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
163 STD { void *linux_sys_mremap(void *old_address, \
size_t old_size, size_t new_size, u_long flags); }
164 STD { int linux_sys_setresuid16(linux_uid16_t ruid, \

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.29 2008/04/23 14:07:50 ad Exp $
$NetBSD: syscalls.master,v 1.30 2008/11/12 18:07:40 njoly Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -278,8 +278,9 @@
163 STD { int linux_sys_sched_get_priority_max(int policy); }
164 STD { int linux_sys_sched_get_priority_min(int policy); }
165 UNIMPL sched_rr_get_interval
166 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
166 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
167 STD { void *linux_sys_mremap(void *old_address, \
size_t old_size, size_t new_size, u_long flags); }
168 NOARGS { int linux_sys_accept(int s, \

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.37 2008/04/23 14:07:50 ad Exp $
$NetBSD: syscalls.master,v 1.38 2008/11/12 18:07:40 njoly Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -301,8 +301,9 @@
159 STD { int linux_sys_sched_get_priority_max(int policy); }
160 STD { int linux_sys_sched_get_priority_min(int policy); }
161 UNIMPL sched_rr_get_interval
162 NOARGS { int sys_nanosleep(const struct timespec *rqtp, \
struct timespec *rmtp); }
162 STD { int linux_sys_nanosleep( \
const struct linux_timespec *rqtp, \
struct linux_timespec *rmtp); }
163 STD { void *linux_sys_mremap(void *old_address, \
size_t old_size, size_t new_size, u_long flags); }
164 STD { int linux_sys_setresuid(uid_t ruid, uid_t euid, \

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux_time.c,v 1.25 2008/06/18 12:24:18 tsutsui Exp $ */
/* $NetBSD: linux_time.c,v 1.26 2008/11/12 18:07:41 njoly Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.25 2008/06/18 12:24:18 tsutsui Exp $");
__KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.26 2008/11/12 18:07:41 njoly Exp $");
#include <sys/param.h>
#include <sys/ucred.h>
@ -143,6 +143,32 @@ linux_to_native_timespec(struct timespec *ntp, struct linux_timespec *ltp)
ntp->tv_nsec = ltp->tv_nsec;
}
int
linux_sys_nanosleep(struct lwp *l, const struct linux_sys_nanosleep_args *uap,
register_t *retval)
{
/* {
syscallarg(struct linux_timespec *) rqtp;
syscallarg(struct linux_timespec *) rmtp;
} */
struct timespec rqts, rmts;
struct linux_timespec lrqts, lrmts;
int error, error1;
error = copyin(SCARG(uap, rqtp), &lrqts, sizeof(lrqts));
if (error != 0)
return error;
linux_to_native_timespec(&rqts, &lrqts);
error = nanosleep1(l, &rqts, SCARG(uap, rmtp) ? &rmts : NULL);
if (SCARG(uap, rmtp) == NULL || (error != 0 && error != EINTR))
return error;
native_to_linux_timespec(&lrmts, &rmts);
error1 = copyout(&lrmts, SCARG(uap, rmtp), sizeof(lrmts));
return error1 ? error1 : error;
}
int
linux_to_native_clockid(clockid_t *n, clockid_t l)
{

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.38 2008/10/06 14:53:01 njoly Exp $
$NetBSD: syscalls.master,v 1.39 2008/11/12 18:07:41 njoly Exp $
; NetBSD i386 COMPAT_LINUX32 system call name/number "master" file.
; (See syscalls.conf to see what it is processed into.)
@ -279,8 +279,8 @@
159 UNIMPL sched_get_priority_max
160 UNIMPL sched_get_priority_min
161 UNIMPL sched_rr_get_interval
162 NOARGS { int netbsd32_nanosleep(netbsd32_timespecp_t rqtp \
netbsd32_timespecp_t rmtp); }
162 STD { int linux32_sys_nanosleep(linux32_timespecp_t rqtp, \
linux32_timespecp_t rmtp); }
163 STD { int linux32_sys_mremap(netbsd32_voidp old_address, \
netbsd32_size_t old_size, netbsd32_size_t new_size, \
netbsd32_u_long flags); }

View File

@ -1,4 +1,4 @@
/* $NetBSD: linux32_time.c,v 1.21 2008/09/08 15:31:19 christos Exp $ */
/* $NetBSD: linux32_time.c,v 1.22 2008/11/12 18:07:41 njoly Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@ -33,7 +33,7 @@
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: linux32_time.c,v 1.21 2008/09/08 15:31:19 christos Exp $");
__KERNEL_RCSID(0, "$NetBSD: linux32_time.c,v 1.22 2008/11/12 18:07:41 njoly Exp $");
#include <sys/types.h>
#include <sys/param.h>
@ -254,6 +254,32 @@ linux32_to_native_timespec(struct timespec *ntp, struct linux32_timespec *ltp)
ntp->tv_nsec = ltp->tv_nsec;
}
int
linux32_sys_nanosleep(struct lwp *l,
const struct linux32_sys_nanosleep_args *uap, register_t *retval)
{
/* {
syscallarg(linux32_timespecp_t) rqtp;
syscallarg(linux32_timespecp_t) rmtp;
} */
struct timespec rqts, rmts;
struct linux32_timespec lrqts, lrmts;
int error, error1;
error = copyin(SCARG_P32(uap, rqtp), &lrqts, sizeof(lrqts));
if (error != 0)
return error;
linux32_to_native_timespec(&rqts, &lrqts);
error = nanosleep1(l, &rqts, SCARG_P32(uap, rmtp) ? &rmts : NULL);
if (SCARG_P32(uap, rmtp) == NULL || (error != 0 && error != EINTR))
return error;
native_to_linux32_timespec(&lrmts, &rmts);
error1 = copyout(&lrmts, SCARG_P32(uap, rmtp), sizeof(lrmts));
return error1 ? error1 : error;
}
int
linux32_sys_clock_settime(struct lwp *l,
const struct linux32_sys_clock_settime_args *uap, register_t *retval)