UML - Tidy ptrace interface
Subsystems (2)
PATCH 9/19 UML - Tidy ptrace interface
Tidy the ptrace interface code. Removed a bunch of unused macros. Started converting register sets from arrays of longs to structures.
--- arch/um/include/sysdep-i386/ptrace_user.h | 30 ---------------------------- arch/um/include/sysdep-x86_64/ptrace_user.h | 17 +++------------ arch/um/os-Linux/sys-i386/registers.c | 5 ++-- arch/um/sys-i386/ptrace.c | 30 +++++++++++++--------------- arch/um/sys-i386/user-offsets.c | 2 - arch/um/sys-x86_64/user-offsets.c | 1 6 files changed, 23 insertions(+), 62 deletions(-)
arch/um/include/sysdep-i386/ptrace_user.h +1 -29
@@ -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
arch/um/include/sysdep-x86_64/ptrace_user.h +4 -13
@@ -48,7 +48,8 @@#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. */
@@ -56,7 +57,8 @@#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)
@@ -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: -*/
arch/um/sys-i386/ptrace.c +14 -16
@@ -148,14 +148,13 @@ int peek_user(struct task_struct *child,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 ;
@@ -165,27 +164,26 @@ int get_fpregs(struct user_i387_struct _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 ;
@@ -195,14 +193,14 @@ int get_fpxregs(struct user_fxsr_structint 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,
arch/um/os-Linux/sys-i386/registers.c +3 -2
@@ -5,6 +5,7 @@*/ #include <errno.h> +#include <asm/user.h> #include "kern_constants.h" #include "longjmp.h" #include "user.h"
@@ -74,10 +75,10 @@ int put_fp_registers(int pid, unsigned lvoid 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 ;
arch/um/sys-i386/user-offsets.c +1 -1
@@ -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 );
arch/um/sys-x86_64/user-offsets.c +0 -1
@@ -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 );
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
From: Jeff Dike <[email protected]>
Date: Fri, 25 Apr 2008 13:56:10 -0400
Quoted 2 lines
Tidy the ptrace interface code. Removed a bunch of unused macros. Started converting register sets from arrays of longs to structures.
Could you please explain a bit why do this? I think long arrary is OK.
Thanks.
Cong
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 6 lines · WANG Cong
From: Jeff Dike <[email protected]>
Date: Fri, 25 Apr 2008 13:56:10 -0400Quoted 2 lines
Tidy the ptrace interface code. Removed a bunch of unused macros. Started converting register sets from arrays of longs to structures.
Could you please explain a bit why do this? I think long arrary is OK.
It's wrong on x86_64. There, FRAME_SIZE is 168 -
#define FRAME_SIZE
and SS is the last register defined -
#define SS 160
but there are a number of registers beyond that in the user_regs_struct:
unsigned long ss;
unsigned long fs_base;
unsigned long gs_base;
unsigned long ds;
unsigned long es;
unsigned long fs;
unsigned long gs;The effect of GETREGS into a long[FRAME_SIZE] will be stack corruption.
Jeff
Signature · 11 lines
Work email - jdike at linux dot intel dot com ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ User-mode-linux-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 21 lines · Jeff Dike
Quoted 6 lines · WANG Cong
From: Jeff Dike <[email protected]>
Date: Fri, 25 Apr 2008 13:56:10 -0400Quoted 2 lines
Tidy the ptrace interface code. Removed a bunch of unused macros. Started converting register sets from arrays of longs to structures.
Could you please explain a bit why do this? I think long arrary is OK.
It's wrong on
x86_64. There,FRAME_SIZEis 168 -#define FRAME_SIZE and SS is the last register defined - #define SS 160 but there are a number of registers beyond that in the user_regs_struct: unsigned long ss; unsigned long fs_base; unsigned long gs_base; unsigned long ds; unsigned long es; unsigned long fs; unsigned long gs;
Quoted 2 lines
The effect of GETREGS into a long[FRAME_SIZE] will be stack corruption.
Thanks for teaching this. ;-)
--
Hi, I'm a .signature virus, please copy/paste me to help me spread all over the world.
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel