This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / arch / um / kernel / trap_user.c
index f825a6e..d12eac6 100644 (file)
@@ -8,6 +8,7 @@
 #include <setjmp.h>
 #include <signal.h>
 #include <sys/time.h>
+#include <sys/ptrace.h>
 #include <sys/wait.h>
 #include <asm/page.h>
 #include <asm/unistd.h>
@@ -17,6 +18,7 @@
 #include "sigcontext.h"
 #include "sysdep/sigcontext.h"
 #include "irq_user.h"
+#include "frame_user.h"
 #include "signal_user.h"
 #include "time_user.h"
 #include "task.h"
@@ -54,22 +56,23 @@ struct {
 void segv_handler(int sig, union uml_pt_regs *regs)
 {
        int index, max;
-        struct faultinfo * fi = UPT_FAULTINFO(regs);
 
-        if(UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)){
-                bad_segv(*fi, UPT_IP(regs));
+       if(UPT_IS_USER(regs) && !UPT_SEGV_IS_FIXABLE(regs)){
+               bad_segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), 
+                        UPT_FAULT_WRITE(regs));
                return;
        }
        max = sizeof(segfault_record)/sizeof(segfault_record[0]);
        index = next_trap_index(max);
 
        nsegfaults++;
-        segfault_record[index].address = FAULT_ADDRESS(*fi);
+       segfault_record[index].address = UPT_FAULT_ADDR(regs);
        segfault_record[index].pid = os_getpid();
-        segfault_record[index].is_write = FAULT_WRITE(*fi);
+       segfault_record[index].is_write = UPT_FAULT_WRITE(regs);
        segfault_record[index].sp = UPT_SP(regs);
        segfault_record[index].is_user = UPT_IS_USER(regs);
-        segv(*fi, UPT_IP(regs), UPT_IS_USER(regs), regs);
+       segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), UPT_FAULT_WRITE(regs),
+            UPT_IS_USER(regs), regs);
 }
 
 void usr2_handler(int sig, union uml_pt_regs *regs)
@@ -100,6 +103,28 @@ struct signal_info sig_info[] = {
                      .is_irq           = 0 },
 };
 
+void sig_handler(int sig, struct sigcontext sc)
+{
+       CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas,
+                        sig, &sc);
+}
+
+extern int timer_irq_inited;
+
+void alarm_handler(int sig, struct sigcontext sc)
+{
+       if(!timer_irq_inited) return;
+
+       if(sig == SIGALRM)
+               switch_timers(0);
+
+       CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas,
+                        sig, &sc);
+
+       if(sig == SIGALRM)
+               switch_timers(1);
+}
+
 void do_longjmp(void *b, int val)
 {
        sigjmp_buf *buf = b;