mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 07:31:41 +00:00
[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:
parent
19bdf0409f
commit
4b84c69b5f
12 changed files with 102 additions and 89 deletions
|
@ -67,13 +67,32 @@ static __init void do_uml_initcalls(void)
|
|||
|
||||
static void last_ditch_exit(int sig)
|
||||
{
|
||||
signal(SIGINT, SIG_DFL);
|
||||
signal(SIGTERM, SIG_DFL);
|
||||
signal(SIGHUP, SIG_DFL);
|
||||
uml_cleanup();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void install_fatal_handler(int sig)
|
||||
{
|
||||
struct sigaction action;
|
||||
|
||||
/* All signals are enabled in this handler ... */
|
||||
sigemptyset(&action.sa_mask);
|
||||
|
||||
/* ... including the signal being handled, plus we want the
|
||||
* handler reset to the default behavior, so that if an exit
|
||||
* handler is hanging for some reason, the UML will just die
|
||||
* after this signal is sent a second time.
|
||||
*/
|
||||
action.sa_flags = SA_RESETHAND | SA_NODEFER;
|
||||
action.sa_restorer = NULL;
|
||||
action.sa_handler = last_ditch_exit;
|
||||
if(sigaction(sig, &action, NULL) < 0){
|
||||
printf("failed to install handler for signal %d - errno = %d\n",
|
||||
errno);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
#define UML_LIB_PATH ":/usr/lib/uml"
|
||||
|
||||
static void setup_env_path(void)
|
||||
|
@ -158,9 +177,12 @@ int main(int argc, char **argv, char **envp)
|
|||
}
|
||||
new_argv[argc] = NULL;
|
||||
|
||||
set_handler(SIGINT, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1);
|
||||
set_handler(SIGTERM, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1);
|
||||
set_handler(SIGHUP, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1);
|
||||
/* Allow these signals to bring down a UML if all other
|
||||
* methods of control fail.
|
||||
*/
|
||||
install_fatal_handler(SIGINT);
|
||||
install_fatal_handler(SIGTERM);
|
||||
install_fatal_handler(SIGHUP);
|
||||
|
||||
scan_elf_aux( envp);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue