|
@@ -559,7 +559,7 @@ reenter_kprobe(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb
|
|
|
* Interrupts are disabled on entry as trap3 is an interrupt gate and they
|
|
|
* remain disabled throughout this function.
|
|
|
*/
|
|
|
-static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|
|
+int __kprobes kprobe_int3_handler(struct pt_regs *regs)
|
|
|
{
|
|
|
kprobe_opcode_t *addr;
|
|
|
struct kprobe *p;
|
|
@@ -857,7 +857,7 @@ no_change:
|
|
|
* Interrupts are disabled on entry as trap1 is an interrupt gate and they
|
|
|
* remain disabled throughout this function.
|
|
|
*/
|
|
|
-static int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
|
|
+int __kprobes kprobe_debug_handler(struct pt_regs *regs)
|
|
|
{
|
|
|
struct kprobe *cur = kprobe_running();
|
|
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
|
@@ -963,22 +963,7 @@ kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *d
|
|
|
if (args->regs && user_mode_vm(args->regs))
|
|
|
return ret;
|
|
|
|
|
|
- switch (val) {
|
|
|
- case DIE_INT3:
|
|
|
- if (kprobe_handler(args->regs))
|
|
|
- ret = NOTIFY_STOP;
|
|
|
- break;
|
|
|
- case DIE_DEBUG:
|
|
|
- if (post_kprobe_handler(args->regs)) {
|
|
|
- /*
|
|
|
- * Reset the BS bit in dr6 (pointed by args->err) to
|
|
|
- * denote completion of processing
|
|
|
- */
|
|
|
- (*(unsigned long *)ERR_PTR(args->err)) &= ~DR_STEP;
|
|
|
- ret = NOTIFY_STOP;
|
|
|
- }
|
|
|
- break;
|
|
|
- case DIE_GPF:
|
|
|
+ if (val == DIE_GPF) {
|
|
|
/*
|
|
|
* To be potentially processing a kprobe fault and to
|
|
|
* trust the result from kprobe_running(), we have
|
|
@@ -987,9 +972,6 @@ kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *d
|
|
|
if (!preemptible() && kprobe_running() &&
|
|
|
kprobe_fault_handler(args->regs, args->trapnr))
|
|
|
ret = NOTIFY_STOP;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
}
|
|
|
return ret;
|
|
|
}
|