summaryrefslogtreecommitdiff
path: root/hurd/exc2signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'hurd/exc2signal.c')
-rw-r--r--hurd/exc2signal.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/hurd/exc2signal.c b/hurd/exc2signal.c
index 10aa1ca4cf..0ecc5eb178 100644
--- a/hurd/exc2signal.c
+++ b/hurd/exc2signal.c
@@ -25,8 +25,8 @@
/* Translate the Mach exception codes, as received in an `exception_raise' RPC,
into a signal number and signal subcode. */
-void
-_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
+static void
+exception2signal (struct hurd_signal_detail *detail, int *signo, int posix)
{
detail->error = 0;
@@ -38,11 +38,18 @@ _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
break;
case EXC_BAD_ACCESS:
- if (detail->exc_code == KERN_PROTECTION_FAILURE)
- *signo = SIGSEGV;
- else
- *signo = SIGBUS;
- detail->code = detail->exc_subcode;
+ switch (detail->exc_code)
+ {
+ case KERN_PROTECTION_FAILURE:
+ *signo = SIGSEGV;
+ detail->code = posix ? SEGV_ACCERR : detail->exc_subcode;
+ break;
+
+ default:
+ *signo = SIGBUS;
+ detail->code = 0;
+ break;
+ }
detail->error = detail->exc_code;
break;
@@ -68,4 +75,16 @@ _hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
break;
}
}
+
+void
+_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
+{
+ exception2signal (detail, signo, 1);
+}
libc_hidden_def (_hurd_exception2signal)
+
+void
+_hurd_exception2signal_legacy (struct hurd_signal_detail *detail, int *signo)
+{
+ exception2signal (detail, signo, 0);
+}