diff options
Diffstat (limited to 'arch/ia64/kernel/kprobes.c')
| -rw-r--r-- | arch/ia64/kernel/kprobes.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 96736a119c91..801eeaeaf3de 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
| @@ -347,7 +347,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 347 | ((struct fnptr *)kretprobe_trampoline)->ip; | 347 | ((struct fnptr *)kretprobe_trampoline)->ip; |
| 348 | 348 | ||
| 349 | spin_lock_irqsave(&kretprobe_lock, flags); | 349 | spin_lock_irqsave(&kretprobe_lock, flags); |
| 350 | head = kretprobe_inst_table_head(current); | 350 | head = kretprobe_inst_table_head(current); |
| 351 | 351 | ||
| 352 | /* | 352 | /* |
| 353 | * It is possible to have multiple instances associated with a given | 353 | * It is possible to have multiple instances associated with a given |
| @@ -363,9 +363,9 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 363 | * kretprobe_trampoline | 363 | * kretprobe_trampoline |
| 364 | */ | 364 | */ |
| 365 | hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { | 365 | hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { |
| 366 | if (ri->task != current) | 366 | if (ri->task != current) |
| 367 | /* another task is sharing our hash bucket */ | 367 | /* another task is sharing our hash bucket */ |
| 368 | continue; | 368 | continue; |
| 369 | 369 | ||
| 370 | if (ri->rp && ri->rp->handler) | 370 | if (ri->rp && ri->rp->handler) |
| 371 | ri->rp->handler(ri, regs); | 371 | ri->rp->handler(ri, regs); |
| @@ -394,7 +394,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 394 | * kprobe_handler() that we don't want the post_handler | 394 | * kprobe_handler() that we don't want the post_handler |
| 395 | * to run (and have re-enabled preemption) | 395 | * to run (and have re-enabled preemption) |
| 396 | */ | 396 | */ |
| 397 | return 1; | 397 | return 1; |
| 398 | } | 398 | } |
| 399 | 399 | ||
| 400 | /* Called with kretprobe_lock held */ | 400 | /* Called with kretprobe_lock held */ |
| @@ -739,12 +739,16 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
| 739 | 739 | ||
| 740 | switch(val) { | 740 | switch(val) { |
| 741 | case DIE_BREAK: | 741 | case DIE_BREAK: |
| 742 | if (pre_kprobes_handler(args)) | 742 | /* err is break number from ia64_bad_break() */ |
| 743 | ret = NOTIFY_STOP; | 743 | if (args->err == 0x80200 || args->err == 0x80300) |
| 744 | if (pre_kprobes_handler(args)) | ||
| 745 | ret = NOTIFY_STOP; | ||
| 744 | break; | 746 | break; |
| 745 | case DIE_SS: | 747 | case DIE_FAULT: |
| 746 | if (post_kprobes_handler(args->regs)) | 748 | /* err is vector number from ia64_fault() */ |
| 747 | ret = NOTIFY_STOP; | 749 | if (args->err == 36) |
| 750 | if (post_kprobes_handler(args->regs)) | ||
| 751 | ret = NOTIFY_STOP; | ||
| 748 | break; | 752 | break; |
| 749 | case DIE_PAGE_FAULT: | 753 | case DIE_PAGE_FAULT: |
| 750 | /* kprobe_running() needs smp_processor_id() */ | 754 | /* kprobe_running() needs smp_processor_id() */ |
