Hello, I'm not totally sure that GLibc's setcontext is safe to use in a signal handler. So, I decided I was going to play things safe and let rt_sigreturn switch stacks for me instead. However, rt_sigreturn seems to reject my substitute stack frame as invalid and I'm not sure why.
Thank you, Steven Stewart-Gallus The code: #include <stdio.h> #include <signal.h> #include <ucontext.h> #include <unistd.h> static ucontext_t alternate_context; static char alternate_context_stack[SIGSTKSZ]; static char signal_stack[SIGSTKSZ]; static void alternate_context_func(void) { puts("alternate context!"); } static void switch_stack(int signo, siginfo_t *infop, void *untyped_ucontextp) { ucontext_t * ucontextp = untyped_ucontextp; /* I'm not sure if setcontext is async-signal-safe so set the * context using the return from the signal handler. */ *ucontextp = alternate_context; #ifdef __linux__ ucontextp->uc_mcontext.fpregs = &ucontextp->__fpregs_mem; #endif } int main(void) { { stack_t stack = { 0 }; stack.ss_sp = signal_stack; stack.ss_size = sizeof signal_stack; sigaltstack(&stack, NULL); } getcontext(&alternate_context); alternate_context.uc_stack.ss_sp = alternate_context_stack; alternate_context.uc_stack.ss_size = sizeof alternate_context_stack; makecontext(&alternate_context, (void (*)(void))alternate_context_func, 0U); { struct sigaction action = { 0 }; action.sa_sigaction = switch_stack; action.sa_flags = SA_SIGINFO; sigfillset(&action.sa_mask); sigaction(SIGRTMIN, &action, NULL); } raise(SIGRTMIN); } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/