Skip to content

Commit

Permalink
uml: tidy ptrace interface
Browse files Browse the repository at this point in the history
Tidy the ptrace interface code.  Removed a bunch of unused macros.
Started converting register sets from arrays of longs to structures.

Signed-off-by: Jeff Dike <[email protected]>
Cc: WANG Cong <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
cfd-36 authored and torvalds committed May 13, 2008
1 parent 46d7b52 commit 47906dd
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 62 deletions.
30 changes: 1 addition & 29 deletions arch/um/include/sysdep-i386/ptrace_user.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,38 +41,10 @@
#define PT_SP_OFFSET PT_OFFSET(UESP)
#define PT_SP(regs) ((regs)[UESP])

#define FP_SIZE ((HOST_XFP_SIZE > HOST_FP_SIZE) ? HOST_XFP_SIZE : HOST_FP_SIZE)
#define FP_SIZE ((HOST_FPX_SIZE > HOST_FP_SIZE) ? HOST_FPX_SIZE : HOST_FP_SIZE)

#ifndef FRAME_SIZE
#define FRAME_SIZE (17)
#endif
#define FRAME_SIZE_OFFSET (FRAME_SIZE * sizeof(unsigned long))

#define FP_FRAME_SIZE (27)
#define FPX_FRAME_SIZE (128)

#ifdef PTRACE_GETREGS
#define UM_HAVE_GETREGS
#endif

#ifdef PTRACE_SETREGS
#define UM_HAVE_SETREGS
#endif

#ifdef PTRACE_GETFPREGS
#define UM_HAVE_GETFPREGS
#endif

#ifdef PTRACE_SETFPREGS
#define UM_HAVE_SETFPREGS
#endif

#ifdef PTRACE_GETFPXREGS
#define UM_HAVE_GETFPXREGS
#endif

#ifdef PTRACE_SETFPXREGS
#define UM_HAVE_SETFPXREGS
#endif

#endif
17 changes: 4 additions & 13 deletions arch/um/include/sysdep-x86_64/ptrace_user.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,17 @@
#define PT_ORIG_RAX_OFFSET (ORIG_RAX)
#define PT_ORIG_RAX(regs) ((regs)[PT_INDEX(ORIG_RAX)])

/* x86_64 FC3 doesn't define this in /usr/include/linux/ptrace.h even though
/*
* x86_64 FC3 doesn't define this in /usr/include/linux/ptrace.h even though
* it's defined in the kernel's include/linux/ptrace.h. Additionally, use the
* 2.4 name and value for 2.4 host compatibility.
*/
#ifndef PTRACE_OLDSETOPTIONS
#define PTRACE_OLDSETOPTIONS 21
#endif

/* These are before the system call, so the system call number is RAX
/*
* These are before the system call, so the system call number is RAX
* rather than ORIG_RAX, and arg4 is R10 rather than RCX
*/
#define REGS_SYSCALL_NR PT_INDEX(RAX)
Expand All @@ -73,14 +75,3 @@
#define FP_SIZE (HOST_FP_SIZE)

#endif

/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
5 changes: 3 additions & 2 deletions arch/um/os-Linux/sys-i386/registers.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

#include <errno.h>
#include <asm/user.h>
#include "kern_constants.h"
#include "longjmp.h"
#include "user.h"
Expand Down Expand Up @@ -74,10 +75,10 @@ int put_fp_registers(int pid, unsigned long *regs)

void arch_init_registers(int pid)
{
unsigned long fpx_regs[HOST_XFP_SIZE];
struct user_fxsr_struct fpx_regs;
int err;

err = ptrace(PTRACE_GETFPXREGS, pid, 0, fpx_regs);
err = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpx_regs);
if (!err)
return;

Expand Down
30 changes: 14 additions & 16 deletions arch/um/sys-i386/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,14 +148,13 @@ int peek_user(struct task_struct *child, long addr, long data)
int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child)
{
int err, n, cpu = ((struct thread_info *) child->stack)->cpu;
long fpregs[HOST_FP_SIZE];
struct user_i387_struct fpregs;

BUG_ON(sizeof(*buf) != sizeof(fpregs));
err = save_fp_registers(userspace_pid[cpu], fpregs);
err = save_fp_registers(userspace_pid[cpu], (unsigned long *) &fpregs);
if (err)
return err;

n = copy_to_user(buf, fpregs, sizeof(fpregs));
n = copy_to_user(buf, &fpregs, sizeof(fpregs));
if(n > 0)
return -EFAULT;

Expand All @@ -165,27 +164,26 @@ int get_fpregs(struct user_i387_struct __user *buf, struct task_struct *child)
int set_fpregs(struct user_i387_struct __user *buf, struct task_struct *child)
{
int n, cpu = ((struct thread_info *) child->stack)->cpu;
long fpregs[HOST_FP_SIZE];
struct user_i387_struct fpregs;

BUG_ON(sizeof(*buf) != sizeof(fpregs));
n = copy_from_user(fpregs, buf, sizeof(fpregs));
n = copy_from_user(&fpregs, buf, sizeof(fpregs));
if (n > 0)
return -EFAULT;

return restore_fp_registers(userspace_pid[cpu], fpregs);
return restore_fp_registers(userspace_pid[cpu],
(unsigned long *) &fpregs);
}

int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child)
{
int err, n, cpu = ((struct thread_info *) child->stack)->cpu;
long fpregs[HOST_XFP_SIZE];
struct user_fxsr_struct fpregs;

BUG_ON(sizeof(*buf) != sizeof(fpregs));
err = save_fpx_registers(userspace_pid[cpu], fpregs);
err = save_fpx_registers(userspace_pid[cpu], (unsigned long *) &fpregs);
if (err)
return err;

n = copy_to_user(buf, fpregs, sizeof(fpregs));
n = copy_to_user(buf, &fpregs, sizeof(fpregs));
if(n > 0)
return -EFAULT;

Expand All @@ -195,14 +193,14 @@ int get_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child)
int set_fpxregs(struct user_fxsr_struct __user *buf, struct task_struct *child)
{
int n, cpu = ((struct thread_info *) child->stack)->cpu;
long fpregs[HOST_XFP_SIZE];
struct user_fxsr_struct fpregs;

BUG_ON(sizeof(*buf) != sizeof(fpregs));
n = copy_from_user(fpregs, buf, sizeof(fpregs));
n = copy_from_user(&fpregs, buf, sizeof(fpregs));
if (n > 0)
return -EFAULT;

return restore_fpx_registers(userspace_pid[cpu], fpregs);
return restore_fpx_registers(userspace_pid[cpu],
(unsigned long *) &fpregs);
}

long subarch_ptrace(struct task_struct *child, long request, long addr,
Expand Down
2 changes: 1 addition & 1 deletion arch/um/sys-i386/user-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ void foo(void)
OFFSET(HOST_SC_CR2, sigcontext, cr2);

DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct));
DEFINE_LONGS(HOST_XFP_SIZE, sizeof(struct user_fpxregs_struct));
DEFINE_LONGS(HOST_FPX_SIZE, sizeof(struct user_fpxregs_struct));

DEFINE(HOST_IP, EIP);
DEFINE(HOST_SP, UESP);
Expand Down
1 change: 0 additions & 1 deletion arch/um/sys-x86_64/user-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ void foo(void)
OFFSET(HOST_SC_TRAPNO, sigcontext, trapno);

DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
DEFINE(HOST_XFP_SIZE, 0);
DEFINE_LONGS(HOST_RBX, RBX);
DEFINE_LONGS(HOST_RCX, RCX);
DEFINE_LONGS(HOST_RDI, RDI);
Expand Down

0 comments on commit 47906dd

Please sign in to comment.