Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[pandora-kernel.git] / arch / um / os-Linux / process.c
index 3505f44..ff20362 100644 (file)
@@ -7,7 +7,6 @@
 #include <stdio.h>
 #include <errno.h>
 #include <signal.h>
-#include <setjmp.h>
 #include <linux/unistd.h>
 #include <sys/mman.h>
 #include <sys/wait.h>
@@ -206,29 +205,36 @@ int os_drop_memory(void *addr, int length)
 int can_drop_memory(void)
 {
        void *addr;
-       int fd;
+       int fd, ok = 0;
 
        printk("Checking host MADV_REMOVE support...");
        fd = create_mem_file(UM_KERN_PAGE_SIZE);
        if(fd < 0){
                printk("Creating test memory file failed, err = %d\n", -fd);
-               return 0;
+               goto out;
        }
 
        addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE,
                      MAP_SHARED, fd, 0);
        if(addr == MAP_FAILED){
                printk("Mapping test memory file failed, err = %d\n", -errno);
-               return 0;
+               goto out_close;
        }
 
        if(madvise(addr, UM_KERN_PAGE_SIZE, MADV_REMOVE) != 0){
                printk("MADV_REMOVE failed, err = %d\n", -errno);
-               return 0;
+               goto out_unmap;
        }
 
        printk("OK\n");
-       return 1;
+       ok = 1;
+
+out_unmap:
+       munmap(addr, UM_KERN_PAGE_SIZE);
+out_close:
+       close(fd);
+out:
+       return ok;
 }
 
 void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int))
@@ -240,39 +246,48 @@ void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int))
                set_sigstack(sig_stack, pages * page_size());
                flags = SA_ONSTACK;
        }
-       if(usr1_handler) set_handler(SIGUSR1, usr1_handler, flags, -1);
+       if(usr1_handler){
+               struct sigaction sa;
+
+               sa.sa_handler = usr1_handler;
+               sigemptyset(&sa.sa_mask);
+               sa.sa_flags = flags;
+               sa.sa_restorer = NULL;
+               if(sigaction(SIGUSR1, &sa, NULL) < 0)
+                       panic("init_new_thread_stack - sigaction failed - "
+                             "errno = %d\n", errno);
+       }
 }
 
-void init_new_thread_signals(int altstack)
+void init_new_thread_signals(void)
 {
-       int flags = altstack ? SA_ONSTACK : 0;
-
-       set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags,
+       set_handler(SIGSEGV, (__sighandler_t) sig_handler, SA_ONSTACK,
                    SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
-       set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags,
+       set_handler(SIGTRAP, (__sighandler_t) sig_handler, SA_ONSTACK,
                    SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
-       set_handler(SIGFPE, (__sighandler_t) sig_handler, flags,
+       set_handler(SIGFPE, (__sighandler_t) sig_handler, SA_ONSTACK,
                    SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
-       set_handler(SIGILL, (__sighandler_t) sig_handler, flags,
+       set_handler(SIGILL, (__sighandler_t) sig_handler, SA_ONSTACK,
                    SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
-       set_handler(SIGBUS, (__sighandler_t) sig_handler, flags,
+       set_handler(SIGBUS, (__sighandler_t) sig_handler, SA_ONSTACK,
                    SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
        set_handler(SIGUSR2, (__sighandler_t) sig_handler,
-                   flags, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1);
+                   SA_ONSTACK, SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM,
+                   -1);
        signal(SIGHUP, SIG_IGN);
 
-       init_irq_signals(altstack);
+       init_irq_signals(1);
 }
 
 int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr)
 {
        jmp_buf buf;
-       int n, enable;
+       int n;
 
        *jmp_ptr = &buf;
-       n = UML_SETJMP(&buf, enable);
+       n = UML_SETJMP(&buf);
        if(n != 0)
-               return(n);
+               return n;
        (*fn)(arg);
-       return(0);
+       return 0;
 }