#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>
#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"
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)
.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;