Remove conditionals from the way INT3 is handled; since the IDT gate is always set up as an interrupt gate, the restore_interrupts() call should also always be issued, making the conditional code unnecessary. From: Jan Beulich --- 2.6.14/arch/i386/kernel/traps.c 2005-10-28 02:02:08.000000000 +0200 +++ 2.6.14-i386-int3/arch/i386/kernel/traps.c 2005-11-04 17:00:47.000000000 +0100 @@ -447,9 +447,6 @@ fastcall void do_##name(struct pt_regs * } DO_VM86_ERROR_INFO( 0, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->eip) -#ifndef CONFIG_KPROBES -DO_VM86_ERROR( 3, SIGTRAP, "int3", int3) -#endif DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow) DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds) DO_ERROR_INFO( 6, SIGILL, "invalid operand", invalid_op, ILL_ILLOPN, regs->eip) @@ -676,7 +673,6 @@ void unset_nmi_callback(void) } EXPORT_SYMBOL_GPL(unset_nmi_callback); -#ifdef CONFIG_KPROBES fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code) { if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) @@ -687,7 +683,6 @@ fastcall void __kprobes do_int3(struct p restore_interrupts(regs); do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL); } -#endif /* * Our handling of the processor debug registers is non-trivial.