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