Skip to content

Commit

Permalink
x86_64 ia32 ptrace: convert to compat_arch_ptrace
Browse files Browse the repository at this point in the history
Now that there are no more special cases in sys32_ptrace, we
can convert to using the generic compat_sys_ptrace entry point.
The sys32_ptrace function gets simpler and becomes compat_arch_ptrace.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Roland McGrath authored and Ingo Molnar committed Apr 26, 2008
1 parent cdb6990 commit 562b80b
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 60 deletions.
2 changes: 1 addition & 1 deletion arch/x86/ia32/ia32entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ ia32_sys_call_table:
.quad sys_setuid16
.quad sys_getuid16
.quad compat_sys_stime /* stime */ /* 25 */
.quad sys32_ptrace /* ptrace */
.quad compat_sys_ptrace /* ptrace */
.quad sys_alarm
.quad sys_fstat /* (old)fstat */
.quad sys_pause
Expand Down
67 changes: 8 additions & 59 deletions arch/x86/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1207,68 +1207,15 @@ static int genregs32_set(struct task_struct *target,
return ret;
}

asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
compat_ulong_t caddr, compat_ulong_t cdata)
{
struct task_struct *child;
struct pt_regs *childregs;
unsigned long addr = caddr;
unsigned long data = cdata;
void __user *datap = compat_ptr(data);
int ret;
__u32 val;

switch (request) {
case PTRACE_TRACEME:
case PTRACE_ATTACH:
case PTRACE_KILL:
case PTRACE_CONT:
case PTRACE_SINGLESTEP:
case PTRACE_SINGLEBLOCK:
case PTRACE_DETACH:
case PTRACE_SYSCALL:
case PTRACE_OLDSETOPTIONS:
case PTRACE_SETOPTIONS:
case PTRACE_SET_THREAD_AREA:
case PTRACE_GET_THREAD_AREA:
#ifdef X86_BTS
case PTRACE_BTS_CONFIG:
case PTRACE_BTS_STATUS:
case PTRACE_BTS_SIZE:
case PTRACE_BTS_GET:
case PTRACE_BTS_CLEAR:
case PTRACE_BTS_DRAIN:
#endif
return sys_ptrace(request, pid, addr, data);

default:
return -EINVAL;

case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA:
case PTRACE_POKEDATA:
case PTRACE_POKETEXT:
case PTRACE_POKEUSR:
case PTRACE_PEEKUSR:
case PTRACE_GETREGS:
case PTRACE_SETREGS:
case PTRACE_SETFPREGS:
case PTRACE_GETFPREGS:
case PTRACE_SETFPXREGS:
case PTRACE_GETFPXREGS:
case PTRACE_GETEVENTMSG:
case PTRACE_SETSIGINFO:
case PTRACE_GETSIGINFO:
break;
}

child = ptrace_get_task_struct(pid);
if (IS_ERR(child))
return PTR_ERR(child);

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

childregs = task_pt_regs(child);

switch (request) {
case PTRACE_PEEKUSR:
ret = getreg32(child, addr, &val);
Expand Down Expand Up @@ -1315,12 +1262,14 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
sizeof(struct user32_fxsr_struct),
datap);

case PTRACE_GET_THREAD_AREA:
case PTRACE_SET_THREAD_AREA:
return arch_ptrace(child, request, addr, data);

default:
return compat_ptrace_request(child, request, addr, data);
}

out:
put_task_struct(child);
return ret;
}

Expand Down
2 changes: 2 additions & 0 deletions include/asm-x86/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,8 @@ extern int do_get_thread_area(struct task_struct *p, int idx,
extern int do_set_thread_area(struct task_struct *p, int idx,
struct user_desc __user *info, int can_allocate);

#define __ARCH_WANT_COMPAT_SYS_PTRACE

#endif /* __KERNEL__ */

#endif /* !__ASSEMBLY__ */
Expand Down

0 comments on commit 562b80b

Please sign in to comment.