summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornjoly <njoly@NetBSD.org>2009-05-29 14:19:12 +0000
committernjoly <njoly@NetBSD.org>2009-05-29 14:19:12 +0000
commitd22e6f64ab506ef4ba2c366aca4e71ba2f666207 (patch)
tree001b92ea46346e2f01801daa015b32e38001d563
parent4c494f7678a94d301a0b4643623bcfe63b8f2cbb (diff)
Add native to linux siginfo si_status translation, used on i386 and
amd64.
-rw-r--r--sys/compat/linux/arch/amd64/linux_machdep.c21
-rw-r--r--sys/compat/linux/arch/i386/linux_machdep.c8
-rw-r--r--sys/compat/linux/common/linux_signal.c29
-rw-r--r--sys/compat/linux/common/linux_signal.h3
-rw-r--r--sys/compat/linux32/arch/amd64/linux32_machdep.c12
5 files changed, 41 insertions, 32 deletions
diff --git a/sys/compat/linux/arch/amd64/linux_machdep.c b/sys/compat/linux/arch/amd64/linux_machdep.c
index 218d4f93217..5313e94cc67 100644
--- a/sys/compat/linux/arch/amd64/linux_machdep.c
+++ b/sys/compat/linux/arch/amd64/linux_machdep.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_machdep.c,v 1.35 2009/03/18 16:00:16 cegger Exp $ */
+/* $NetBSD: linux_machdep.c,v 1.36 2009/05/29 14:19:12 njoly 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.35 2009/03/18 16:00:16 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.36 2009/05/29 14:19:12 njoly Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -43,7 +43,6 @@ __KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.35 2009/03/18 16:00:16 cegger Ex
#include <sys/proc.h>
#include <sys/ptrace.h> /* for process_read_fpregs() */
#include <sys/user.h>
-#include <sys/wait.h>
#include <sys/ucontext.h>
#include <sys/conf.h>
@@ -246,20 +245,8 @@ linux_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
sigframe.info._sifields._sigchld._uid = ksi->ksi_uid;
sigframe.info._sifields._sigchld._utime = ksi->ksi_utime;
sigframe.info._sifields._sigchld._stime = ksi->ksi_stime;
-
- if (WCOREDUMP(ksi->ksi_status)) {
- sigframe.info.lsi_code = LINUX_CLD_DUMPED;
- sigframe.info._sifields._sigchld._status =
- _WSTATUS(ksi->ksi_status);
- } else if (_WSTATUS(ksi->ksi_status)) {
- sigframe.info.lsi_code = LINUX_CLD_KILLED;
- sigframe.info._sifields._sigchld._status =
- _WSTATUS(ksi->ksi_status);
- } else {
- sigframe.info.lsi_code = LINUX_CLD_EXITED;
- sigframe.info._sifields._sigchld._status =
- ((ksi->ksi_status & 0xff00U) >> 8);
- }
+ 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;
diff --git a/sys/compat/linux/arch/i386/linux_machdep.c b/sys/compat/linux/arch/i386/linux_machdep.c
index 08f127fb236..b63e73f6e00 100644
--- a/sys/compat/linux/arch/i386/linux_machdep.c
+++ b/sys/compat/linux/arch/i386/linux_machdep.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_machdep.c,v 1.144 2009/04/23 17:37:51 njoly Exp $ */
+/* $NetBSD: linux_machdep.c,v 1.145 2009/05/29 14:19:13 njoly Exp $ */
/*-
* Copyright (c) 1995, 2000, 2008, 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.144 2009/04/23 17:37:51 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.145 2009/05/29 14:19:13 njoly Exp $");
#if defined(_KERNEL_OPT)
#include "opt_vm86.h"
@@ -298,8 +298,8 @@ linux_rt_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
lsi->lsi_pid = ksi->ksi_pid;
lsi->lsi_utime = ksi->ksi_utime;
lsi->lsi_stime = ksi->ksi_stime;
- /* XXX is that right? */
- lsi->lsi_status = WEXITSTATUS(ksi->ksi_status);
+ lsi->lsi_status =
+ native_to_linux_si_status(ksi->ksi_code, ksi->ksi_status);
break;
case LINUX_SIGIO:
lsi->lsi_band = ksi->ksi_band;
diff --git a/sys/compat/linux/common/linux_signal.c b/sys/compat/linux/common/linux_signal.c
index 197f85556a8..22a9d58c7d4 100644
--- a/sys/compat/linux/common/linux_signal.c
+++ b/sys/compat/linux/common/linux_signal.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.c,v 1.67 2009/02/18 14:43:22 njoly Exp $ */
+/* $NetBSD: linux_signal.c,v 1.68 2009/05/29 14:19:13 njoly Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.67 2009/02/18 14:43:22 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.68 2009/05/29 14:19:13 njoly Exp $");
#define COMPAT_LINUX 1
@@ -63,6 +63,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.67 2009/02/18 14:43:22 njoly Exp
#include <sys/signal.h>
#include <sys/signalvar.h>
#include <sys/malloc.h>
+#include <sys/wait.h>
#include <sys/syscallargs.h>
@@ -686,3 +687,27 @@ native_to_linux_si_code(int code)
return code;
}
+
+int
+native_to_linux_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_linux_signo[WTERMSIG(status)];
+ break;
+ }
+
+ return sts;
+}
diff --git a/sys/compat/linux/common/linux_signal.h b/sys/compat/linux/common/linux_signal.h
index 31036b9b472..1c442252b3f 100644
--- a/sys/compat/linux/common/linux_signal.h
+++ b/sys/compat/linux/common/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.29 2008/10/19 09:44:31 njoly Exp $ */
+/* $NetBSD: linux_signal.h,v 1.30 2009/05/29 14:19:13 njoly Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@@ -93,6 +93,7 @@ void native_to_linux_sigaltstack(struct linux_sigaltstack *,
const struct sigaltstack *);
int native_to_linux_si_code(int);
+int native_to_linux_si_status(int, int);
__END_DECLS
#endif /* !_KERNEL */
diff --git a/sys/compat/linux32/arch/amd64/linux32_machdep.c b/sys/compat/linux32/arch/amd64/linux32_machdep.c
index 98da2e0ba0a..1d399694987 100644
--- a/sys/compat/linux32/arch/amd64/linux32_machdep.c
+++ b/sys/compat/linux32/arch/amd64/linux32_machdep.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_machdep.c,v 1.21 2009/03/15 15:56:50 cegger Exp $ */
+/* $NetBSD: linux32_machdep.c,v 1.22 2009/05/29 14:19:13 njoly Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -31,7 +31,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_machdep.c,v 1.21 2009/03/15 15:56:50 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_machdep.c,v 1.22 2009/05/29 14:19:13 njoly Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -56,7 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_machdep.c,v 1.21 2009/03/15 15:56:50 cegger
#include <sys/exec_elf.h>
#include <sys/disklabel.h>
#include <sys/ioctl.h>
-#include <sys/wait.h>
#include <miscfs/specfs/specdev.h>
#include <machine/netbsd32_machdep.h>
@@ -225,11 +224,8 @@ linux32_rt_sendsig(const ksiginfo_t *ksi, const sigset_t *mask)
lsi->lsi_pid = ksi->ksi_pid;
lsi->lsi_utime = ksi->ksi_utime;
lsi->lsi_stime = ksi->ksi_stime;
-
- /* We use the same codes */
- lsi->lsi_code = ksi->ksi_code;
- /* XXX is that right? */
- lsi->lsi_status = WEXITSTATUS(ksi->ksi_status);
+ lsi->lsi_status = native_to_linux_si_status(ksi->ksi_code,
+ ksi->ksi_status);
break;
case LINUX32_SIGIO:
lsi->lsi_band = ksi->ksi_band;