static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) { struct kprobe *cur = kprobe_running(); pr_debug("kprobe_fault_handler: trapnr=%d\n", trapnr); if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) return 1; if (kprobe_status & KPROBE_HIT_SS) { resume_execution(cur, regs); preempt_enable_no_resched(); } return 0; }
/* Interrupts disabled, kprobe_lock held. */ static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr) { if (current_kprobe->fault_handler && current_kprobe->fault_handler(current_kprobe, regs, trapnr)) return 1; if (kprobe_status & KPROBE_HIT_SS) { resume_execution(current_kprobe, regs); regs->msr |= kprobe_saved_msr; unlock_kprobes(); preempt_enable_no_resched(); } return 0; }
static int __kprobes post_kprobe_handler(struct pt_regs *regs) { struct kprobe *cur = kprobe_running(); pr_debug("post_kprobe_handler, cur=%p\n", cur); if (!cur) return 0; if (cur->post_handler) { kprobe_status = KPROBE_HIT_SSDONE; cur->post_handler(cur, regs, 0); } resume_execution(cur, regs); reset_current_kprobe(); preempt_enable_no_resched(); return 1; }
static inline int post_kprobe_handler(struct pt_regs *regs) { if (!kprobe_running()) return 0; if (current_kprobe->post_handler) current_kprobe->post_handler(current_kprobe, regs, 0); resume_execution(current_kprobe, regs); regs->msr |= kprobe_saved_msr; unlock_kprobes(); preempt_enable_no_resched(); /* * if somebody else is singlestepping across a probe point, msr * will have SE set, in which case, continue the remaining processing * of do_debug, as if this is not a probe hit. */ if (regs->msr & MSR_SE) return 0; return 1; }