|
@@ -40,35 +40,14 @@ void kill_child_dead(int pid)
|
|
} while(1);
|
|
} while(1);
|
|
}
|
|
}
|
|
|
|
|
|
-/* Unlocked - don't care if this is a bit off */
|
|
|
|
-int nsegfaults = 0;
|
|
|
|
-
|
|
|
|
-struct {
|
|
|
|
- unsigned long address;
|
|
|
|
- int is_write;
|
|
|
|
- int pid;
|
|
|
|
- unsigned long sp;
|
|
|
|
- int is_user;
|
|
|
|
-} segfault_record[1024];
|
|
|
|
-
|
|
|
|
void segv_handler(int sig, union uml_pt_regs *regs)
|
|
void segv_handler(int sig, union uml_pt_regs *regs)
|
|
{
|
|
{
|
|
- int index, max;
|
|
|
|
struct faultinfo * fi = UPT_FAULTINFO(regs);
|
|
struct faultinfo * fi = UPT_FAULTINFO(regs);
|
|
|
|
|
|
if(UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)){
|
|
if(UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)){
|
|
bad_segv(*fi, UPT_IP(regs));
|
|
bad_segv(*fi, UPT_IP(regs));
|
|
return;
|
|
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].pid = os_getpid();
|
|
|
|
- segfault_record[index].is_write = FAULT_WRITE(*fi);
|
|
|
|
- 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(*fi, UPT_IP(regs), UPT_IS_USER(regs), regs);
|
|
}
|
|
}
|
|
|
|
|