Merge branch 'master' into upstream
[sfrench/cifs-2.6.git] / arch / um / os-Linux / skas / process.c
index bd89c6b99d5dcf6d58b55eefe68fb280331bea61..42e3d1ed802cadf01a6f06345daf8ecc327f05d5 100644 (file)
@@ -8,7 +8,6 @@
 #include <unistd.h>
 #include <errno.h>
 #include <signal.h>
-#include <setjmp.h>
 #include <sched.h>
 #include "ptrace_user.h"
 #include <sys/wait.h>
@@ -156,11 +155,15 @@ extern int __syscall_stub_start;
 static int userspace_tramp(void *stack)
 {
        void *addr;
+       int err;
 
        ptrace(PTRACE_TRACEME, 0, 0, 0);
 
-       init_new_thread_signals(1);
-       enable_timer();
+       init_new_thread_signals();
+       err = set_interval(1);
+       if(err)
+               panic("userspace_tramp - setting timer failed, errno = %d\n",
+                     err);
 
        if(!proc_mm){
                /* This has a pte, but it can't be mapped in with the usual
@@ -190,14 +193,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());
@@ -435,7 +449,6 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
 {
        unsigned long flags;
        jmp_buf switch_buf, fork_buf;
-       int enable;
 
        *switch_buf_ptr = &switch_buf;
        *fork_buf_ptr = &fork_buf;
@@ -450,7 +463,7 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
         */
        flags = get_signals();
        block_signals();
-       if(UML_SETJMP(&fork_buf, enable) == 0)
+       if(UML_SETJMP(&fork_buf) == 0)
                new_thread_proc(stack, handler);
 
        remove_sigstack();
@@ -467,21 +480,19 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr,
 void thread_wait(void *sw, void *fb)
 {
        jmp_buf buf, **switch_buf = sw, *fork_buf;
-       int enable;
 
        *switch_buf = &buf;
        fork_buf = fb;
-       if(UML_SETJMP(&buf, enable) == 0)
-               siglongjmp(*fork_buf, INIT_JMP_REMOVE_SIGSTACK);
+       if(UML_SETJMP(&buf) == 0)
+               UML_LONGJMP(fork_buf, INIT_JMP_REMOVE_SIGSTACK);
 }
 
 void switch_threads(void *me, void *next)
 {
        jmp_buf my_buf, **me_ptr = me, *next_buf = next;
-       int enable;
 
        *me_ptr = &my_buf;
-       if(UML_SETJMP(&my_buf, enable) == 0)
+       if(UML_SETJMP(&my_buf) == 0)
                UML_LONGJMP(next_buf, 1);
 }
 
@@ -495,14 +506,14 @@ static jmp_buf *cb_back;
 int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr)
 {
        jmp_buf **switch_buf = switch_buf_ptr;
-       int n, enable;
+       int n;
 
        set_handler(SIGWINCH, (__sighandler_t) sig_handler,
                    SA_ONSTACK | SA_RESTART, SIGUSR1, SIGIO, SIGALRM,
                    SIGVTALRM, -1);
 
        *fork_buf_ptr = &initial_jmpbuf;
-       n = UML_SETJMP(&initial_jmpbuf, enable);
+       n = UML_SETJMP(&initial_jmpbuf);
        switch(n){
        case INIT_JMP_NEW_THREAD:
                new_thread_proc((void *) stack, new_thread_handler);
@@ -529,14 +540,13 @@ int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr)
 void initial_thread_cb_skas(void (*proc)(void *), void *arg)
 {
        jmp_buf here;
-       int enable;
 
        cb_proc = proc;
        cb_arg = arg;
        cb_back = &here;
 
        block_signals();
-       if(UML_SETJMP(&here, enable) == 0)
+       if(UML_SETJMP(&here) == 0)
                UML_LONGJMP(&initial_jmpbuf, INIT_JMP_CALLBACK);
        unblock_signals();