From: Jeff Dike This allows page faults to be delivered when they happen. Without this, it can happen that a page fault will occur when SIGSEGV is disabled, and the host will then just kill UML because it can't invoke the handler. Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/kernel/process.c | 6 +----- 25-akpm/arch/um/kernel/tt/trap_user.c | 7 +++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff -puN arch/um/kernel/process.c~uml-let-page-faults-always-be-delivered-immediately arch/um/kernel/process.c --- 25/arch/um/kernel/process.c~uml-let-page-faults-always-be-delivered-immediately Tue Sep 14 18:29:20 2004 +++ 25-akpm/arch/um/kernel/process.c Tue Sep 14 18:29:20 2004 @@ -57,11 +57,7 @@ void init_new_thread_signals(int altstac { int flags = altstack ? SA_ONSTACK : 0; - /* NODEFER is set here because SEGV isn't turned back on when the - * handler is ready to receive signals. This causes any segfault - * during a copy_user to kill the process because the fault is blocked. - */ - set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags | SA_NODEFER, + set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); diff -puN arch/um/kernel/tt/trap_user.c~uml-let-page-faults-always-be-delivered-immediately arch/um/kernel/tt/trap_user.c --- 25/arch/um/kernel/tt/trap_user.c~uml-let-page-faults-always-be-delivered-immediately Tue Sep 14 18:29:20 2004 +++ 25-akpm/arch/um/kernel/tt/trap_user.c Tue Sep 14 18:29:20 2004 @@ -23,6 +23,13 @@ void sig_handler_common_tt(int sig, void unprotect_kernel_mem(); + /* This is done because to allow SIGSEGV to be delivered inside a SEGV + * handler. This can happen in copy_user, and if SEGV is disabled, + * the process will die. + */ + if(sig == SIGSEGV) + change_sig(SIGSEGV, 1); + r = &TASK_REGS(get_current())->tt; save_regs = *r; is_user = user_context(SC_SP(sc)); _