[PATCH] uml: remove spinlock wrapper functions
[safe/jmp/linux-2.6] / arch / um / kernel / trap_kern.c
index b79f805..02f6d4d 100644 (file)
@@ -26,6 +26,9 @@
 #include "mconsole_kern.h"
 #include "mem.h"
 #include "mem_kern.h"
+#include "sysdep/sigcontext.h"
+#include "sysdep/ptrace.h"
+#include "os.h"
 #ifdef CONFIG_MODE_SKAS
 #include "skas.h"
 #endif
@@ -126,6 +129,17 @@ out_of_memory:
        goto out;
 }
 
+void segv_handler(int sig, union uml_pt_regs *regs)
+{
+       struct faultinfo * fi = UPT_FAULTINFO(regs);
+
+       if(UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)){
+               bad_segv(*fi, UPT_IP(regs));
+               return;
+       }
+       segv(*fi, UPT_IP(regs), UPT_IS_USER(regs), regs);
+}
+
 struct kern_handlers handlinfo_kern = {
        .relay_signal = relay_signal,
        .winch = winch,
@@ -184,7 +198,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc)
                si.si_signo = SIGBUS;
                si.si_errno = 0;
                si.si_code = BUS_ADRERR;
-               si.si_addr = (void *)address;
+               si.si_addr = (void __user *)address;
                 current->thread.arch.faultinfo = fi;
                force_sig_info(SIGBUS, &si, current);
        } else if (err == -ENOMEM) {
@@ -193,7 +207,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc)
        } else {
                BUG_ON(err != -EFAULT);
                si.si_signo = SIGSEGV;
-               si.si_addr = (void *) address;
+               si.si_addr = (void __user *) address;
                 current->thread.arch.faultinfo = fi;
                force_sig_info(SIGSEGV, &si, current);
        }
@@ -206,8 +220,8 @@ void bad_segv(struct faultinfo fi, unsigned long ip)
 
        si.si_signo = SIGSEGV;
        si.si_code = SEGV_ACCERR;
-        si.si_addr = (void *) FAULT_ADDRESS(fi);
-        current->thread.arch.faultinfo = fi;
+       si.si_addr = (void __user *) FAULT_ADDRESS(fi);
+       current->thread.arch.faultinfo = fi;
        force_sig_info(SIGSEGV, &si, current);
 }