diff options
Diffstat (limited to 'arch/s390/kernel/kprobes.c')
-rw-r--r-- | arch/s390/kernel/kprobes.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index 2a3d2bf6f08..d60fc439851 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c | |||
@@ -316,6 +316,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
316 | return 1; | 316 | return 1; |
317 | 317 | ||
318 | ss_probe: | 318 | ss_probe: |
319 | if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO)) | ||
320 | local_irq_disable(); | ||
319 | prepare_singlestep(p, regs); | 321 | prepare_singlestep(p, regs); |
320 | kcb->kprobe_status = KPROBE_HIT_SS; | 322 | kcb->kprobe_status = KPROBE_HIT_SS; |
321 | return 1; | 323 | return 1; |
@@ -463,6 +465,8 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs) | |||
463 | goto out; | 465 | goto out; |
464 | } | 466 | } |
465 | reset_current_kprobe(); | 467 | reset_current_kprobe(); |
468 | if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO)) | ||
469 | local_irq_enable(); | ||
466 | out: | 470 | out: |
467 | preempt_enable_no_resched(); | 471 | preempt_enable_no_resched(); |
468 | 472 | ||
@@ -502,8 +506,11 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | |||
502 | regs->psw.mask |= kcb->kprobe_saved_imask; | 506 | regs->psw.mask |= kcb->kprobe_saved_imask; |
503 | if (kcb->kprobe_status == KPROBE_REENTER) | 507 | if (kcb->kprobe_status == KPROBE_REENTER) |
504 | restore_previous_kprobe(kcb); | 508 | restore_previous_kprobe(kcb); |
505 | else | 509 | else { |
506 | reset_current_kprobe(); | 510 | reset_current_kprobe(); |
511 | if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO)) | ||
512 | local_irq_enable(); | ||
513 | } | ||
507 | preempt_enable_no_resched(); | 514 | preempt_enable_no_resched(); |
508 | break; | 515 | break; |
509 | case KPROBE_HIT_ACTIVE: | 516 | case KPROBE_HIT_ACTIVE: |