diff -Naur -X exclude-files ac_cur/arch/um/include/kern_util.h ac/arch/um/include/kern_util.h --- ac_cur/arch/um/include/kern_util.h Sun Jun 3 18:18:11 2001 +++ ac/arch/um/include/kern_util.h Sun Jun 3 18:27:58 2001 @@ -115,6 +115,7 @@ extern int attach_debugger(int idle_pid, int pid); extern void *round_up(unsigned long addr); extern void *round_down(unsigned long addr); +extern void bad_segv(unsigned long address, unsigned long ip, int is_write); #endif /* diff -Naur -X exclude-files ac_cur/arch/um/include/sysdep-i386/sigcontext.h ac/arch/um/include/sysdep-i386/sigcontext.h --- ac_cur/arch/um/include/sysdep-i386/sigcontext.h Sun Jun 3 18:18:11 2001 +++ ac/arch/um/include/sysdep-i386/sigcontext.h Sun Jun 3 18:32:04 2001 @@ -11,6 +11,7 @@ #define SC_FAULT_WRITE(sc) (((sc)->err) & 2) #define SC_IP(sc) ((sc)->eip) #define SC_SP(sc) ((sc)->esp_at_signal) +#define SEGV_IS_FIXABLE(sc) ((sc)->trapno == 14) #endif diff -Naur -X exclude-files ac_cur/arch/um/include/sysdep-ppc/sigcontext.h ac/arch/um/include/sysdep-ppc/sigcontext.h --- ac_cur/arch/um/include/sysdep-ppc/sigcontext.h Sun Jun 3 18:18:11 2001 +++ ac/arch/um/include/sysdep-ppc/sigcontext.h Sun Jun 3 18:28:09 2001 @@ -33,6 +33,7 @@ #define SC_IP(sc) ((sc)->regs->nip) #define SC_SP(sc) ((sc)->regs->gpr[1]) +#define SEGV_IS_FIXABLE(sc) (1) #endif diff -Naur -X exclude-files ac_cur/arch/um/kernel/trap_kern.c ac/arch/um/kernel/trap_kern.c --- ac_cur/arch/um/kernel/trap_kern.c Sun Jun 3 18:18:11 2001 +++ ac/arch/um/kernel/trap_kern.c Sun Jun 3 18:31:21 2001 @@ -99,6 +99,20 @@ return(0); } +void bad_segv(unsigned long address, unsigned long ip, int is_write) +{ + struct siginfo si; + + printk(KERN_ERR "Unfixable SEGV in '%s' (pid %d) at 0x%lx " + "(ip 0x%lx)\n", current->comm, current->pid, address, ip); + si.si_signo = SIGSEGV; + si.si_code = SEGV_ACCERR; + si.si_addr = (void *) address; + current->thread.cr2 = address; + current->thread.err = is_write; + force_sig_info(SIGSEGV, &si, current); +} + void relay_signal(int sig, void *sc, int usermode) { force_sig(sig, current); diff -Naur -X exclude-files ac_cur/arch/um/kernel/trap_user.c ac/arch/um/kernel/trap_user.c --- ac_cur/arch/um/kernel/trap_user.c Sun Jun 3 18:18:11 2001 +++ ac/arch/um/kernel/trap_user.c Sun Jun 3 18:29:15 2001 @@ -280,6 +280,11 @@ struct sigcontext_struct *context = sc; int index; + if(!SEGV_IS_FIXABLE(context)){ + bad_segv(SC_FAULT_ADDR(context), SC_IP(context), + SC_FAULT_WRITE(context)); + return; + } lock_trap(); index = segfault_index++; if(segfault_index == 1024) segfault_index = 0;