[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 15/15] Hurd signals: Use POSIX sigcodes
From: |
Jeremie Koenig |
Subject: |
[PATCH 15/15] Hurd signals: Use POSIX sigcodes |
Date: |
Wed, 29 Jun 2011 18:30:27 +0200 |
* sysdeps/mach/hurd/i386/bits/sigcontext.h: Remove the constants formerly
used as sigcodes.
* manual/signal.texi: "GNU systems" no longer use them.
* hurd/hurdinit.c (_hurd_new_proc_init): Use sigcode TRAP_TRACE for
SIGTRAP on exec.
* sysdeps/mach/hurd/i386/exc2signal.c (_hurd_exception2signal): Use POSIX
sigcodes for exceptions.
* sysdeps/mach/hurd/kill.c (__kill): Use SI_USER for signals sent through kill.
* sysdeps/mach/hurd/setitimer.c (timer_thread): Use SI_TIMER for SIGALRM.
---
hurd/hurdinit.c | 2 +-
manual/signal.texi | 2 +-
sysdeps/mach/hurd/i386/bits/sigcontext.h | 22 ------
sysdeps/mach/hurd/i386/exc2signal.c | 106 ++++++++++++++++-------------
sysdeps/mach/hurd/kill.c | 2 +-
sysdeps/mach/hurd/setitimer.c | 2 +-
6 files changed, 62 insertions(+), 74 deletions(-)
diff --git a/hurd/hurdinit.c b/hurd/hurdinit.c
index 259f8a3..97d3460 100644
--- a/hurd/hurdinit.c
+++ b/hurd/hurdinit.c
@@ -176,7 +176,7 @@ _hurd_new_proc_init (char **argv,
/* This process is "traced", meaning it should stop on signals or exec.
We are all set up now to handle signals. Stop ourselves, to inform
our parent (presumably a debugger) that the exec has completed. */
- __msg_sig_post (_hurd_msgport, SIGTRAP, 0, __mach_task_self ());
+ __msg_sig_post (_hurd_msgport, SIGTRAP, TRAP_TRACE, __mach_task_self ());
}
#include <shlib-compat.h>
diff --git a/manual/signal.texi b/manual/signal.texi
index 6cdae15..c511a64 100644
--- a/manual/signal.texi
+++ b/manual/signal.texi
@@ -309,7 +309,7 @@ this argument, you must define the handler to accept two
arguments,
which means you must cast it to a one-argument function type in order to
establish the handler. The GNU library does provide this extra
argument, but the value is meaningful only on operating systems that
-provide the information (BSD systems and GNU systems).
+provide the information (BSD systems).
@table @code
@comment signal.h
diff --git a/sysdeps/mach/hurd/i386/bits/sigcontext.h
b/sysdeps/mach/hurd/i386/bits/sigcontext.h
index a78dd2f..a80c6cc 100644
--- a/sysdeps/mach/hurd/i386/bits/sigcontext.h
+++ b/sysdeps/mach/hurd/i386/bits/sigcontext.h
@@ -95,26 +95,4 @@ struct sigcontext
#define sc_pc sc_eip /* Process counter. */
#define sc_ps sc_efl
-
-/* Codes for SIGFPE. */
-#define FPE_INTOVF_TRAP 0x1 /* integer overflow */
-#define FPE_INTDIV_FAULT 0x2 /* integer divide by zero */
-#define FPE_FLTOVF_FAULT 0x3 /* floating overflow */
-#define FPE_FLTDIV_FAULT 0x4 /* floating divide by zero */
-#define FPE_FLTUND_FAULT 0x5 /* floating underflow */
-#define FPE_SUBRNG_FAULT 0x7 /* BOUNDS instruction failed */
-#define FPE_FLTDNR_FAULT 0x8 /* denormalized operand */
-#define FPE_FLTINX_FAULT 0x9 /* floating loss of precision */
-#define FPE_EMERR_FAULT 0xa /* mysterious emulation error 33 */
-#define FPE_EMBND_FAULT 0xb /* emulation BOUNDS instruction
failed */
-
-/* Codes for SIGILL. */
-#define ILL_INVOPR_FAULT 0x1 /* invalid operation */
-#define ILL_STACK_FAULT 0x2 /* fault on microkernel stack
access */
-#define ILL_FPEOPR_FAULT 0x3 /* invalid floating operation */
-
-/* Codes for SIGTRAP. */
-#define DBG_SINGLE_TRAP 0x1 /* single step */
-#define DBG_BRKPNT_FAULT 0x2 /* breakpoint instruction */
-
#endif /* sc_pc */
diff --git a/sysdeps/mach/hurd/i386/exc2signal.c
b/sysdeps/mach/hurd/i386/exc2signal.c
index a6bf750..ef071a4 100644
--- a/sysdeps/mach/hurd/i386/exc2signal.c
+++ b/sysdeps/mach/hurd/i386/exc2signal.c
@@ -37,44 +37,63 @@ _hurd_exception2signal (struct hurd_signal_detail *detail,
int *signo)
break;
case EXC_BAD_ACCESS:
- if (detail->exc_code == KERN_INVALID_ADDRESS
- || detail->exc_code == KERN_PROTECTION_FAILURE
- || detail->exc_code == KERN_WRITE_PROTECTION_FAILURE)
- *signo = SIGSEGV;
- else
- *signo = SIGBUS;
- detail->code = detail->exc_subcode;
+ switch (detail->exc_code)
+ {
+ case KERN_INVALID_ADDRESS:
+ case KERN_MEMORY_FAILURE:
+ *signo = SIGSEGV;
+ detail->code = SEGV_MAPERR;
+ break;
+
+ case KERN_PROTECTION_FAILURE:
+ case KERN_WRITE_PROTECTION_FAILURE:
+ *signo = SIGSEGV;
+ detail->code = SEGV_ACCERR;
+ break;
+
+ default:
+ *signo = SIGBUS;
+ detail->code = 0;
+ break;
+ }
detail->error = detail->exc_code;
break;
case EXC_BAD_INSTRUCTION:
*signo = SIGILL;
- if (detail->exc_code == EXC_I386_INVOP)
- detail->code = ILL_INVOPR_FAULT;
- else if (detail->exc_code == EXC_I386_STKFLT)
- detail->code = ILL_STACK_FAULT;
- else
- detail->code = 0;
+ switch (detail->exc_code)
+ {
+ case EXC_I386_INVOPFLT:
+ detail->code = ILL_ILLOPC;
+ break;
+
+ case EXC_I386_STKFLT:
+ detail->code = ILL_BADSTK;
+ break;
+
+ case EXC_I386_INVOP:
+ default:
+ detail->code = 0;
+ break;
+ }
break;
case EXC_ARITHMETIC:
+ *signo = SIGFPE;
switch (detail->exc_code)
{
case EXC_I386_DIV: /* integer divide by zero */
- *signo = SIGFPE;
- detail->code = FPE_INTDIV_FAULT;
+ detail->code = FPE_INTDIV;
break;
case EXC_I386_INTO: /* integer overflow */
- *signo = SIGFPE;
- detail->code = FPE_INTOVF_TRAP;
+ detail->code = FPE_INTOVF;
break;
/* These aren't anywhere documented or used in Mach 3.0. */
case EXC_I386_NOEXT:
case EXC_I386_EXTOVR:
default:
- *signo = SIGFPE;
detail->code = 0;
break;
@@ -83,51 +102,37 @@ _hurd_exception2signal (struct hurd_signal_detail *detail,
int *signo)
Give an error code corresponding to the first bit set. */
if (detail->exc_subcode & FPS_IE)
{
- *signo = SIGILL;
- detail->code = ILL_FPEOPR_FAULT;
+ detail->code = FPE_FLTINV;
}
- else if (detail->exc_subcode & FPS_DE)
+ else if (detail->exc_subcode & (FPS_DE | FPS_UE))
{
- *signo = SIGFPE;
- detail->code = FPE_FLTDNR_FAULT;
+ detail->code = FPE_FLTUND;
}
else if (detail->exc_subcode & FPS_ZE)
{
- *signo = SIGFPE;
- detail->code = FPE_FLTDIV_FAULT;
+ detail->code = FPE_FLTDIV;
}
else if (detail->exc_subcode & FPS_OE)
{
- *signo = SIGFPE;
- detail->code = FPE_FLTOVF_FAULT;
- }
- else if (detail->exc_subcode & FPS_UE)
- {
- *signo = SIGFPE;
- detail->code = FPE_FLTUND_FAULT;
+ detail->code = FPE_FLTOVF;
}
else if (detail->exc_subcode & FPS_PE)
{
- *signo = SIGFPE;
- detail->code = FPE_FLTINX_FAULT;
+ detail->code = FPE_FLTRES;
}
else
{
- *signo = SIGFPE;
detail->code = 0;
}
break;
/* These two can only be arithmetic exceptions if we
- are in V86 mode, which sounds like emulation to me.
- (See Mach 3.0 i386/trap.c.) */
+ are in V86 mode. (See Mach 3.0 i386/trap.c.) */
case EXC_I386_EMERR:
- *signo = SIGFPE;
- detail->code = FPE_EMERR_FAULT;
+ detail->code = 0;
break;
case EXC_I386_BOUND:
- *signo = SIGFPE;
- detail->code = FPE_EMBND_FAULT;
+ detail->code = FPE_FLTSUB;
break;
}
break;
@@ -144,7 +149,7 @@ _hurd_exception2signal (struct hurd_signal_detail *detail,
int *signo)
if (detail->exc_code == EXC_I386_BOUND)
{
*signo = SIGFPE;
- detail->code = FPE_SUBRNG_FAULT;
+ detail->code = FPE_FLTSUB;
}
else
{
@@ -155,12 +160,17 @@ _hurd_exception2signal (struct hurd_signal_detail
*detail, int *signo)
case EXC_BREAKPOINT:
*signo = SIGTRAP;
- if (detail->exc_code == EXC_I386_SGL)
- detail->code = DBG_SINGLE_TRAP;
- else if (detail->exc_code == EXC_I386_BPT)
- detail->code = DBG_BRKPNT_FAULT;
- else
- detail->code = 0;
+ switch (detail->exc_code)
+ {
+ case EXC_I386_SGL:
+ case EXC_I386_BPT:
+ detail->code = TRAP_BRKPT;
+ break;
+
+ default:
+ detail->code = 0;
+ break;
+ }
break;
}
}
diff --git a/sysdeps/mach/hurd/kill.c b/sysdeps/mach/hurd/kill.c
index a9946e0..ac7ffc7 100644
--- a/sysdeps/mach/hurd/kill.c
+++ b/sysdeps/mach/hurd/kill.c
@@ -65,7 +65,7 @@ __kill (pid_t pid, int sig)
{
if (msgport != MACH_PORT_NULL)
/* Send a signal message to his message port. */
- return __msg_sig_post (msgport, sig, 0, refport);
+ return __msg_sig_post (msgport, sig, SI_USER, refport);
/* The process has no message port. Perhaps try direct
frobnication of the task. */
diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c
index fec64a8..c82bfcd 100644
--- a/sysdeps/mach/hurd/setitimer.c
+++ b/sysdeps/mach/hurd/setitimer.c
@@ -105,7 +105,7 @@ timer_thread (void)
__msg_sig_post_request (_hurd_msgport,
_hurd_itimer_port,
MACH_MSG_TYPE_MAKE_SEND_ONCE,
- SIGALRM, 0, __mach_task_self ());
+ SIGALRM, SI_TIMER, __mach_task_self ());
break;
case MACH_RCV_INTERRUPTED:
--
1.7.5.3
- [PATCH 08/15] Versions.def: add GLIBC_2.15, (continued)
- [PATCH 08/15] Versions.def: add GLIBC_2.15, Jeremie Koenig, 2011/06/29
- [PATCH 10/15] Hurd signals: provide a sigstate destructor, Jeremie Koenig, 2011/06/29
- [PATCH 11/15] Hurd signals: fix sigwait() for global signals, Jeremie Koenig, 2011/06/29
- [PATCH 14/15] Hurd signals: SA_SIGINFO support, Jeremie Koenig, 2011/06/29
- [PATCH 13/15] Hurd signals: Copy bits/sigaction.h, Jeremie Koenig, 2011/06/29
- [PATCH 07/15] Hurd signals: fix uninitialized value., Jeremie Koenig, 2011/06/29
- [PATCH 04/15] Hurd signals: refactor check_pending_signals, Jeremie Koenig, 2011/06/29
- [PATCH 03/15] _hurd_internal_post_signal: Split out inner functions, Jeremie Koenig, 2011/06/29
- [PATCH 09/15] Hurd signals: implement global signal dispositions, Jeremie Koenig, 2011/06/29
- [PATCH 12/15] Hurd signals: fix global untraced signals., Jeremie Koenig, 2011/06/29
- [PATCH 15/15] Hurd signals: Use POSIX sigcodes,
Jeremie Koenig <=
Re: [PATCH 00/15] Hurd signals: please review, Jérémie Koenig, 2011/06/29