diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c index a9541cb..d81f549 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes.c @@ -55,6 +55,7 @@ #include #include +int dbug_kprob_pk; void jprobe_return_end(void); DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; @@ -421,7 +422,9 @@ static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) { clear_btf(); regs->flags |= X86_EFLAGS_TF; - regs->flags &= ~X86_EFLAGS_IF; + + printk(KERN_ERR "prepare_singlestep didn't clear X86_EFLAGS_IF\n"); + /* regs->flags &= ~X86_EFLAGS_IF; */ /* single step inline if the instruction is an int3 */ if (p->opcode == BREAKPOINT_INSTRUCTION) regs->ip = (unsigned long)p->addr; @@ -449,6 +452,7 @@ static void __kprobes setup_singlestep(struct kprobe *p, struct pt_regs *regs, reset_current_kprobe(); regs->ip = (unsigned long)p->ainsn.insn; preempt_enable_no_resched(); + dbug_kprob_pk = 0; return; } #endif @@ -475,6 +479,7 @@ static int __kprobes reenter_kprobe(struct kprobe *p, struct pt_regs *regs, regs->ip = (unsigned long)p->addr; reset_current_kprobe(); preempt_enable_no_resched(); + dbug_kprob_pk = 0; break; #endif case KPROBE_HIT_ACTIVE: @@ -531,6 +536,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) return 1; } + dbug_kprob_pk = 1; /* * We don't want to be preempted for the entire * duration of kprobe processing. We conditionally @@ -539,6 +545,10 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) */ preempt_disable(); + int i; + for (i = 0; i< 100; i++) + udelay(8000); + kcb = get_kprobe_ctlblk(); p = get_kprobe(addr); @@ -571,6 +581,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) } /* else: not a kprobe fault; let the kernel handle it */ preempt_enable_no_resched(); + dbug_kprob_pk = 0; return 0; } @@ -870,6 +881,7 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs) reset_current_kprobe(); out: preempt_enable_no_resched(); + dbug_kprob_pk = 0; /* * if somebody else is singlestepping across a probe point, flags @@ -904,6 +916,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) else reset_current_kprobe(); preempt_enable_no_resched(); + dbug_kprob_pk = 0; break; case KPROBE_HIT_ACTIVE: case KPROBE_HIT_SSDONE: @@ -942,6 +955,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) return 0; } + /* * Wrapper routine for handling exceptions. */ @@ -960,8 +974,10 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, ret = NOTIFY_STOP; break; case DIE_DEBUG: - if (post_kprobe_handler(args->regs)) + if (post_kprobe_handler(args->regs)) { + dbug_kprob_pk = 0; ret = NOTIFY_STOP; + } break; case DIE_GPF: /* diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 18a12c4..e67104c 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c @@ -1204,6 +1204,10 @@ static irqreturn_t e1000_intr(int irq, void *data) struct e1000_hw *hw = &adapter->hw; u32 rctl, icr = er32(ICR); + extern int dbug_kprob_pk; + if (dbug_kprob_pk) + printk(KERN_ERR "Got a e1000 intrrupt during kprobe single step!!!!\n"); + if (!icr) return IRQ_NONE; /* Not our interrupt */