summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/freebsd/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/freebsd/thread.c')
-rw-r--r--src/pkg/runtime/freebsd/thread.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/pkg/runtime/freebsd/thread.c b/src/pkg/runtime/freebsd/thread.c
index 19c14c5ab..9ee21c592 100644
--- a/src/pkg/runtime/freebsd/thread.c
+++ b/src/pkg/runtime/freebsd/thread.c
@@ -6,6 +6,8 @@
#include "signals.h"
#include "os.h"
+extern SigTab sigtab[];
+
// FreeBSD's umtx_op syscall is effectively the same as Linux's futex, and
// thus the code is largely similar. See linux/thread.c for comments.
@@ -169,3 +171,27 @@ minit(void)
m->gsignal = malg(32*1024);
signalstack(m->gsignal->stackguard, 32*1024);
}
+
+void
+sigpanic(void)
+{
+ switch(g->sig) {
+ case SIGBUS:
+ if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000)
+ panicstring("invalid memory address or nil pointer dereference");
+ break;
+ case SIGSEGV:
+ if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR) && g->sigcode1 < 0x1000)
+ panicstring("invalid memory address or nil pointer dereference");
+ break;
+ case SIGFPE:
+ switch(g->sigcode0) {
+ case FPE_INTDIV:
+ panicstring("integer divide by zero");
+ case FPE_INTOVF:
+ panicstring("integer overflow");
+ }
+ panicstring("floating point error");
+ }
+ panicstring(sigtab[g->sig].name);
+}