x86-32 ptrace: use task_pt_regs
authorRoland McGrath <roland@redhat.com>
Wed, 30 Jan 2008 12:30:52 +0000 (13:30 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 30 Jan 2008 12:30:52 +0000 (13:30 +0100)
This cleans up the 32-bit ptrace code to use task_pt_regs instead of its
own redundant code that does the same thing a different way.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/kernel/ptrace_32.c

index bd3668c2421abf31356619c9627ac96baee168c5..a1425e9ad0284a0f304a6dd93a265291963cbe8c 100644 (file)
  */
 #define FLAG_MASK 0x00050dd5
 
-/*
- * Offset of eflags on child stack..
- */
-#define EFL_OFFSET offsetof(struct pt_regs, eflags)
-
-static inline struct pt_regs *get_child_regs(struct task_struct *task)
-{
-       void *stack_top = (void *)task->thread.esp0;
-       return stack_top - sizeof(struct pt_regs);
-}
-
-/*
- * This routine will get a word off of the processes privileged stack.
- * the offset is bytes into the pt_regs structure on the stack.
- * This routine assumes that all the privileged stacks are in our
- * data space.
- */   
-static inline int get_stack_long(struct task_struct *task, int offset)
+static long *pt_regs_access(struct pt_regs *regs, unsigned long regno)
 {
-       unsigned char *stack;
-
-       stack = (unsigned char *)task->thread.esp0 - sizeof(struct pt_regs);
-       stack += offset;
-       return (*((int *)stack));
-}
-
-/*
- * This routine will put a word on the processes privileged stack.
- * the offset is bytes into the pt_regs structure on the stack.
- * This routine assumes that all the privileged stacks are in our
- * data space.
- */
-static inline int put_stack_long(struct task_struct *task, int offset,
-       unsigned long data)
-{
-       unsigned char * stack;
-
-       stack = (unsigned char *)task->thread.esp0 - sizeof(struct pt_regs);
-       stack += offset;
-       *(unsigned long *) stack = data;
-       return 0;
+       BUILD_BUG_ON(offsetof(struct pt_regs, ebx) != 0);
+       if (regno > FS)
+               --regno;
+       return &regs->ebx + regno;
 }
 
 static int putreg(struct task_struct *child,
        unsigned long regno, unsigned long value)
 {
-       switch (regno >> 2) {
+       struct pt_regs *regs = task_pt_regs(child);
+       regno >>= 2;
+       switch (regno) {
                case GS:
                        if (value && (value & 3) != 3)
                                return -EIO;
@@ -113,26 +80,25 @@ static int putreg(struct task_struct *child,
                                clear_tsk_thread_flag(child, TIF_FORCED_TF);
                        else if (test_tsk_thread_flag(child, TIF_FORCED_TF))
                                value |= X86_EFLAGS_TF;
-                       value |= get_stack_long(child, EFL_OFFSET) & ~FLAG_MASK;
+                       value |= regs->eflags & ~FLAG_MASK;
                        break;
        }
-       if (regno > FS*4)
-               regno -= 1*4;
-       put_stack_long(child, regno, value);
+       *pt_regs_access(regs, regno) = value;
        return 0;
 }
 
-static unsigned long getreg(struct task_struct *child,
-       unsigned long regno)
+static unsigned long getreg(struct task_struct *child, unsigned long regno)
 {
+       struct pt_regs *regs = task_pt_regs(child);
        unsigned long retval = ~0UL;
 
-       switch (regno >> 2) {
+       regno >>= 2;
+       switch (regno) {
                case EFL:
                        /*
                         * If the debugger set TF, hide it from the readout.
                         */
-                       retval = get_stack_long(child, EFL_OFFSET);
+                       retval = regs->eflags;
                        if (test_tsk_thread_flag(child, TIF_FORCED_TF))
                                retval &= ~X86_EFLAGS_TF;
                        break;
@@ -147,9 +113,7 @@ static unsigned long getreg(struct task_struct *child,
                        retval = 0xffff;
                        /* fall through */
                default:
-                       if (regno > FS*4)
-                               regno -= 1*4;
-                       retval &= get_stack_long(child, regno);
+                       retval &= *pt_regs_access(regs, regno);
        }
        return retval;
 }