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

Commit a5f833f3 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Linus Torvalds
Browse files

alpha: convert to generic sys_ptrace



This patch converts alpha to the generic sys_ptrace.  We use
force_successful_syscall_return to avoid having to pass the pt_regs pointer
down to the function.  I think the removal of the assemly stub is correct,
but I could only compile-test this patch, so please give it a spin before
commiting :)

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d9ff5f38
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -916,15 +916,6 @@ sys_pipe:
	ret
.end sys_pipe

	.align	4
	.globl	sys_ptrace
	.ent	sys_ptrace
sys_ptrace:
	.prologue 0
	mov	$sp, $20
	jmp	$31, do_sys_ptrace
.end sys_ptrace

	.align	4
	.globl	sys_execve
	.ent	sys_execve
+6 −36
Original line number Diff line number Diff line
@@ -260,38 +260,12 @@ void ptrace_disable(struct task_struct *child)
	ptrace_cancel_bpt(child);
}

asmlinkage long
do_sys_ptrace(long request, long pid, long addr, long data,
	      struct pt_regs *regs)
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
{
	struct task_struct *child;
	unsigned long tmp;
	size_t copied;
	long ret;

	lock_kernel();
	DBG(DBG_MEM, ("request=%ld pid=%ld addr=0x%lx data=0x%lx\n",
		      request, pid, addr, data));
	if (request == PTRACE_TRACEME) {
		ret = ptrace_traceme();
		goto out_notsk;
	}

	child = ptrace_get_task_struct(pid);
	if (IS_ERR(child)) {
		ret = PTR_ERR(child);
		goto out_notsk;
	}

	if (request == PTRACE_ATTACH) {
		ret = ptrace_attach(child);
		goto out;
	}

	ret = ptrace_check_attach(child, request == PTRACE_KILL);
	if (ret < 0)
		goto out;

	switch (request) {
	/* When I and D space are separate, these will need to be fixed.  */
	case PTRACE_PEEKTEXT: /* read word at location addr. */
@@ -301,13 +275,13 @@ do_sys_ptrace(long request, long pid, long addr, long data,
		if (copied != sizeof(tmp))
			break;
		
		regs->r0 = 0;	/* special return: no errors */
		force_successful_syscall_return();
		ret = tmp;
		break;

	/* Read register number ADDR. */
	case PTRACE_PEEKUSR:
		regs->r0 = 0;	/* special return: no errors */
		force_successful_syscall_return();
		ret = get_reg(child, addr);
		DBG(DBG_MEM, ("peek $%ld->%#lx\n", addr, ret));
		break;
@@ -353,7 +327,7 @@ do_sys_ptrace(long request, long pid, long addr, long data,
		/* make sure single-step breakpoint is gone. */
		ptrace_cancel_bpt(child);
		wake_up_process(child);
		goto out;
		break;

	case PTRACE_SINGLESTEP:  /* execute single instruction. */
		ret = -EIO;
@@ -366,16 +340,12 @@ do_sys_ptrace(long request, long pid, long addr, long data,
		wake_up_process(child);
		/* give it a chance to run. */
		ret = 0;
		goto out;
		break;

	default:
		ret = ptrace_request(child, request, addr, data);
		goto out;
		break;
	}
 out:
	put_task_struct(child);
 out_notsk:
	unlock_kernel();
	return ret;
}

+0 −2
Original line number Diff line number Diff line
@@ -68,8 +68,6 @@ struct switch_stack {

#ifdef __KERNEL__

#define __ARCH_SYS_PTRACE	1

#define user_mode(regs) (((regs)->ps & 8) != 0)
#define instruction_pointer(regs) ((regs)->pc)
#define profile_pc(regs) instruction_pointer(regs)