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

Commit 0ac30be4 authored by Roland McGrath's avatar Roland McGrath Committed by Martin Schwidefsky
Browse files

[S390] single-step cleanup

parent ea29ee16
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -86,13 +86,13 @@ FixPerRegisters(struct task_struct *task)
		per_info->control_regs.bits.storage_alt_space_ctl = 0;
}

static void set_single_step(struct task_struct *task)
void user_enable_single_step(struct task_struct *task)
{
	task->thread.per_info.single_step = 1;
	FixPerRegisters(task);
}

static void clear_single_step(struct task_struct *task)
void user_disable_single_step(struct task_struct *task)
{
	task->thread.per_info.single_step = 0;
	FixPerRegisters(task);
@@ -107,7 +107,7 @@ void
ptrace_disable(struct task_struct *child)
{
	/* make sure the single step bit is not set. */
	clear_single_step(child);
	user_disable_single_step(child);
}

#ifndef CONFIG_64BIT
@@ -651,7 +651,7 @@ do_ptrace(struct task_struct *child, long request, long addr, long data)
			clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
		child->exit_code = data;
		/* make sure the single step bit is not set. */
		clear_single_step(child);
		user_disable_single_step(child);
		wake_up_process(child);
		return 0;

@@ -665,7 +665,7 @@ do_ptrace(struct task_struct *child, long request, long addr, long data)
			return 0;
		child->exit_code = SIGKILL;
		/* make sure the single step bit is not set. */
		clear_single_step(child);
		user_disable_single_step(child);
		wake_up_process(child);
		return 0;

@@ -675,10 +675,7 @@ do_ptrace(struct task_struct *child, long request, long addr, long data)
			return -EIO;
		clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
		child->exit_code = data;
		if (data)
			set_tsk_thread_flag(child, TIF_SINGLE_STEP);
		else
			set_single_step(child);
		user_enable_single_step(child);
		/* give it a chance to run. */
		wake_up_process(child);
		return 0;
+13 −7
Original line number Diff line number Diff line
@@ -471,6 +471,7 @@ void do_signal(struct pt_regs *regs)

	if (signr > 0) {
		/* Whee!  Actually deliver the signal.  */
		int ret;
#ifdef CONFIG_COMPAT
		if (test_thread_flag(TIF_31BIT)) {
			extern int handle_signal32(unsigned long sig,
@@ -478,15 +479,12 @@ void do_signal(struct pt_regs *regs)
						   siginfo_t *info,
						   sigset_t *oldset,
						   struct pt_regs *regs);
			if (handle_signal32(
				    signr, &ka, &info, oldset, regs) == 0) {
				if (test_thread_flag(TIF_RESTORE_SIGMASK))
					clear_thread_flag(TIF_RESTORE_SIGMASK);
			}
			return;
			ret = handle_signal32(signr, &ka, &info, oldset, regs);
	        }
		else
#endif
		if (handle_signal(signr, &ka, &info, oldset, regs) == 0) {
			ret = handle_signal(signr, &ka, &info, oldset, regs);
		if (!ret) {
			/*
			 * A signal was successfully delivered; the saved
			 * sigmask will have been stored in the signal frame,
@@ -495,6 +493,14 @@ void do_signal(struct pt_regs *regs)
			 */
			if (test_thread_flag(TIF_RESTORE_SIGMASK))
				clear_thread_flag(TIF_RESTORE_SIGMASK);

			/*
			 * If we would have taken a single-step trap
			 * for a normal instruction, act like we took
			 * one for the handler setup.
			 */
			if (current->thread.per_info.single_step)
				set_thread_flag(TIF_SINGLE_STEP);
		}
		return;
	}
+8 −0
Original line number Diff line number Diff line
@@ -465,6 +465,14 @@ struct user_regs_struct
#ifdef __KERNEL__
#define __ARCH_SYS_PTRACE	1

/*
 * These are defined as per linux/ptrace.h, which see.
 */
#define arch_has_single_step()	(1)
struct task_struct;
extern void user_enable_single_step(struct task_struct *);
extern void user_disable_single_step(struct task_struct *);

#define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
#define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN)
#define regs_return_value(regs)((regs)->gprs[2])