Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ec27080 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Martin Schwidefsky
Browse files

[S390] fix kprobes single stepping



Fix kprobes after git commit 1e54622e
broke it. The kprobe_handler is now called with interrupts in the state
at the time of the breakpoint. The single step of the replaced instruction
is done with interrupts off which makes it necessary to enable and disable
the interupts in the kprobes code.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent f2166bb1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -557,6 +557,7 @@ pgm_svcper:
# per was called from kernel, must be kprobes
#
kernel_per:
	REENABLE_IRQS
	mvi	SP_SVCNR(%r15),0xff	# set trap indication to pgm check
	mvi	SP_SVCNR+1(%r15),0xff
	la	%r2,SP_PTREGS(%r15)	# address of register-save area
+1 −0
Original line number Diff line number Diff line
@@ -568,6 +568,7 @@ pgm_svcper:
# per was called from kernel, must be kprobes
#
kernel_per:
	REENABLE_IRQS
	xc	SP_SVCNR(2,%r15),SP_SVCNR(%r15)	# clear svc number
	la	%r2,SP_PTREGS(%r15)	# address of register-save area
	brasl	%r14,do_single_step
+8 −1
Original line number Diff line number Diff line
@@ -316,6 +316,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
		return 1;

ss_probe:
	if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO))
		local_irq_disable();
	prepare_singlestep(p, regs);
	kcb->kprobe_status = KPROBE_HIT_SS;
	return 1;
@@ -463,6 +465,8 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs)
		goto out;
	}
	reset_current_kprobe();
	if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO))
		local_irq_enable();
out:
	preempt_enable_no_resched();

@@ -502,8 +506,11 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
		regs->psw.mask |= kcb->kprobe_saved_imask;
		if (kcb->kprobe_status == KPROBE_REENTER)
			restore_previous_kprobe(kcb);
		else
		else {
			reset_current_kprobe();
			if (regs->psw.mask & (PSW_MASK_PER | PSW_MASK_IO))
				local_irq_enable();
		}
		preempt_enable_no_resched();
		break;
	case KPROBE_HIT_ACTIVE: