diff options
Diffstat (limited to 'src/pkg/runtime/linux/thread.c')
| -rw-r--r-- | src/pkg/runtime/linux/thread.c | 27 | 
1 files changed, 26 insertions, 1 deletions
| diff --git a/src/pkg/runtime/linux/thread.c b/src/pkg/runtime/linux/thread.c index d6811eb37..a849125f9 100644 --- a/src/pkg/runtime/linux/thread.c +++ b/src/pkg/runtime/linux/thread.c @@ -4,9 +4,10 @@  #include "runtime.h"  #include "defs.h" -#include "signals.h"  #include "os.h" +extern SigTab sigtab[]; +  // Linux futex.  //  //	futexsleep(uint32 *addr, uint32 val) @@ -270,3 +271,27 @@ minit(void)  	m->gsignal = malg(32*1024);	// OS X wants >=8K, Linux >=2K  	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); +} | 
