Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/compat/linux - add sigtimedwait support.



details:   https://anonhg.NetBSD.org/src/rev/fcbe525aa190
branches:  trunk
changeset: 771278:fcbe525aa190
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Nov 18 04:07:43 2011 +0000

description:
- add sigtimedwait support.
- merge the siginfo population code.

diffstat:

 sys/compat/linux/arch/alpha/linux_machdep.c       |   33 +---
 sys/compat/linux/arch/alpha/linux_siginfo.h       |    5 +-
 sys/compat/linux/arch/alpha/linux_syscall.h       |    7 +-
 sys/compat/linux/arch/alpha/linux_syscallargs.h   |   15 ++-
 sys/compat/linux/arch/alpha/linux_syscalls.c      |    8 +-
 sys/compat/linux/arch/alpha/linux_sysent.c        |   10 +-
 sys/compat/linux/arch/amd64/linux_machdep.c       |   44 +-------
 sys/compat/linux/arch/amd64/linux_siginfo.h       |   26 +++-
 sys/compat/linux/arch/amd64/linux_syscall.h       |   11 +-
 sys/compat/linux/arch/amd64/linux_syscallargs.h   |   13 +-
 sys/compat/linux/arch/amd64/linux_syscalls.c      |    8 +-
 sys/compat/linux/arch/amd64/linux_sysent.c        |   10 +-
 sys/compat/linux/arch/arm/linux_syscall.h         |   11 +-
 sys/compat/linux/arch/arm/linux_syscallargs.h     |   13 +-
 sys/compat/linux/arch/arm/linux_syscalls.c        |    8 +-
 sys/compat/linux/arch/arm/linux_sysent.c          |   10 +-
 sys/compat/linux/arch/i386/linux_machdep.c        |   37 +-----
 sys/compat/linux/arch/i386/linux_siginfo.h        |   14 +--
 sys/compat/linux/arch/i386/linux_syscall.h        |   11 +-
 sys/compat/linux/arch/i386/linux_syscallargs.h    |   13 +-
 sys/compat/linux/arch/i386/linux_syscalls.c       |    8 +-
 sys/compat/linux/arch/i386/linux_sysent.c         |   10 +-
 sys/compat/linux/arch/m68k/linux_siginfo.h        |    5 +-
 sys/compat/linux/arch/m68k/linux_syscall.h        |   11 +-
 sys/compat/linux/arch/m68k/linux_syscallargs.h    |   13 +-
 sys/compat/linux/arch/m68k/linux_syscalls.c       |    8 +-
 sys/compat/linux/arch/m68k/linux_sysent.c         |   10 +-
 sys/compat/linux/arch/mips/linux_siginfo.h        |    7 +-
 sys/compat/linux/arch/mips/linux_syscall.h        |   11 +-
 sys/compat/linux/arch/mips/linux_syscallargs.h    |   13 +-
 sys/compat/linux/arch/mips/linux_syscalls.c       |    8 +-
 sys/compat/linux/arch/mips/linux_sysent.c         |   10 +-
 sys/compat/linux/arch/powerpc/linux_siginfo.h     |    5 +-
 sys/compat/linux/arch/powerpc/linux_syscall.h     |   11 +-
 sys/compat/linux/arch/powerpc/linux_syscallargs.h |   13 +-
 sys/compat/linux/arch/powerpc/linux_syscalls.c    |    8 +-
 sys/compat/linux/arch/powerpc/linux_sysent.c      |   10 +-
 sys/compat/linux/common/linux_futex.c             |    6 +-
 sys/compat/linux/common/linux_sched.h             |    4 +-
 sys/compat/linux/common/linux_siginfo.h           |   20 ++-
 sys/compat/linux/common/linux_signal.c            |  128 +++++++++++++++++++++-
 sys/compat/linux/common/linux_time.c              |    6 +-
 42 files changed, 380 insertions(+), 252 deletions(-)

diffs (truncated from 1636 to 300 lines):

diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/alpha/linux_machdep.c
--- a/sys/compat/linux/arch/alpha/linux_machdep.c       Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/alpha/linux_machdep.c       Fri Nov 18 04:07:43 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_machdep.c,v 1.48 2011/06/09 13:41:40 matt Exp $  */
+/*     $NetBSD: linux_machdep.c,v 1.49 2011/11/18 04:07:43 christos Exp $      */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.48 2011/06/09 13:41:40 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.49 2011/11/18 04:07:43 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -108,13 +108,15 @@
 }
 
 void
-setup_linux_rt_sigframe(struct trapframe *tf, int sig, const sigset_t *mask)
+setup_linux_rt_sigframe(struct trapframe *tf, const ksiginfo_t *ksi,
+    const sigset_t *mask)
 {
        struct lwp *l = curlwp;
        struct proc *p = l->l_proc;
        struct linux_rt_sigframe *sfp, sigframe;
        int onstack, error;
        int fsize, rndfsize;
+       int sig = ksi->ksi_signo;
        extern char linux_rt_sigcode[], linux_rt_esigcode[];
 
        /* Do we need to jump onto the signal stack? */
@@ -163,19 +165,7 @@
        sigframe.uc.uc_mcontext.sc_traparg_a0 = tf->tf_regs[FRAME_A0];
        sigframe.uc.uc_mcontext.sc_traparg_a1 = tf->tf_regs[FRAME_A1];
        sigframe.uc.uc_mcontext.sc_traparg_a2 = tf->tf_regs[FRAME_A2];
-
-       /*
-        * XXX XAX Create bogus siginfo data.  This can't really
-        * XXX be fixed until NetBSD has realtime signals.
-        * XXX Or we do the emuldata thing.
-        * XXX -erh
-        */
-       memset(&sigframe.info, 0, sizeof(struct linux_siginfo));
-       sigframe.info.lsi_signo = sig;
-       sigframe.info.lsi_code = LINUX_SI_USER;
-       sigframe.info.lsi_pid = p->p_pid;
-       sigframe.info.lsi_uid = kauth_cred_geteuid(l->l_cred);  /* Use real uid here? */
-
+       native_to_linux_siginfo(&sigframe.info, &ksi->ksi_info);
        sendsig_reset(l, sig);
        mutex_exit(p->p_lock);
        error = copyout((void *)&sigframe, (void *)sfp, fsize);
@@ -211,16 +201,15 @@
                l->l_sigstk.ss_flags |= SS_ONSTACK;
 }
 
-void setup_linux_sigframe(tf, sig, mask)
-       struct trapframe *tf;
-       int sig;
-       const sigset_t *mask;
+void setup_linux_sigframe(struct trapframe *tf, const ksiginfo_t *ksi,
+    const sigset_t *mask)
 {
        struct lwp *l = curlwp;
        struct proc *p = l->l_proc;
        struct linux_sigframe *sfp, sigframe;
        int onstack, error;
        int fsize, rndfsize;
+       int sig = ksi->ksi_signo;
        extern char linux_sigcode[], linux_esigcode[];
 
        /* Do we need to jump onto the signal stack? */
@@ -336,10 +325,10 @@
        edp = 0;
 #endif
        if (edp && sigismember(&edp->ps_siginfo, sig))
-               setup_linux_rt_sigframe(tf, sig, mask);
+               setup_linux_rt_sigframe(tf, ksi, mask);
        else
 #endif /* notyet */
-               setup_linux_sigframe(tf, sig, mask);
+               setup_linux_sigframe(tf, ksi, mask);
 
        /* Signal handler for trampoline code */
        tf->tf_regs[FRAME_T12] = (u_int64_t)catcher;
diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/alpha/linux_siginfo.h
--- a/sys/compat/linux/arch/alpha/linux_siginfo.h       Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/alpha/linux_siginfo.h       Fri Nov 18 04:07:43 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_siginfo.h,v 1.6 2009/06/08 11:46:06 njoly Exp $  */
+/*     $NetBSD: linux_siginfo.h,v 1.7 2011/11/18 04:07:43 christos Exp $       */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -88,7 +88,4 @@
        } _sidata;
 } linux_siginfo_t;
 
-#define lsi_pid                _sidata._kill._pid
-#define lsi_uid                _sidata._kill._uid
-
 #endif /* !_ALPHA_LINUX_SIGINFO_H */
diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/alpha/linux_syscall.h
--- a/sys/compat/linux/arch/alpha/linux_syscall.h       Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/alpha/linux_syscall.h       Fri Nov 18 04:07:43 2011 +0000
@@ -1,10 +1,10 @@
-/* $NetBSD: linux_syscall.h,v 1.81 2011/05/30 21:37:37 alnsn Exp $ */
+/* $NetBSD: linux_syscall.h,v 1.82 2011/11/18 04:07:43 christos Exp $ */
 
 /*
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        NetBSD: syscalls.master,v 1.74 2011/05/30 17:50:31 alnsn Exp
+ * created from        NetBSD: syscalls.master,v 1.76 2011/11/18 04:03:50 christos Exp
  */
 
 #ifndef _LINUX_SYS_SYSCALL_H_
@@ -477,6 +477,9 @@
 /* syscall: "rt_sigpending" ret: "int" args: "linux_sigset_t *" "size_t" */
 #define        LINUX_SYS_rt_sigpending 354
 
+/* syscall: "rt_sigtimedwait" ret: "int" args: "const linux_sigset_t *" "linux_siginfo_t *" "const struct linux_timespec *" */
+#define        LINUX_SYS_rt_sigtimedwait       355
+
 /* syscall: "rt_queueinfo" ret: "int" args: "int" "int" "linux_siginfo_t *" */
 #define        LINUX_SYS_rt_queueinfo  356
 
diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/alpha/linux_syscallargs.h
--- a/sys/compat/linux/arch/alpha/linux_syscallargs.h   Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/alpha/linux_syscallargs.h   Fri Nov 18 04:07:43 2011 +0000
@@ -1,10 +1,10 @@
-/* $NetBSD: linux_syscallargs.h,v 1.80 2011/05/30 21:37:37 alnsn Exp $ */
+/* $NetBSD: linux_syscallargs.h,v 1.81 2011/11/18 04:07:43 christos Exp $ */
 
 /*
  * System call argument lists.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        NetBSD: syscalls.master,v 1.74 2011/05/30 17:50:31 alnsn Exp
+ * created from        NetBSD: syscalls.master,v 1.76 2011/11/18 04:03:50 christos Exp
  */
 
 #ifndef _LINUX_SYS_SYSCALLARGS_H_
@@ -186,7 +186,7 @@
 struct sys_setgroups_args;
 
 struct osf1_sys_setitimer_args {
-       syscallarg(u_int) which;
+       syscallarg(int) which;
        syscallarg(struct osf1_itimerval *) itv;
        syscallarg(struct osf1_itimerval *) oitv;
 };
@@ -747,6 +747,13 @@
 };
 check_syscall_args(linux_sys_rt_sigpending)
 
+struct linux_sys_rt_sigtimedwait_args {
+       syscallarg(const linux_sigset_t *) set;
+       syscallarg(linux_siginfo_t *) info;
+       syscallarg(const struct linux_timespec *) timeout;
+};
+check_syscall_args(linux_sys_rt_sigtimedwait)
+
 struct linux_sys_rt_queueinfo_args {
        syscallarg(int) pid;
        syscallarg(int) signum;
@@ -1345,6 +1352,8 @@
 
 int    linux_sys_rt_sigpending(struct lwp *, const struct linux_sys_rt_sigpending_args *, register_t *);
 
+int    linux_sys_rt_sigtimedwait(struct lwp *, const struct linux_sys_rt_sigtimedwait_args *, register_t *);
+
 int    linux_sys_rt_queueinfo(struct lwp *, const struct linux_sys_rt_queueinfo_args *, register_t *);
 
 int    linux_sys_rt_sigsuspend(struct lwp *, const struct linux_sys_rt_sigsuspend_args *, register_t *);
diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/alpha/linux_syscalls.c
--- a/sys/compat/linux/arch/alpha/linux_syscalls.c      Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/alpha/linux_syscalls.c      Fri Nov 18 04:07:43 2011 +0000
@@ -1,14 +1,14 @@
-/* $NetBSD: linux_syscalls.c,v 1.82 2011/05/30 21:37:37 alnsn Exp $ */
+/* $NetBSD: linux_syscalls.c,v 1.83 2011/11/18 04:07:43 christos Exp $ */
 
 /*
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        NetBSD: syscalls.master,v 1.74 2011/05/30 17:50:31 alnsn Exp
+ * created from        NetBSD: syscalls.master,v 1.76 2011/11/18 04:03:50 christos Exp
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_syscalls.c,v 1.82 2011/05/30 21:37:37 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_syscalls.c,v 1.83 2011/11/18 04:07:43 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #if defined(_KERNEL_OPT)
@@ -411,7 +411,7 @@
        /* 352 */       "rt_sigaction",
        /* 353 */       "rt_sigprocmask",
        /* 354 */       "rt_sigpending",
-       /* 355 */       "#355 (unimplemented rt_sigtimedwait)",
+       /* 355 */       "rt_sigtimedwait",
        /* 356 */       "rt_queueinfo",
        /* 357 */       "rt_sigsuspend",
        /* 358 */       "select",
diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/alpha/linux_sysent.c
--- a/sys/compat/linux/arch/alpha/linux_sysent.c        Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/alpha/linux_sysent.c        Fri Nov 18 04:07:43 2011 +0000
@@ -1,14 +1,14 @@
-/* $NetBSD: linux_sysent.c,v 1.81 2011/05/30 21:37:37 alnsn Exp $ */
+/* $NetBSD: linux_sysent.c,v 1.82 2011/11/18 04:07:43 christos Exp $ */
 
 /*
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        NetBSD: syscalls.master,v 1.74 2011/05/30 17:50:31 alnsn Exp
+ * created from        NetBSD: syscalls.master,v 1.76 2011/11/18 04:03:50 christos Exp
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_sysent.c,v 1.81 2011/05/30 21:37:37 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_sysent.c,v 1.82 2011/11/18 04:07:43 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_sysv.h"
@@ -780,8 +780,8 @@
            (sy_call_t *)linux_sys_rt_sigprocmask },/* 353 = rt_sigprocmask */
        { ns(struct linux_sys_rt_sigpending_args), 0,
            (sy_call_t *)linux_sys_rt_sigpending },/* 354 = rt_sigpending */
-       { 0, 0, 0,
-           linux_sys_nosys },                  /* 355 = unimplemented rt_sigtimedwait */
+       { ns(struct linux_sys_rt_sigtimedwait_args), 0,
+           (sy_call_t *)linux_sys_rt_sigtimedwait },/* 355 = rt_sigtimedwait */
        { ns(struct linux_sys_rt_queueinfo_args), 0,
            (sy_call_t *)linux_sys_rt_queueinfo },/* 356 = rt_queueinfo */
        { ns(struct linux_sys_rt_sigsuspend_args), 0,
diff -r 61c0366029a1 -r fcbe525aa190 sys/compat/linux/arch/amd64/linux_machdep.c
--- a/sys/compat/linux/arch/amd64/linux_machdep.c       Fri Nov 18 04:03:50 2011 +0000
+++ b/sys/compat/linux/arch/amd64/linux_machdep.c       Fri Nov 18 04:07:43 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_machdep.c,v 1.38 2010/07/07 01:30:33 chs Exp $ */
+/*     $NetBSD: linux_machdep.c,v 1.39 2011/11/18 04:07:43 christos Exp $ */
 
 /*-
  * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.38 2010/07/07 01:30:33 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.39 2011/11/18 04:07:43 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -220,45 +220,7 @@
        sigframe.uc.luc_mcontext.cr2 = (long)pcb->pcb_onfault;
        sigframe.uc.luc_mcontext.fpstate = fpsp;
        native_to_linux_sigset(&sigframe.uc.luc_sigmask, mask);
-
-       /* 
-        * the siginfo structure
-        */
-       sigframe.info.lsi_signo = native_to_linux_signo[sig];
-       sigframe.info.lsi_errno = native_to_linux_errno[ksi->ksi_errno];
-       sigframe.info.lsi_code = native_to_linux_si_code(ksi->ksi_code);
-
-       /* XXX This is a rought conversion, taken from i386 code */
-       switch (sigframe.info.lsi_signo) {
-       case LINUX_SIGILL:
-       case LINUX_SIGFPE:
-       case LINUX_SIGSEGV:
-       case LINUX_SIGBUS:
-       case LINUX_SIGTRAP:
-               sigframe.info._sifields._sigfault._addr = ksi->ksi_addr;
-               break;
-       case LINUX_SIGCHLD:
-               sigframe.info._sifields._sigchld._pid = ksi->ksi_pid;
-               sigframe.info._sifields._sigchld._uid = ksi->ksi_uid;
-               sigframe.info._sifields._sigchld._utime = ksi->ksi_utime;
-               sigframe.info._sifields._sigchld._stime = ksi->ksi_stime;
-               sigframe.info._sifields._sigchld._status =
-                   native_to_linux_si_status(ksi->ksi_code, ksi->ksi_status);
-               break;
-       case LINUX_SIGIO:
-               sigframe.info._sifields._sigpoll._band = ksi->ksi_band;
-               sigframe.info._sifields._sigpoll._fd = ksi->ksi_fd;
-               break;
-       default:
-               sigframe.info._sifields._sigchld._pid = ksi->ksi_pid;
-               sigframe.info._sifields._sigchld._uid = ksi->ksi_uid;
-               if ((sigframe.info.lsi_signo == LINUX_SIGALRM) ||
-                   (sigframe.info.lsi_signo >= LINUX_SIGRTMIN))
-                       sigframe.info._sifields._timer._sigval.sival_ptr =
-                            ksi->ksi_value.sival_ptr;



Home | Main Index | Thread Index | Old Index