Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/thorpej-futex]: src/sys/compat/linux32/common Add POSIX timer and timerf...
details: https://anonhg.NetBSD.org/src/rev/21557da4c90e
branches: thorpej-futex
changeset: 961134:21557da4c90e
user: thorpej <thorpej%NetBSD.org@localhost>
date: Thu Dec 17 03:05:32 2020 +0000
description:
Add POSIX timer and timerfd support to COMPAT_LINUX32.
diffstat:
sys/compat/linux32/arch/amd64/syscalls.master | 26 ++-
sys/compat/linux32/common/linux32_sched.h | 56 +-----
sys/compat/linux32/common/linux32_time.c | 187 +++++++++++++++++++++++++-
3 files changed, 211 insertions(+), 58 deletions(-)
diffs (truncated from 367 to 300 lines):
diff -r 5ea2747b9b4c -r 21557da4c90e sys/compat/linux32/arch/amd64/syscalls.master
--- a/sys/compat/linux32/arch/amd64/syscalls.master Thu Dec 17 03:02:06 2020 +0000
+++ b/sys/compat/linux32/arch/amd64/syscalls.master Thu Dec 17 03:05:32 2020 +0000
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.71.2.1 2020/12/16 03:07:43 thorpej Exp $
+ $NetBSD: syscalls.master,v 1.71.2.2 2020/12/17 03:05:32 thorpej Exp $
; NetBSD i386 COMPAT_LINUX32 system call name/number "master" file.
; (See syscalls.conf to see what it is processed into.)
@@ -454,11 +454,15 @@
256 UNIMPL epoll_wait
257 UNIMPL remap_file_pages
258 STD { int|linux32_sys||set_tid_address(linux32_intp_t tid); }
-259 UNIMPL timer_create
-260 UNIMPL timer_settime
-261 UNIMPL timer_gettime
-262 UNIMPL timer_getoverrun
-263 UNIMPL timer_delete
+259 STD { int|linux32_sys||timer_create(clockid_t clockid, \
+ struct linux32_sigevent *evp, timer_t *timerid); }
+260 STD { int|linux32_sys||timer_settime(timer_t timerid, \
+ int flags, const struct linux32_itimerspec *tim, \
+ struct linux32_itimerspec *otim); }
+261 STD { int|linux32_sys||timer_gettime(timer_t timerid, \
+ struct linux32_itimerspec *tim); }
+262 NOARGS { int|sys||timer_getoverrun(timer_t timerid); }
+263 NOARGS { int|sys||timer_delete(timer_t timerid); }
264 STD { int|linux32_sys||clock_settime(clockid_t which, \
linux32_timespecp_t tp); }
265 STD { int|linux32_sys||clock_gettime(clockid_t which, \
@@ -546,12 +550,16 @@
320 STD { int|linux32_sys||utimensat(int fd, netbsd32_charp path, \
linux32_timespecp_t times, int flag); }
321 UNIMPL signalfd
-322 UNIMPL timerfd_create
+322 NOARGS { int|linux_sys||timerfd_create(clockid_t clock_id, \
+ int flags); }
323 STD { int|linux32_sys||eventfd(unsigned int initval); }
324 STD { int|linux32_sys||fallocate(int fd, int mode, \
off_t offset, off_t len); }
-325 UNIMPL timerfd_settime
-326 UNIMPL timerfd_gettime
+325 STD { int|linux32_sys||timerfd_settime(int fd, int flags, \
+ const struct linux32_itimerspec *new_value, \
+ struct linux32_itimerspec *old_value); }
+326 STD { int|linux32_sys||timerfd_gettime(int fd, \
+ struct linux32_itimerspec *curr_value); }
327 UNIMPL signalfd4
328 STD { int|linux32_sys||eventfd2(unsigned int initval, \
int flags); }
diff -r 5ea2747b9b4c -r 21557da4c90e sys/compat/linux32/common/linux32_sched.h
--- a/sys/compat/linux32/common/linux32_sched.h Thu Dec 17 03:02:06 2020 +0000
+++ b/sys/compat/linux32/common/linux32_sched.h Thu Dec 17 03:05:32 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_sched.h,v 1.1 2011/11/18 04:08:56 christos Exp $ */
+/* $NetBSD: linux32_sched.h,v 1.1.66.1 2020/12/17 03:05:32 thorpej Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -33,56 +33,28 @@
#ifndef _LINUX32_SCHED_H
#define _LINUX32_SCHED_H
-/*
- * Flags passed to the Linux __clone(2) system call.
- */
-#define LINUX32_CLONE_CSIGNAL 0x000000ff /* signal to be sent at exit */
-#define LINUX32_CLONE_VM 0x00000100 /* share address space */
-#define LINUX32_CLONE_FS 0x00000200 /* share "file system" info */
-#define LINUX32_CLONE_FILES 0x00000400 /* share file descriptors */
-#define LINUX32_CLONE_SIGHAND 0x00000800 /* share signal actions */
-#define LINUX32_CLONE_PID 0x00001000 /* share process ID */
-#define LINUX32_CLONE_PTRACE 0x00002000 /* ptrace(2) continues on
- child */
-#define LINUX32_CLONE_VFORK 0x00004000 /* parent blocks until child
- exits */
-#define LINUX32_CLONE_PARENT 0x00008000 /* want same parent as cloner */
-#define LINUX32_CLONE_THREAD 0x00010000 /* same thread group */
-#define LINUX32_CLONE_NEWNS 0x00020000 /* new namespace group */
-#define LINUX32_CLONE_SYSVSEM 0x00040000 /* share SysV SEM_UNDO */
-#define LINUX32_CLONE_SETTLS 0x00080000 /* create new TLS for child */
-#define LINUX32_CLONE_PARENT_SETTID \
- 0x00100000 /* set TID in the parent */
-#define LINUX32_CLONE_CHILD_CLEARTID \
- 0x00200000 /* clear TID in the child */
-#define LINUX32_CLONE_DETACHED 0x00400000 /* unused */
-#define LINUX32_CLONE_UNTRACED 0x00800000 /* set if parent cannot force CLONE_PTRACE */
-#define LINUX32_CLONE_CHILD_SETTID \
- 0x01000000 /* set TID in the child */
-#define LINUX32_CLONE_STOPPED 0x02000000 /* start in stopped state */
-
struct linux32_sched_param {
int sched_priority;
};
-#define LINUX32_SCHED_OTHER 0
-#define LINUX32_SCHED_FIFO 1
-#define LINUX32_SCHED_RR 2
-
struct linux32_timespec {
linux32_time_t tv_sec; /* seconds */
int tv_nsec; /* nanoseconds */
};
-#define LINUX32_CLOCK_REALTIME 0
-#define LINUX32_CLOCK_MONOTONIC 1
-#define LINUX32_CLOCK_PROCESS_CPUTIME_ID 2
-#define LINUX32_CLOCK_THREAD_CPUTIME_ID 3
-#define LINUX32_CLOCK_REALTIME_HR 4
-#define LINUX32_CLOCK_MONOTONIC_HR 5
+struct linux32_itimerspec {
+ struct linux32_timespec it_interval;
+ struct linux32_timespec it_value;
+};
-int linux32_to_native_clockid(clockid_t *, clockid_t);
-void native_to_linux32_timespec(struct linux32_timespec *, struct timespec *);
-void linux32_to_native_timespec(struct timespec *, struct linux32_timespec *);
+void native_to_linux32_timespec(struct linux32_timespec *,
+ const struct timespec *);
+void linux32_to_native_timespec(struct timespec *,
+ const struct linux32_timespec *);
+
+void native_to_linux32_itimerspec(struct linux32_itimerspec *,
+ const struct itimerspec *);
+void linux32_to_native_itimerspec(struct itimerspec *,
+ const struct linux32_itimerspec *);
#endif /* _LINUX32_SCHED_H */
diff -r 5ea2747b9b4c -r 21557da4c90e sys/compat/linux32/common/linux32_time.c
--- a/sys/compat/linux32/common/linux32_time.c Thu Dec 17 03:02:06 2020 +0000
+++ b/sys/compat/linux32/common/linux32_time.c Thu Dec 17 03:05:32 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_time.c,v 1.37 2012/10/02 01:44:28 christos Exp $ */
+/* $NetBSD: linux32_time.c,v 1.37.50.1 2020/12/17 03:05:32 thorpej 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.37 2012/10/02 01:44:28 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_time.c,v 1.37.50.1 2020/12/17 03:05:32 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -45,6 +45,7 @@
#include <sys/fcntl.h>
#include <sys/namei.h>
#include <sys/select.h>
+#include <sys/timerfd.h>
#include <sys/proc.h>
#include <sys/resourcevar.h>
#include <sys/ucred.h>
@@ -77,10 +78,9 @@
#include <compat/linux32/common/linux32_sched.h>
#include <compat/linux32/linux32_syscallargs.h>
-extern struct timezone linux_sys_tz;
+CTASSERT(LINUX_TIMER_ABSTIME == TIMER_ABSTIME);
-void native_to_linux32_timespec(struct linux32_timespec *, struct timespec *);
-void linux32_to_native_timespec(struct timespec *, struct linux32_timespec *);
+extern struct timezone linux_sys_tz;
int
linux32_sys_gettimeofday(struct lwp *l, const struct linux32_sys_gettimeofday_args *uap, register_t *retval)
@@ -235,19 +235,37 @@
}
void
-native_to_linux32_timespec(struct linux32_timespec *ltp, struct timespec *ntp)
+native_to_linux32_timespec(struct linux32_timespec *ltp,
+ const struct timespec *ntp)
{
ltp->tv_sec = ntp->tv_sec;
ltp->tv_nsec = ntp->tv_nsec;
}
void
-linux32_to_native_timespec(struct timespec *ntp, struct linux32_timespec *ltp)
+linux32_to_native_timespec(struct timespec *ntp,
+ const struct linux32_timespec *ltp)
{
ntp->tv_sec = ltp->tv_sec;
ntp->tv_nsec = ltp->tv_nsec;
}
+void
+native_to_linux32_itimerspec(struct linux32_itimerspec *litp,
+ const struct itimerspec *nitp)
+{
+ native_to_linux32_timespec(&litp->it_interval, &nitp->it_interval);
+ native_to_linux32_timespec(&litp->it_value, &nitp->it_value);
+}
+
+void
+linux32_to_native_itimerspec(struct itimerspec *nitp,
+ const struct linux32_itimerspec *litp)
+{
+ linux32_to_native_timespec(&nitp->it_interval, &litp->it_interval);
+ linux32_to_native_timespec(&nitp->it_value, &litp->it_value);
+}
+
int
linux32_sys_nanosleep(struct lwp *l,
const struct linux32_sys_nanosleep_args *uap, register_t *retval)
@@ -384,3 +402,158 @@
error1 = copyout(&lrmts, SCARG_P32(uap, rmtp), sizeof lrmts);
return error1 ? error1 : error;
}
+
+int
+linux32_sys_timer_create(struct lwp *l,
+ const struct linux32_sys_timer_create_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(clockid_t) clockid;
+ syscallarg(struct linux32_sigevent *) evp;
+ syscallarg(timer_t *) timerid;
+ } */
+ clockid_t id;
+ int error;
+
+ error = linux_to_native_timer_create_clockid(&id, SCARG(uap, clockid));
+ if (error == 0) {
+ error = timer_create1(SCARG(uap, timerid), id,
+ (void *)SCARG(uap, evp), linux32_sigevent_copyin, l);
+ }
+
+ return error;
+}
+
+int
+linux32_sys_timer_settime(struct lwp *l,
+ const struct linux32_sys_timer_settime_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(timer_t) timerid;
+ syscallarg(int) flags;
+ syscallarg(const struct linux32_itimerspec *) tim;
+ syscallarg(struct linux32_itimerspec *) otim;
+ } */
+ struct itimerspec value, ovalue, *ovp = NULL;
+ struct linux32_itimerspec tim, otim;
+ int error;
+
+ error = copyin(SCARG(uap, tim), &tim, sizeof(tim));
+ if (error) {
+ return error;
+ }
+ linux32_to_native_itimerspec(&value, &tim);
+
+ if (SCARG(uap, otim)) {
+ ovp = &ovalue;
+ }
+
+ if (SCARG(uap, flags) & ~TIMER_ABSTIME) {
+ return EINVAL;
+ }
+
+ error = dotimer_settime(SCARG(uap, timerid), &value, ovp,
+ SCARG(uap, flags), l->l_proc);
+ if (error) {
+ return error;
+ }
+
+ if (ovp) {
+ native_to_linux32_itimerspec(&otim, ovp);
+ error = copyout(&otim, SCARG(uap, otim), sizeof(otim));
+ }
+
+ return error;
+}
+
+int
+linux32_sys_timer_gettime(struct lwp *l,
+ const struct linux32_sys_timer_gettime_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(timer_t) timerid;
+ syscallarg(struct linux32_itimerspec *) tim;
+ } */
+ struct itimerspec its;
+ struct linux32_itimerspec lits;
+ int error;
+
+ error = dotimer_gettime(SCARG(uap, timerid), l->l_proc, &its);
+ if (error == 0) {
+ native_to_linux32_itimerspec(&lits, &its);
+ error = copyout(&lits, SCARG(uap, tim), sizeof(lits));
+ }
+
+ return error;
+}
+
+/*
+ * timer_gettoverrun(2) and timer_delete(2) are handled directly
+ * by the native calls.
Home |
Main Index |
Thread Index |
Old Index