summaryrefslogtreecommitdiff
path: root/hurd/exc2signal.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-09-20 22:03:38 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-09-20 22:03:38 +0200
commit501f22197a8042618686bacca8b6be2b36ad4654 (patch)
treee614a8bb691e41901a7e255a4857fff006303ee1 /hurd/exc2signal.c
parent5c044ccdefe633acb102a421446b4fb75931fe8c (diff)
Update exc2signal.c template too
Diffstat (limited to 'hurd/exc2signal.c')
-rw-r--r--hurd/exc2signal.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/hurd/exc2signal.c b/hurd/exc2signal.c
index 5f5c4c0c20..ffcfb6e757 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,3 +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);
+}
+
+void
+_hurd_exception2signal_legacy (struct hurd_signal_detail *detail, int *signo)
+{
+ exception2signal (detail, signo, 0);
+}
+