--- linux-2.6.10-rc1/arch/i386/kernel/traps.c 2004-11-09 12:59:20.000000000 +0300 +++ linux-2.6.10-rc1-kprb/linux/arch/i386/kernel/traps.c 2004-11-09 13:35:18.625427704 +0300 @@ -408,7 +408,8 @@ #define DO_ERROR(trapnr, signr, str, name) \ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ { \ - if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ + if (!(regs->eflags & VM_MASK) && \ + notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ return; \ do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \ @@ -422,7 +423,8 @@ info.si_errno = 0; \ info.si_code = sicode; \ info.si_addr = (void __user *)siaddr; \ - if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ + if (!(regs->eflags & VM_MASK) && \ + notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ return; \ do_trap(trapnr, signr, str, 0, regs, error_code, &info); \ @@ -431,7 +433,8 @@ #define DO_VM86_ERROR(trapnr, signr, str, name) \ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ { \ - if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ + if (!(regs->eflags & VM_MASK) && \ + notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ return; \ do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \ @@ -445,7 +448,8 @@ info.si_errno = 0; \ info.si_code = sicode; \ info.si_addr = (void __user *)siaddr; \ - if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ + if (!(regs->eflags & VM_MASK) && \ + notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ return; \ do_trap(trapnr, signr, str, 1, regs, error_code, &info); \ @@ -652,7 +656,8 @@ #ifdef CONFIG_KPROBES asmlinkage int do_int3(struct pt_regs *regs, long error_code) { - if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) + if (!(regs->eflags & VM_MASK) && + notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) return 1; /* This is an interrupt gate, because kprobes wants interrupts @@ -693,7 +698,8 @@ __asm__ __volatile__("movl %%db6,%0" : "=r" (condition)); - if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, + if (!(regs->eflags & VM_MASK) && + notify_die(DIE_DEBUG, "debug", regs, condition, error_code, SIGTRAP) == NOTIFY_STOP) return; /* It's safe to allow irq's after DR6 has been saved */