Implement the timer_create(2) family of syscalls.

This commit is contained in:
cube 2005-07-23 18:56:15 +00:00
parent 2844b7b432
commit 23a1110cbd
4 changed files with 159 additions and 10 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: netbsd32.h,v 1.35 2005/07/13 11:53:57 cube Exp $ */
/* $NetBSD: netbsd32.h,v 1.36 2005/07/23 18:56:15 cube Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@ -126,6 +126,7 @@ struct netbsd32_iovec {
/* from <sys/time.h> */
typedef int32_t netbsd32_timer_t;
typedef int32_t netbsd32_time_t;
typedef netbsd32_pointer_t netbsd32_timerp_t;
typedef netbsd32_pointer_t netbsd32_timespecp_t;
struct netbsd32_timespec {
@ -151,6 +152,12 @@ struct netbsd32_itimerval {
struct netbsd32_timeval it_value; /* current value */
};
typedef netbsd32_pointer_t netbsd32_itimerspecp_t;
struct netbsd32_itimerspec {
struct netbsd32_timespec it_interval;
struct netbsd32_timespec it_value;
};
/* from <sys/mount.h> */
typedef netbsd32_pointer_t netbsd32_fidp_t;
@ -386,6 +393,20 @@ struct netbsd32_sigvec {
int sv_flags; /* see signal options below */
};
union netbsd32_sigval {
int sival_int;
netbsd32_voidp sival_ptr;
};
typedef netbsd32_pointer_t netbsd32_sigeventp_t;
struct netbsd32_sigevent {
int sigev_notify;
int sigev_signo;
union netbsd32_sigval sigev_value;
netbsd32_voidp sigev_notify_function;
netbsd32_voidp sigev_notify_attributes;
};
/* from <sys/socket.h> */
typedef netbsd32_pointer_t netbsd32_sockaddrp_t;
typedef netbsd32_pointer_t netbsd32_osockaddrp_t;

View File

@ -1,4 +1,4 @@
/* $NetBSD: netbsd32_conv.h,v 1.5 2005/02/26 23:10:21 perry Exp $ */
/* $NetBSD: netbsd32_conv.h,v 1.6 2005/07/23 18:56:15 cube Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@ -79,6 +79,7 @@ static __inline void netbsd32_from_shmid_ds __P((struct shmid_ds *, struct netbs
static __inline void netbsd32_to_semid_ds __P((struct netbsd32_semid_ds *, struct semid_ds *));
static __inline void netbsd32_from_semid_ds __P((struct semid_ds *, struct netbsd32_semid_ds *));
static __inline void netbsd32_from_loadavg __P((struct netbsd32_loadavg *, struct loadavg *));
static __inline void netbsd32_to_sigevent(struct netbsd32_sigevent *, struct sigevent *);
/* converters for structures that we need */
static __inline void
@ -535,4 +536,18 @@ netbsd32_from_loadavg(av32, av)
av32->fscale = (netbsd32_long)av->fscale;
}
static __inline void
netbsd32_to_sigevent(struct netbsd32_sigevent *ev32, struct sigevent *ev)
{
ev->sigev_notify = ev32->sigev_notify;
ev->sigev_signo = ev32->sigev_signo;
/*
* XXX sival_ptr, sigev_notify_function and
* sigev_notify_attributes are currently unused
*/
ev->sigev_value.sival_int = ev32->sigev_value.sival_int;
ev->sigev_notify_function = (void *)(intptr_t)ev32->sigev_notify_function;
ev->sigev_notify_attributes = (void *)(intptr_t)ev32->sigev_notify_attributes;
}
#endif /* _COMPAT_NETBSD32_NETBSD32_CONV_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: netbsd32_time.c,v 1.10 2005/07/11 19:50:42 cube Exp $ */
/* $NetBSD: netbsd32_time.c,v 1.11 2005/07/23 18:56:15 cube Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: netbsd32_time.c,v 1.10 2005/07/11 19:50:42 cube Exp $");
__KERNEL_RCSID(0, "$NetBSD: netbsd32_time.c,v 1.11 2005/07/23 18:56:15 cube Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ntp.h"
@ -628,3 +628,113 @@ netbsd32_nanosleep(l, v, retval)
return error;
}
static int
netbsd32_timer_create_fetch(const void *src, void *dst, size_t size)
{
struct sigevent *evp = dst;
struct netbsd32_sigevent ev32;
int error;
error = copyin(src, &ev32, sizeof(ev32));
if (error)
return error;
netbsd32_to_sigevent(&ev32, evp);
return 0;
}
int
netbsd32_timer_create(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_timer_create_args /* {
syscallarg(netbsd32_clockid_t) clock_id;
syscallarg(netbsd32_sigeventp_t) evp;
syscallarg(netbsd32_timerp_t) timerid;
} */ *uap = v;
return timer_create1(NETBSD32PTR64(SCARG(uap, timerid)),
SCARG(uap, clock_id), NETBSD32PTR64(SCARG(uap, evp)),
netbsd32_timer_create_fetch, l->l_proc);
}
int
netbsd32_timer_delete(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_timer_delete_args /* {
syscallarg(netbsd32_timer_t) timerid;
} */ *uap = v;
struct sys_timer_delete_args ua;
NETBSD32TO64_UAP(timerid);
return sys_timer_delete(l, (void *)&ua, retval);
}
int
netbsd32_timer_settime(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_timer_settime_args /* {
syscallarg(netbsd32_timer_t) timerid;
syscallarg(int) flags;
syscallarg(const netbsd32_itimerspecp_t) value;
syscallarg(netbsd32_itimerspecp_t) ovalue;
} */ *uap = v;
int error;
struct itimerspec value, ovalue, *ovp = NULL;
struct netbsd32_itimerspec its32;
if ((error = copyin(NETBSD32PTR64(SCARG(uap, value)), &its32,
sizeof(its32))) != 0)
return (error);
netbsd32_to_timespec(&its32.it_interval, &value.it_interval);
netbsd32_to_timespec(&its32.it_value, &value.it_value);
if (SCARG(uap, ovalue))
ovp = &ovalue;
if ((error = dotimer_settime(SCARG(uap, timerid), &value, ovp,
SCARG(uap, flags), l->l_proc)) != 0)
return error;
if (ovp) {
netbsd32_from_timespec(&ovp->it_interval, &its32.it_interval);
netbsd32_from_timespec(&ovp->it_value, &its32.it_value);
return copyout(&its32, NETBSD32PTR64(SCARG(uap, ovalue)),
sizeof(its32));
}
return 0;
}
int
netbsd32_timer_gettime(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_timer_gettime_args /* {
syscallarg(netbsd32_timer_t) timerid;
syscallarg(netbsd32_itimerspecp_t) value;
} */ *uap = v;
int error;
struct itimerspec its;
struct netbsd32_itimerspec its32;
if ((error = dotimer_gettime(SCARG(uap, timerid), l->l_proc,
&its)) != 0)
return error;
netbsd32_from_timespec(&its.it_interval, &its32.it_interval);
netbsd32_from_timespec(&its.it_value, &its32.it_value);
return copyout(&its32, (caddr_t)NETBSD32PTR64(SCARG(uap, value)),
sizeof(its32));
}
int
netbsd32_timer_getoverrun(struct lwp *l, void *v, register_t *retval)
{
struct netbsd32_timer_getoverrun_args /* {
syscallarg(netbsd32_timer_t) timerid;
} */ *uap = v;
struct sys_timer_getoverrun_args ua;
NETBSD32TO64_UAP(timerid);
return sys_timer_getoverrun(l, (void *)&ua, retval);
}

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.35 2005/07/12 07:45:34 cube Exp $
$NetBSD: syscalls.master,v 1.36 2005/07/23 18:56:15 cube Exp $
; from: NetBSD: syscalls.master,v 1.81 1998/07/05 08:49:50 jonathan Exp
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
@ -392,11 +392,14 @@
232 STD { int netbsd32_clock_gettime(netbsd32_clockid_t clock_id, netbsd32_timespecp_t tp); }
233 STD { int netbsd32_clock_settime(netbsd32_clockid_t clock_id, const netbsd32_timespecp_t tp); }
234 STD { int netbsd32_clock_getres(netbsd32_clockid_t clock_id, netbsd32_timespecp_t tp); }
235 UNIMPL timer_create
236 UNIMPL timer_delete
237 UNIMPL timer_settime
238 UNIMPL timer_gettime
239 UNIMPL timer_getoverrun
235 STD { int netbsd32_timer_create(netbsd32_clockid_t clock_id, netbsd32_sigeventp_t evp, \
netbsd32_timerp_t timerid); }
236 STD { int netbsd32_timer_delete(netbsd32_timer_t timerid); }
237 STD { int netbsd32_timer_settime(netbsd32_timer_t timerid, int flags, \
const netbsd32_itimerspecp_t value, \
netbsd32_itimerspecp_t ovalue); }
238 STD { int netbsd32_timer_gettime(netbsd32_timer_t timerid, netbsd32_itimerspecp_t value); }
239 STD { int netbsd32_timer_getoverrun(netbsd32_timer_t timerid); }
;
; Syscalls 240-269 are reserved for other IEEE Std1003.1b syscalls
;