aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/os-Linux/skas/process.c
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2008-02-05 01:30:56 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-05 12:44:28 -0500
commitee3d9bd4de1ed93d2a7ee41c331ed30a1c7b8acd (patch)
treef49369c9f941066bdb8bbb2b4fd9d40bf2fda292 /arch/um/os-Linux/skas/process.c
parentca77b555c0aafa3070fbb67592abaaa1b8d31913 (diff)
uml: simplify SIGSEGV handling
Simplify the page fault stub by not masking signals while it is running. This allows it to signal that it is done by executing an instruction which will generate a SIGTRAP (int3 on x86) rather than running sigreturn by hand after queueing a blocked SIGUSR1. userspace_tramp now no longer puts anything in the SIGSEGV sa_mask, but it does add SA_NODEFER to sa_flags so that SIGSEGV is still enabled after the signal handler fails to run sigreturn. SIGWINCH is just blocked so that we don't have to deal with it and the signal masks used by wait_stub_done are updated to reflect the smaller number of signals that it has to worry about. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/um/os-Linux/skas/process.c')
-rw-r--r--arch/um/os-Linux/skas/process.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 765cfa6ddbcd..2cc2071112bc 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -55,10 +55,10 @@ static int ptrace_dump_regs(int pid)
55 * Signals that are OK to receive in the stub - we'll just continue it. 55 * Signals that are OK to receive in the stub - we'll just continue it.
56 * SIGWINCH will happen when UML is inside a detached screen. 56 * SIGWINCH will happen when UML is inside a detached screen.
57 */ 57 */
58#define STUB_SIG_MASK ((1 << SIGVTALRM) | (1 << SIGWINCH)) 58#define STUB_SIG_MASK (1 << SIGVTALRM)
59 59
60/* Signals that the stub will finish with - anything else is an error */ 60/* Signals that the stub will finish with - anything else is an error */
61#define STUB_DONE_MASK ((1 << SIGUSR1) | (1 << SIGTRAP)) 61#define STUB_DONE_MASK (1 << SIGTRAP)
62 62
63void wait_stub_done(int pid) 63void wait_stub_done(int pid)
64{ 64{
@@ -179,6 +179,7 @@ static int userspace_tramp(void *stack)
179 ptrace(PTRACE_TRACEME, 0, 0, 0); 179 ptrace(PTRACE_TRACEME, 0, 0, 0);
180 180
181 signal(SIGTERM, SIG_DFL); 181 signal(SIGTERM, SIG_DFL);
182 signal(SIGWINCH, SIG_IGN);
182 err = set_interval(); 183 err = set_interval();
183 if (err) 184 if (err)
184 panic("userspace_tramp - setting timer failed, errno = %d\n", 185 panic("userspace_tramp - setting timer failed, errno = %d\n",
@@ -222,11 +223,7 @@ static int userspace_tramp(void *stack)
222 223
223 set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE); 224 set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE);
224 sigemptyset(&sa.sa_mask); 225 sigemptyset(&sa.sa_mask);
225 sigaddset(&sa.sa_mask, SIGIO); 226 sa.sa_flags = SA_ONSTACK | SA_NODEFER;
226 sigaddset(&sa.sa_mask, SIGWINCH);
227 sigaddset(&sa.sa_mask, SIGVTALRM);
228 sigaddset(&sa.sa_mask, SIGUSR1);
229 sa.sa_flags = SA_ONSTACK;
230 sa.sa_handler = (void *) v; 227 sa.sa_handler = (void *) v;
231 sa.sa_restorer = NULL; 228 sa.sa_restorer = NULL;
232 if (sigaction(SIGSEGV, &sa, NULL) < 0) 229 if (sigaction(SIGSEGV, &sa, NULL) < 0)