[PATCH] uml: Move signal handlers to arch code
Have most signals go through an arch-provided handler which recovers the sigcontext and then calls a generic handler. This replaces the ARCH_GET_SIGCONTEXT macro, which was somewhat fragile. On x86_64, recovering %rdx (which holds the sigcontext pointer) must be the first thing that happens. sig_handler duly invokes that first, but there is no guarantee that I can see that instructions won't be reordered such that %rdx is used before that. Having the arch provide the handler seems much more robust. Some signals in some parts of UML require their own handlers - these places don't call set_handler any more. They call sigaction or signal themselves. Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
19bdf0409f
commit
4b84c69b5f
@@ -189,14 +189,25 @@ static int userspace_tramp(void *stack)
|
||||
}
|
||||
}
|
||||
if(!ptrace_faultinfo && (stack != NULL)){
|
||||
struct sigaction sa;
|
||||
|
||||
unsigned long v = UML_CONFIG_STUB_CODE +
|
||||
(unsigned long) stub_segv_handler -
|
||||
(unsigned long) &__syscall_stub_start;
|
||||
|
||||
set_sigstack((void *) UML_CONFIG_STUB_DATA, page_size());
|
||||
set_handler(SIGSEGV, (void *) v, SA_ONSTACK,
|
||||
SIGIO, SIGWINCH, SIGALRM, SIGVTALRM,
|
||||
SIGUSR1, -1);
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sigaddset(&sa.sa_mask, SIGIO);
|
||||
sigaddset(&sa.sa_mask, SIGWINCH);
|
||||
sigaddset(&sa.sa_mask, SIGALRM);
|
||||
sigaddset(&sa.sa_mask, SIGVTALRM);
|
||||
sigaddset(&sa.sa_mask, SIGUSR1);
|
||||
sa.sa_flags = SA_ONSTACK;
|
||||
sa.sa_handler = (void *) v;
|
||||
sa.sa_restorer = NULL;
|
||||
if(sigaction(SIGSEGV, &sa, NULL) < 0)
|
||||
panic("userspace_tramp - setting SIGSEGV handler "
|
||||
"failed - errno = %d\n", errno);
|
||||
}
|
||||
|
||||
os_stop_process(os_getpid());
|
||||
|
Reference in New Issue
Block a user