Ejemplo n.º 1
0
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");
}
Ejemplo n.º 2
0
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);
		}
	}
}
Ejemplo n.º 3
0
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");
}
Ejemplo n.º 4
0
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);
}