diff options
Diffstat (limited to 'src/pkg/runtime/freebsd/thread.c')
| -rw-r--r-- | src/pkg/runtime/freebsd/thread.c | 26 | 
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); +} | 
