Skip to content

Commit

Permalink
x86: x86-64 ia32 ptrace pt_regs cleanup
Browse files Browse the repository at this point in the history
This cleans up the getreg32/putreg32 functions to use struct pt_regs in a
straightforward fashion, instead of equivalent ugly pointer arithmetic.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Roland McGrath authored and Ingo Molnar committed Jan 30, 2008
1 parent 35d0991 commit ff14c61
Showing 1 changed file with 9 additions and 12 deletions.
21 changes: 9 additions & 12 deletions arch/x86/ia32/ptrace32.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@

#define R32(l,q) \
case offsetof(struct user32, regs.l): \
stack[offsetof(struct pt_regs, q) / 8] = val; break
regs->q = val; break;

static int putreg32(struct task_struct *child, unsigned regno, u32 val)
{
__u64 *stack = (__u64 *)task_pt_regs(child);
struct pt_regs *regs = task_pt_regs(child);

switch (regno) {
case offsetof(struct user32, regs.fs):
Expand All @@ -65,12 +65,12 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
case offsetof(struct user32, regs.ss):
if ((val & 3) != 3)
return -EIO;
stack[offsetof(struct pt_regs, ss)/8] = val & 0xffff;
regs->ss = val & 0xffff;
break;
case offsetof(struct user32, regs.cs):
if ((val & 3) != 3)
return -EIO;
stack[offsetof(struct pt_regs, cs)/8] = val & 0xffff;
regs->cs = val & 0xffff;
break;

R32(ebx, bx);
Expand All @@ -84,9 +84,7 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
R32(eip, ip);
R32(esp, sp);

case offsetof(struct user32, regs.eflags): {
__u64 *flags = &stack[offsetof(struct pt_regs, flags)/8];

case offsetof(struct user32, regs.eflags):
val &= FLAG_MASK;
/*
* If the user value contains TF, mark that
Expand All @@ -97,9 +95,8 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
clear_tsk_thread_flag(child, TIF_FORCED_TF);
else if (test_tsk_thread_flag(child, TIF_FORCED_TF))
val |= X86_EFLAGS_TF;
*flags = val | (*flags & ~FLAG_MASK);
regs->flags = val | (regs->flags & ~FLAG_MASK);
break;
}

case offsetof(struct user32, u_debugreg[0]) ...
offsetof(struct user32, u_debugreg[7]):
Expand All @@ -123,11 +120,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)

#define R32(l,q) \
case offsetof(struct user32, regs.l): \
*val = stack[offsetof(struct pt_regs, q)/8]; break
*val = regs->q; break

static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
{
__u64 *stack = (__u64 *)task_pt_regs(child);
struct pt_regs *regs = task_pt_regs(child);

switch (regno) {
case offsetof(struct user32, regs.fs):
Expand Down Expand Up @@ -160,7 +157,7 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
/*
* If the debugger set TF, hide it from the readout.
*/
*val = stack[offsetof(struct pt_regs, flags)/8];
*val = regs->flags;
if (test_tsk_thread_flag(child, TIF_FORCED_TF))
*val &= ~X86_EFLAGS_TF;
break;
Expand Down

0 comments on commit ff14c61

Please sign in to comment.