diff options
Diffstat (limited to 'src/pkg/runtime/os_freebsd.c')
-rw-r--r-- | src/pkg/runtime/os_freebsd.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/pkg/runtime/os_freebsd.c b/src/pkg/runtime/os_freebsd.c index 042097bdd..02b13472c 100644 --- a/src/pkg/runtime/os_freebsd.c +++ b/src/pkg/runtime/os_freebsd.c @@ -50,7 +50,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns) Timespec ts; if(ns < 0) { - ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, nil); + ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT_PRIVATE, val, nil, nil); if(ret >= 0 || ret == -EINTR) return; goto fail; @@ -58,7 +58,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns) // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system. ts.tv_nsec = 0; ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)&ts.tv_nsec); - ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, &ts); + ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT_PRIVATE, val, nil, &ts); if(ret >= 0 || ret == -EINTR) return; @@ -78,7 +78,7 @@ runtime·futexwakeup(uint32 *addr, uint32 cnt) { int32 ret; - ret = runtime·sys_umtx_op(addr, UMTX_OP_WAKE, cnt, nil, nil); + ret = runtime·sys_umtx_op(addr, UMTX_OP_WAKE_PRIVATE, cnt, nil, nil); if(ret >= 0) return; @@ -130,6 +130,7 @@ runtime·osinit(void) void runtime·get_random_data(byte **rnd, int32 *rnd_len) { + #pragma dataflag NOPTR static byte urandom_data[HashRandomBytes]; int32 fd; fd = runtime·open("/dev/urandom", 0 /* O_RDONLY */, 0); @@ -177,9 +178,12 @@ runtime·unminit(void) void runtime·sigpanic(void) { + if(!runtime·canpanic(g)) + runtime·throw("unexpected signal during runtime execution"); + switch(g->sig) { case SIGBUS: - if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000) { + if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000 || g->paniconfault) { if(g->sigpc == 0) runtime·panicstring("call of nil func value"); runtime·panicstring("invalid memory address or nil pointer dereference"); @@ -187,7 +191,7 @@ runtime·sigpanic(void) runtime·printf("unexpected fault address %p\n", g->sigcode1); runtime·throw("fault"); case SIGSEGV: - if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR || g->sigcode0 == SEGV_ACCERR) && g->sigcode1 < 0x1000) { + if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR || g->sigcode0 == SEGV_ACCERR) && g->sigcode1 < 0x1000 || g->paniconfault) { if(g->sigpc == 0) runtime·panicstring("call of nil func value"); runtime·panicstring("invalid memory address or nil pointer dereference"); @@ -288,3 +292,9 @@ runtime·signalstack(byte *p, int32 n) st.ss_flags = SS_DISABLE; runtime·sigaltstack(&st, nil); } + +void +runtime·unblocksignals(void) +{ + runtime·sigprocmask(&sigset_none, nil); +} |