Module Name: src
Committed By: christos
Date: Fri Nov 18 04:08:56 UTC 2011
Modified Files:
src/sys/compat/linux32/arch/amd64: linux32_signal.h linux32_syscall.h
linux32_syscallargs.h linux32_syscalls.c linux32_sysent.c
syscalls.master
src/sys/compat/linux32/common: linux32_misc.c linux32_signal.c
linux32_signal.h linux32_time.c linux32_types.h
Added Files:
src/sys/compat/linux32/arch/amd64: linux32_siginfo.h
src/sys/compat/linux32/common: linux32_sched.h linux32_siginfo.h
Log Message:
add sigtimedwait support
To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/sys/compat/linux32/arch/amd64/linux32_siginfo.h
cvs rdiff -u -r1.2 -r1.3 src/sys/compat/linux32/arch/amd64/linux32_signal.h
cvs rdiff -u -r1.63 -r1.64 \
src/sys/compat/linux32/arch/amd64/linux32_syscall.h \
src/sys/compat/linux32/arch/amd64/linux32_syscallargs.h \
src/sys/compat/linux32/arch/amd64/linux32_syscalls.c \
src/sys/compat/linux32/arch/amd64/linux32_sysent.c
cvs rdiff -u -r1.59 -r1.60 src/sys/compat/linux32/arch/amd64/syscalls.master
cvs rdiff -u -r1.21 -r1.22 src/sys/compat/linux32/common/linux32_misc.c
cvs rdiff -u -r0 -r1.1 src/sys/compat/linux32/common/linux32_sched.h \
src/sys/compat/linux32/common/linux32_siginfo.h
cvs rdiff -u -r1.13 -r1.14 src/sys/compat/linux32/common/linux32_signal.c
cvs rdiff -u -r1.2 -r1.3 src/sys/compat/linux32/common/linux32_signal.h
cvs rdiff -u -r1.35 -r1.36 src/sys/compat/linux32/common/linux32_time.c
cvs rdiff -u -r1.14 -r1.15 src/sys/compat/linux32/common/linux32_types.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/compat/linux32/arch/amd64/linux32_signal.h
diff -u src/sys/compat/linux32/arch/amd64/linux32_signal.h:1.2 src/sys/compat/linux32/arch/amd64/linux32_signal.h:1.3
--- src/sys/compat/linux32/arch/amd64/linux32_signal.h:1.2 Mon Jun 8 10:42:10 2009
+++ src/sys/compat/linux32/arch/amd64/linux32_signal.h Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_signal.h,v 1.2 2009/06/08 14:42:10 njoly Exp $ */
+/* $NetBSD: linux32_signal.h,v 1.3 2011/11/18 04:08:56 christos Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -91,137 +91,6 @@ struct linux32_sigaction {
linux32_sigset_t linux_sa_mask;
};
-typedef union linux32_sigval {
- int sival_int;
- netbsd32_voidp sival_ptr;
-} linux32_sigval_t;
-
-#define SI_MAX_SIZE 128
-#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3)
-
-typedef struct linux32_siginfo {
- int lsi_signo;
- int lsi_errno;
- int lsi_code;
- union {
- int _pad[SI_PAD_SIZE];
-
- /* kill() */
- struct {
- linux32_pid_t _pid;
- linux32_uid_t _uid;
- } _kill;
-
- /* POSIX.1b signals */
- struct {
- linux32_pid_t _pid;
- linux32_uid_t _uid;
- linux32_sigval_t _sigval;
- } _rt;
-
- /* POSIX.1b timers */
- struct {
- unsigned int _timer1;
- unsigned int _timer2;
- } _timer;
-
- /* SIGCHLD */
- struct {
- linux32_pid_t _pid;
- linux32_uid_t _uid;
- int _status;
- linux32_clock_t _utime;
- linux32_clock_t _stime;
- } _sigchld;
-
- /* SIGPOLL */
- struct {
- int _band;
- int _fd;
- } _sigpoll;
-
- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
- struct {
- netbsd32_voidp _addr;
- } _sigfault;
- } _sidata;
-} linux32_siginfo_t;
-
-#define lsi_pid _sidata._kill._pid
-#define lsi_uid _sidata._kill._uid
-#define lsi_status _sidata._sigchld._status
-#define lsi_utime _sidata._sigchld._utime
-#define lsi_stime _sidata._sigchld._stime
-#define lsi_value _sidata._rt._sigval
-#define lsi_int _sidata._rt._sigval.sival_int
-#define lsi_ptr _sidata._rt._sigval.sival_ptr
-#define lsi_addr _sidata._sigfault._addr
-#define lsi_band _sidata._sigpoll._band
-#define lsi_fd _sidata._sigpoll._fd
-
-/*
- * si_code values for non-signals
- */
-#define LINUX32_SI_USER 0
-#define LINUX32_SI_KERNEL 0x80
-#define LINUX32_SI_QUEUE -1
-#define LINUX32_SI_TIMER -2
-#define LINUX32_SI_MESGQ -3
-#define LINUX32_SI_ASYNCIO -4
-#define LINUX32_SI_SIGIO -5
-#define LINUX32_SI_SIGNL -6
-
-/* si_code values for SIGILL */
-#define LINUX32_ILL_ILLOPC 1
-#define LINUX32_ILL_ILLOPN 2
-#define LINUX32_ILL_ILLADR 3
-#define LINUX32_ILL_ILLTRP 4
-#define LINUX32_ILL_PRVOPC 5
-#define LINUX32_ILL_PRVREG 6
-#define LINUX32_ILL_COPROC 7
-#define LINUX32_ILL_BADSTK 8
-
-/* si_code values for SIGFPE */
-#define LINUX32_FPE_INTDIV 1
-#define LINUX32_FPE_INTOVF 2
-#define LINUX32_FPE_FLTDIV 3
-#define LINUX32_FPE_FLTOVF 4
-#define LINUX32_FPE_FLTUND 5
-#define LINUX32_FPE_FLTRES 6
-#define LINUX32_FPE_FLTINV 7
-#define LINUX32_FPE_FLTSUB 8
-
-/* si_code values for SIGSEGV */
-#define LINUX32_SEGV_MAPERR 1
-#define LINUX32_SEGV_ACCERR 2
-
-/* si_code values for SIGBUS */
-#define LINUX32_BUS_ADRALN 1
-#define LINUX32_BUS_ADRERR 2
-#define LINUX32_BUS_OBJERR 3
-
-/* si_code values for SIGTRAP */
-#define LINUX32_TRAP_BRKPT 1
-#define LINUX32_TRAP_TRACE 2
-
-/* si_code values for SIGCHLD */
-#define LINUX32_CLD_EXITED 1
-#define LINUX32_CLD_KILLED 2
-#define LINUX32_CLD_DUMPED 3
-#define LINUX32_CLD_TRAPPED 4
-#define LINUX32_CLD_STOPPED 5
-#define LINUX32_CLD_CONTINUED 6
-
-/* si_code values for SIGPOLL */
-#define LINUX32_POLL_IN 1
-#define LINUX32_POLL_OUT 2
-#define LINUX32_POLL_MSG 3
-#define LINUX32_POLL_ERR 4
-#define LINUX32_POLL_PRI 5
-#define LINUX32_POLL_HUP 6
-
-#define LINUX32_SI_FROMUSER(sp) ((sp)->si_code <= 0)
-#define LINUX32_SI_FROMKERNEL(sp) ((sp)->si_code > 0)
struct linux32_sigaltstack {
netbsd32_voidp ss_sp;
Index: src/sys/compat/linux32/arch/amd64/linux32_syscall.h
diff -u src/sys/compat/linux32/arch/amd64/linux32_syscall.h:1.63 src/sys/compat/linux32/arch/amd64/linux32_syscall.h:1.64
--- src/sys/compat/linux32/arch/amd64/linux32_syscall.h:1.63 Mon May 30 17:37:40 2011
+++ src/sys/compat/linux32/arch/amd64/linux32_syscall.h Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_syscall.h,v 1.63 2011/05/30 21:37:40 alnsn Exp $ */
+/* $NetBSD: linux32_syscall.h,v 1.64 2011/11/18 04:08:56 christos Exp $ */
/*
* System call numbers.
@@ -445,6 +445,9 @@
/* syscall: "rt_sigpending" ret: "int" args: "linux32_sigsetp_t" "netbsd32_size_t" */
#define LINUX32_SYS_rt_sigpending 176
+/* syscall: "rt_sigtimedwait" ret: "int" args: "const linux32_sigset_t *" "linux32_siginfo_t *" "const struct linux_timespec32 *" */
+#define LINUX32_SYS_rt_sigtimedwait 177
+
/* syscall: "rt_queueinfo" ret: "int" args: "int" "int" "linux32_siginfop_t" */
#define LINUX32_SYS_rt_queueinfo 178
Index: src/sys/compat/linux32/arch/amd64/linux32_syscallargs.h
diff -u src/sys/compat/linux32/arch/amd64/linux32_syscallargs.h:1.63 src/sys/compat/linux32/arch/amd64/linux32_syscallargs.h:1.64
--- src/sys/compat/linux32/arch/amd64/linux32_syscallargs.h:1.63 Mon May 30 17:37:40 2011
+++ src/sys/compat/linux32/arch/amd64/linux32_syscallargs.h Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_syscallargs.h,v 1.63 2011/05/30 21:37:40 alnsn Exp $ */
+/* $NetBSD: linux32_syscallargs.h,v 1.64 2011/11/18 04:08:56 christos Exp $ */
/*
* System call argument lists.
@@ -604,6 +604,13 @@ struct linux32_sys_rt_sigpending_args {
};
check_syscall_args(linux32_sys_rt_sigpending)
+struct linux32_sys_rt_sigtimedwait_args {
+ syscallarg(const linux32_sigset_t *) set;
+ syscallarg(linux32_siginfo_t *) info;
+ syscallarg(const struct linux_timespec32 *) timeout;
+};
+check_syscall_args(linux32_sys_rt_sigtimedwait)
+
struct linux32_sys_rt_queueinfo_args {
syscallarg(int) pid;
syscallarg(int) sig;
@@ -1189,6 +1196,8 @@ int linux32_sys_rt_sigprocmask(struct lw
int linux32_sys_rt_sigpending(struct lwp *, const struct linux32_sys_rt_sigpending_args *, register_t *);
+int linux32_sys_rt_sigtimedwait(struct lwp *, const struct linux32_sys_rt_sigtimedwait_args *, register_t *);
+
int linux32_sys_rt_queueinfo(struct lwp *, const struct linux32_sys_rt_queueinfo_args *, register_t *);
int linux32_sys_rt_sigsuspend(struct lwp *, const struct linux32_sys_rt_sigsuspend_args *, register_t *);
Index: src/sys/compat/linux32/arch/amd64/linux32_syscalls.c
diff -u src/sys/compat/linux32/arch/amd64/linux32_syscalls.c:1.63 src/sys/compat/linux32/arch/amd64/linux32_syscalls.c:1.64
--- src/sys/compat/linux32/arch/amd64/linux32_syscalls.c:1.63 Mon May 30 17:37:40 2011
+++ src/sys/compat/linux32/arch/amd64/linux32_syscalls.c Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_syscalls.c,v 1.63 2011/05/30 21:37:40 alnsn Exp $ */
+/* $NetBSD: linux32_syscalls.c,v 1.64 2011/11/18 04:08:56 christos Exp $ */
/*
* System call names.
@@ -8,7 +8,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_syscalls.c,v 1.63 2011/05/30 21:37:40 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_syscalls.c,v 1.64 2011/11/18 04:08:56 christos Exp $");
#if defined(_KERNEL_OPT)
#include <sys/param.h>
@@ -212,7 +212,7 @@ const char *const linux32_syscallnames[]
/* 174 */ "rt_sigaction",
/* 175 */ "rt_sigprocmask",
/* 176 */ "rt_sigpending",
- /* 177 */ "#177 (unimplemented rt_sigtimedwait)",
+ /* 177 */ "rt_sigtimedwait",
/* 178 */ "rt_queueinfo",
/* 179 */ "rt_sigsuspend",
/* 180 */ "pread",
Index: src/sys/compat/linux32/arch/amd64/linux32_sysent.c
diff -u src/sys/compat/linux32/arch/amd64/linux32_sysent.c:1.63 src/sys/compat/linux32/arch/amd64/linux32_sysent.c:1.64
--- src/sys/compat/linux32/arch/amd64/linux32_sysent.c:1.63 Mon May 30 17:37:40 2011
+++ src/sys/compat/linux32/arch/amd64/linux32_sysent.c Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_sysent.c,v 1.63 2011/05/30 21:37:40 alnsn Exp $ */
+/* $NetBSD: linux32_sysent.c,v 1.64 2011/11/18 04:08:56 christos Exp $ */
/*
* System call switch table.
@@ -8,7 +8,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_sysent.c,v 1.63 2011/05/30 21:37:40 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_sysent.c,v 1.64 2011/11/18 04:08:56 christos Exp $");
#include <sys/param.h>
#include <sys/poll.h>
@@ -391,8 +391,8 @@ struct sysent linux32_sysent[] = {
(sy_call_t *)linux32_sys_rt_sigprocmask },/* 175 = rt_sigprocmask */
{ ns(struct linux32_sys_rt_sigpending_args), 0,
(sy_call_t *)linux32_sys_rt_sigpending },/* 176 = rt_sigpending */
- { 0, 0, 0,
- linux_sys_nosys }, /* 177 = unimplemented rt_sigtimedwait */
+ { ns(struct linux32_sys_rt_sigtimedwait_args), 0,
+ (sy_call_t *)linux32_sys_rt_sigtimedwait },/* 177 = rt_sigtimedwait */
{ ns(struct linux32_sys_rt_queueinfo_args), 0,
(sy_call_t *)linux32_sys_rt_queueinfo },/* 178 = rt_queueinfo */
{ ns(struct linux32_sys_rt_sigsuspend_args), 0,
Index: src/sys/compat/linux32/arch/amd64/syscalls.master
diff -u src/sys/compat/linux32/arch/amd64/syscalls.master:1.59 src/sys/compat/linux32/arch/amd64/syscalls.master:1.60
--- src/sys/compat/linux32/arch/amd64/syscalls.master:1.59 Mon May 30 13:50:32 2011
+++ src/sys/compat/linux32/arch/amd64/syscalls.master Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.59 2011/05/30 17:50:32 alnsn Exp $
+ $NetBSD: syscalls.master,v 1.60 2011/11/18 04:08:56 christos Exp $
; NetBSD i386 COMPAT_LINUX32 system call name/number "master" file.
; (See syscalls.conf to see what it is processed into.)
@@ -317,7 +317,10 @@
netbsd32_size_t sigsetsize); }
176 STD { int|linux32_sys||rt_sigpending(linux32_sigsetp_t set, \
netbsd32_size_t sigsetsize); }
-177 UNIMPL rt_sigtimedwait
+177 STD { int|linux32_sys||rt_sigtimedwait( \
+ const linux32_sigset_t *set, \
+ linux32_siginfo_t *info, \
+ const struct linux_timespec32 *timeout); }
178 STD { int|linux32_sys||rt_queueinfo(int pid, int sig, \
linux32_siginfop_t uinfo); }
179 STD { int|linux32_sys||rt_sigsuspend(linux32_sigsetp_t unewset, \
Index: src/sys/compat/linux32/common/linux32_misc.c
diff -u src/sys/compat/linux32/common/linux32_misc.c:1.21 src/sys/compat/linux32/common/linux32_misc.c:1.22
--- src/sys/compat/linux32/common/linux32_misc.c:1.21 Tue Nov 2 14:18:07 2010
+++ src/sys/compat/linux32/common/linux32_misc.c Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_misc.c,v 1.21 2010/11/02 18:18:07 chs Exp $ */
+/* $NetBSD: linux32_misc.c,v 1.22 2011/11/18 04:08:56 christos Exp $ */
/*-
* Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.21 2010/11/02 18:18:07 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.22 2011/11/18 04:08:56 christos Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -49,6 +49,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_misc
#include <compat/linux32/common/linux32_types.h>
#include <compat/linux32/common/linux32_signal.h>
+#include <compat/linux32/common/linux32_sched.h>
#include <compat/linux32/linux32_syscallargs.h>
#include <compat/linux/common/linux_ptrace.h>
Index: src/sys/compat/linux32/common/linux32_signal.c
diff -u src/sys/compat/linux32/common/linux32_signal.c:1.13 src/sys/compat/linux32/common/linux32_signal.c:1.14
--- src/sys/compat/linux32/common/linux32_signal.c:1.13 Mon Jun 8 09:34:23 2009
+++ src/sys/compat/linux32/common/linux32_signal.c Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_signal.c,v 1.13 2009/06/08 13:34:23 njoly Exp $ */
+/* $NetBSD: linux32_signal.c,v 1.14 2011/11/18 04:08:56 christos Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_signal.c,v 1.13 2009/06/08 13:34:23 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_signal.c,v 1.14 2011/11/18 04:08:56 christos Exp $");
#include <sys/param.h>
#include <sys/ucred.h>
@@ -40,12 +40,17 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_sign
#include <sys/lwp.h>
#include <sys/time.h>
#include <sys/proc.h>
+#include <sys/wait.h>
#include <compat/netbsd32/netbsd32.h>
+#include <compat/linux/common/linux_signal.h>
#include <compat/linux32/common/linux32_types.h>
#include <compat/linux32/common/linux32_signal.h>
+#include <compat/linux32/common/linux32_siginfo.h>
#include <compat/linux32/linux32_syscallargs.h>
+#include <compat/linux32/common/linux32_errno.h>
+#include <compat/linux32/common/linux32_sched.h>
#define linux32_sigemptyset(s) memset((s), 0, sizeof(*(s)))
#define linux32_sigismember(s, n) ((s)->sig[((n) - 1) / LINUX32__NSIG_BPW] \
@@ -92,6 +97,71 @@ native_to_linux32_sigset(linux32_sigset_
}
}
+void
+native_to_linux32_siginfo(linux32_siginfo_t *lsi, const struct _ksiginfo *ksi)
+{
+ memset(lsi, 0, sizeof(*lsi));
+
+ lsi->lsi_signo = native_to_linux32_signo[ksi->_signo];
+ lsi->lsi_errno = native_to_linux32_errno[ksi->_errno];
+ lsi->lsi_code = native_to_linux32_si_code(ksi->_code);
+
+ switch (ksi->_code) {
+ case SI_NOINFO:
+ break;
+
+ case SI_USER:
+ lsi->lsi_pid = ksi->_reason._rt._pid;
+ lsi->lsi_uid = ksi->_reason._rt._uid;
+ if (lsi->lsi_signo == LINUX_SIGALRM ||
+ lsi->lsi_signo >= LINUX_SIGRTMIN)
+ NETBSD32PTR32(lsi->lsi_value.sival_ptr,
+ ksi->_reason._rt._value.sival_ptr);
+ break;
+
+ case SI_TIMER:
+ case SI_QUEUE:
+ lsi->lsi_uid = ksi->_reason._rt._uid;
+ lsi->lsi_uid = ksi->_reason._rt._uid;
+ NETBSD32PTR32(lsi->lsi_value.sival_ptr,
+ ksi->_reason._rt._value.sival_ptr);
+ break;
+
+ case SI_ASYNCIO:
+ case SI_MESGQ:
+ NETBSD32PTR32(lsi->lsi_value.sival_ptr,
+ ksi->_reason._rt._value.sival_ptr);
+ break;
+
+ default:
+ switch (ksi->_signo) {
+ case SIGCHLD:
+ lsi->lsi_uid = ksi->_reason._child._uid;
+ lsi->lsi_pid = ksi->_reason._child._pid;
+ lsi->lsi_status = native_to_linux32_si_status(
+ ksi->_code, ksi->_reason._child._status);
+ lsi->lsi_utime = ksi->_reason._child._utime;
+ lsi->lsi_stime = ksi->_reason._child._stime;
+ break;
+
+ case SIGILL:
+ case SIGFPE:
+ case SIGSEGV:
+ case SIGBUS:
+ case SIGTRAP:
+ NETBSD32PTR32(lsi->lsi_addr, ksi->_reason._fault._addr);
+ break;
+
+ case SIGIO:
+ lsi->lsi_fd = ksi->_reason._poll._fd;
+ lsi->lsi_band = ksi->_reason._poll._band;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
unsigned int
native_to_linux32_sigflags(const int bsf)
{
@@ -362,6 +432,66 @@ linux32_sys_rt_sigsuspend(struct lwp *l,
return sigsuspend1(l, &bss);
}
+static int
+fetchss(const void *u, void *s, size_t len)
+{
+ int error;
+ linux32_sigset_t lss;
+
+ KASSERT(len == sizeof(lss));
+ if ((error = copyin(u, &lss, sizeof(lss))) != 0)
+ return error;
+
+ linux32_to_native_sigset(s, &lss);
+ return 0;
+}
+
+static int
+fetchts(const void *u, void *s, size_t len)
+{
+ int error;
+ struct linux32_timespec lts;
+
+ KASSERT(len == sizeof(lts));
+ if ((error = copyin(u, <s, sizeof(lts))) != 0)
+ return error;
+
+ linux32_to_native_timespec(s, <s);
+ return 0;
+}
+
+static int
+fakestorets(const void *u, void *s, size_t len)
+{
+ /* Do nothing, sigtimedwait does not alter timeout like ours */
+ return 0;
+}
+
+static int
+storeinfo(const void *s, void *u, size_t len)
+{
+ linux32_siginfo_t lsi;
+
+ KASSERT(len == sizeof(lsi));
+
+ native_to_linux32_siginfo(&lsi, &((const siginfo_t *)s)->_info);
+ return copyout(&lsi, u, sizeof(lsi));
+}
+
+int
+linux32_sys_rt_sigtimedwait(struct lwp *l,
+ const struct linux32_sys_rt_sigtimedwait_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(const linux32_sigset_t *) set;
+ syscallarg(linux32_siginfo_t *) info);
+ syscallarg(const struct linux32_timespec *) timeout;
+ } */
+
+ return sigtimedwait1(l, (const struct sys_____sigtimedwait50_args *)uap,
+ retval, fetchss, storeinfo, fetchts, fakestorets);
+}
+
int
linux32_sys_signal(struct lwp *l, const struct linux32_sys_signal_args *uap, register_t *retval)
{
@@ -470,3 +600,41 @@ linux32_sys_rt_queueinfo(struct lwp *l,
/* XXX keep a list of queued signals somewhere. */
return linux32_sys_kill(l, (const void *)uap, retval);
}
+
+int
+native_to_linux32_si_code(int code)
+{
+ int si_codes[] = {
+ LINUX32_SI_USER, LINUX32_SI_QUEUE, LINUX32_SI_TIMER,
+ LINUX32_SI_ASYNCIO, LINUX32_SI_MESGQ, LINUX32_SI_TKILL /* SI_LWP */
+ };
+
+ if (code <= 0 && -code < __arraycount(si_codes))
+ return si_codes[-code];
+
+ return code;
+}
+
+int
+native_to_linux32_si_status(int code, int status)
+{
+ int sts;
+
+ switch (code) {
+ case CLD_CONTINUED:
+ sts = LINUX_SIGCONT;
+ break;
+ case CLD_EXITED:
+ sts = WEXITSTATUS(status);
+ break;
+ case CLD_STOPPED:
+ case CLD_TRAPPED:
+ case CLD_DUMPED:
+ case CLD_KILLED:
+ default:
+ sts = native_to_linux32_signo[WTERMSIG(status)];
+ break;
+ }
+
+ return sts;
+}
Index: src/sys/compat/linux32/common/linux32_signal.h
diff -u src/sys/compat/linux32/common/linux32_signal.h:1.2 src/sys/compat/linux32/common/linux32_signal.h:1.3
--- src/sys/compat/linux32/common/linux32_signal.h:1.2 Tue Dec 4 13:40:18 2007
+++ src/sys/compat/linux32/common/linux32_signal.h Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_signal.h,v 1.2 2007/12/04 18:40:18 dsl Exp $ */
+/* $NetBSD: linux32_signal.h,v 1.3 2011/11/18 04:08:56 christos Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,6 +33,7 @@
#ifndef _LINUX32_SIGNAL_H_
#define _LINUX32_SIGNAL_H_
+#include <compat/linux32/common/linux32_siginfo.h>
#ifdef __amd64__
#include <compat/linux32/arch/amd64/linux32_signal.h>
#endif
@@ -51,5 +52,7 @@ void native_to_linux32_old_sigset(linux3
void linux32_old_extra_to_native_sigset(sigset_t *,
const linux32_old_sigset_t *, const unsigned long *);
void linux32_old_to_native_sigset(sigset_t *, const linux32_old_sigset_t *);
+int native_to_linux32_si_code(int);
+int native_to_linux32_si_status(int, int);
#endif /* _LINUX32_SIGNAL_H_ */
Index: src/sys/compat/linux32/common/linux32_time.c
diff -u src/sys/compat/linux32/common/linux32_time.c:1.35 src/sys/compat/linux32/common/linux32_time.c:1.36
--- src/sys/compat/linux32/common/linux32_time.c:1.35 Mon Jul 12 08:01:53 2010
+++ src/sys/compat/linux32/common/linux32_time.c Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_time.c,v 1.35 2010/07/12 12:01:53 njoly Exp $ */
+/* $NetBSD: linux32_time.c,v 1.36 2011/11/18 04:08:56 christos 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.35 2010/07/12 12:01:53 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_time.c,v 1.36 2011/11/18 04:08:56 christos Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -74,6 +74,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_time
#include <compat/linux32/common/linux32_machdep.h>
#include <compat/linux32/common/linux32_sysctl.h>
#include <compat/linux32/common/linux32_socketcall.h>
+#include <compat/linux32/common/linux32_sched.h>
#include <compat/linux32/linux32_syscallargs.h>
extern struct timezone linux_sys_tz;
Index: src/sys/compat/linux32/common/linux32_types.h
diff -u src/sys/compat/linux32/common/linux32_types.h:1.14 src/sys/compat/linux32/common/linux32_types.h:1.15
--- src/sys/compat/linux32/common/linux32_types.h:1.14 Tue Nov 2 14:14:06 2010
+++ src/sys/compat/linux32/common/linux32_types.h Thu Nov 17 23:08:56 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_types.h,v 1.14 2010/11/02 18:14:06 chs Exp $ */
+/* $NetBSD: linux32_types.h,v 1.15 2011/11/18 04:08:56 christos Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -111,11 +111,6 @@ struct linux32_sysinfo {
char _f[20-2*sizeof(netbsd32_long)-sizeof(int)];
};
-struct linux32_timespec {
- linux32_time_t tv_sec;
- netbsd32_long tv_nsec;
-};
-
#define LINUX32_MAXNAMLEN 255
struct linux32_dirent {
linux32_ino_t d_ino;
Added files:
Index: src/sys/compat/linux32/arch/amd64/linux32_siginfo.h
diff -u /dev/null src/sys/compat/linux32/arch/amd64/linux32_siginfo.h:1.1
--- /dev/null Thu Nov 17 23:08:56 2011
+++ src/sys/compat/linux32/arch/amd64/linux32_siginfo.h Thu Nov 17 23:08:56 2011
@@ -0,0 +1,91 @@
+/* $NetBSD: linux32_siginfo.h,v 1.1 2011/11/18 04:08:56 christos Exp $ */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Eric Haszlakiewicz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _AMD64_LINUX32_SIGINFO_H
+#define _AMD64_LINUX32_SIGINFO_H
+
+typedef union linux32_sigval {
+ int sival_int;
+ netbsd32_voidp sival_ptr;
+} linux32_sigval_t;
+
+#define SI_MAX_SIZE 128
+#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3)
+
+typedef struct linux32_siginfo {
+ int lsi_signo;
+ int lsi_errno;
+ int lsi_code;
+ union {
+ int _pad[SI_PAD_SIZE];
+
+ /* kill() */
+ struct {
+ linux32_pid_t _pid;
+ linux32_uid_t _uid;
+ } _kill;
+
+ /* POSIX.1b signals */
+ struct {
+ linux32_pid_t _pid;
+ linux32_uid_t _uid;
+ linux32_sigval_t _sigval;
+ } _rt;
+
+ /* POSIX.1b timers */
+ struct {
+ unsigned int _timer1;
+ unsigned int _timer2;
+ } _timer;
+
+ /* SIGCHLD */
+ struct {
+ linux32_pid_t _pid;
+ linux32_uid_t _uid;
+ int _status;
+ linux32_clock_t _utime;
+ linux32_clock_t _stime;
+ } _sigchld;
+
+ /* SIGPOLL */
+ struct {
+ int _band;
+ int _fd;
+ } _sigpoll;
+
+ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
+ struct {
+ netbsd32_voidp _addr;
+ } _sigfault;
+ } _sidata;
+} linux32_siginfo_t;
+
+#endif /* !_AMD64_LINUX32_SIGINFO_H */
Index: src/sys/compat/linux32/common/linux32_sched.h
diff -u /dev/null src/sys/compat/linux32/common/linux32_sched.h:1.1
--- /dev/null Thu Nov 17 23:08:56 2011
+++ src/sys/compat/linux32/common/linux32_sched.h Thu Nov 17 23:08:56 2011
@@ -0,0 +1,88 @@
+/* $NetBSD: linux32_sched.h,v 1.1 2011/11/18 04:08:56 christos Exp $ */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#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
+
+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 *);
+
+#endif /* _LINUX32_SCHED_H */
Index: src/sys/compat/linux32/common/linux32_siginfo.h
diff -u /dev/null src/sys/compat/linux32/common/linux32_siginfo.h:1.1
--- /dev/null Thu Nov 17 23:08:56 2011
+++ src/sys/compat/linux32/common/linux32_siginfo.h Thu Nov 17 23:08:56 2011
@@ -0,0 +1,118 @@
+/* $NetBSD: linux32_siginfo.h,v 1.1 2011/11/18 04:08:56 christos Exp $ */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Eric Haszlakiewicz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LINUX32_SIGINFO_H
+#define _LINUX32_SIGINFO_H
+
+#if defined(__amd64__)
+#include <compat/linux32/arch/amd64/linux32_siginfo.h>
+#endif
+
+/* si_code values for non signal */
+#define LINUX32_SI_USER 0
+#define LINUX32_SI_KERNEL 0x80
+#define LINUX32_SI_QUEUE -1
+#ifndef LINUX32_SI_TIMER /* all except mips */
+#define LINUX32_SI_TIMER -2
+#define LINUX32_SI_MESGQ -3
+#define LINUX32_SI_ASYNCIO -4
+#endif /* LINUX32_SI_TIMER */
+#define LINUX32_SI_SIGIO -5
+#define LINUX32_SI_TKILL -6
+#define LINUX32_SI_DETHREAD -7
+
+/* si_code values for SIGILL */
+#define LINUX32_ILL_ILLOPC 1
+#define LINUX32_ILL_ILLOPN 2
+#define LINUX32_ILL_ILLADR 3
+#define LINUX32_ILL_ILLTRP 4
+#define LINUX32_ILL_PRVOPC 5
+#define LINUX32_ILL_PRVREG 6
+#define LINUX32_ILL_COPROC 7
+#define LINUX32_ILL_BADSTK 8
+
+/* si_code values for SIGFPE */
+#define LINUX32_FPE_INTDIV 1
+#define LINUX32_FPE_INTOVF 2
+#define LINUX32_FPE_FLTDIV 3
+#define LINUX32_FPE_FLTOVF 4
+#define LINUX32_FPE_FLTUND 5
+#define LINUX32_FPE_FLTRES 6
+#define LINUX32_FPE_FLTINV 7
+#define LINUX32_FPE_FLTSUB 8
+
+/* si_code values for SIGSEGV */
+#define LINUX32_SEGV_MAPERR 1
+#define LINUX32_SEGV_ACCERR 2
+
+/* si_code values for SIGBUS */
+#define LINUX32_BUS_ADRALN 1
+#define LINUX32_BUS_ADRERR 2
+#define LINUX32_BUS_OBJERR 3
+
+/* si_code values for SIGTRAP */
+#define LINUX32_TRAP_BRKPT 1
+#define LINUX32_TRAP_TRACE 2
+
+/* si_code values for SIGCHLD */
+#define LINUX32_CLD_EXITED 1
+#define LINUX32_CLD_KILLED 2
+#define LINUX32_CLD_DUMPED 3
+#define LINUX32_CLD_TRAPPED 4
+#define LINUX32_CLD_STOPPED 5
+#define LINUX32_CLD_CONTINUED 6
+
+/* si_code values for SIGPOLL */
+#define LINUX32_POLL_IN 1
+#define LINUX32_POLL_OUT 2
+#define LINUX32_POLL_MSG 3
+#define LINUX32_POLL_ERR 4
+#define LINUX32_POLL_PRI 5
+#define LINUX32_POLL_HUP 6
+
+#define LINUX32_SI_FROMUSER(sp) ((sp)->si_code <= 0)
+#define LINUX32_SI_FROMKERNEL(sp) ((sp)->si_code > 0)
+
+#define lsi_pid _sidata._kill._pid
+#define lsi_uid _sidata._kill._uid
+#define lsi_status _sidata._sigchld._status
+#define lsi_utime _sidata._sigchld._utime
+#define lsi_stime _sidata._sigchld._stime
+#define lsi_value _sidata._rt._sigval
+#define lsi_sival_int _sidata._rt._sigval.sival_int
+#define lsi_sival_ptr _sidata._rt._sigval.sival_ptr
+#define lsi_addr _sidata._sigfault._addr
+#define lsi_band _sidata._sigpoll._band
+#define lsi_fd _sidata._sigpoll._fd
+
+void native_to_linux32_siginfo(linux32_siginfo_t *, const struct _ksiginfo *);
+
+#endif /* !_LINUX32_SIGINFO_H */