void runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) { Sigaction sa; // If SIGHUP handler is SIG_IGN, assume running // under nohup and do not set explicit handler. if(i == SIGHUP) { runtime·memclr((byte*)&sa, sizeof sa); if(runtime·rt_sigaction(i, nil, &sa, sizeof(sa.sa_mask)) != 0) runtime·throw("rt_sigaction read failure"); if(sa.sa_handler == SIG_IGN) return; } runtime·memclr((byte*)&sa, sizeof sa); sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; if(restart) sa.sa_flags |= SA_RESTART; sa.sa_mask = ~0ULL; sa.sa_restorer = (void*)runtime·sigreturn; if(fn == runtime·sighandler) fn = (void*)runtime·sigtramp; sa.sa_handler = fn; if(runtime·rt_sigaction(i, &sa, nil, sizeof(sa.sa_mask)) != 0) runtime·throw("rt_sigaction failure"); }
void runtime·initsig(int32 queue) { static Sigaction sa; runtime·siginit(); int32 i; sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; sa.sa_mask = 0xFFFFFFFFFFFFFFFFULL; sa.sa_restorer = (void*)runtime·sigreturn; for(i = 0; i<NSIG; i++) { if(runtime·sigtab[i].flags) { if((runtime·sigtab[i].flags & SigQueue) != queue) continue; if(runtime·sigtab[i].flags & (SigCatch | SigQueue)) sa.sa_handler = (void*)runtime·sigtramp; else sa.sa_handler = (void*)runtime·sigignore; if(runtime·sigtab[i].flags & SigRestart) sa.sa_flags |= SA_RESTART; else sa.sa_flags &= ~SA_RESTART; runtime·rt_sigaction(i, &sa, nil, 8); } } }
void install_tls_segv_handler() { struct k_sigaction sa; struct k_sigaction old_sa; memset(&sa, 0, sizeof(sa)); sa.sa_hand = (__sighandler_t)tls_segv_handler; sa.sa_flags = SA_SIGINFO; syscall_check(rt_sigaction(SIGSEGV, &sa, &old_sa, sizeof(arch_sigset_t)), 0, "set_rt_sigaction"); }
static void sigaction(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) { Sigaction sa; runtime·memclr((byte*)&sa, sizeof sa); sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; if(restart) sa.sa_flags |= SA_RESTART; sa.sa_mask = ~0ULL; sa.sa_restorer = (void*)runtime·sigreturn; if(fn == runtime·sighandler) fn = (void*)runtime·sigtramp; sa.sa_handler = fn; runtime·rt_sigaction(i, &sa, nil, 8); }