Skip to content

Commit

Permalink
x86: x86-64 ia32 ptrace debugreg cleanup
Browse files Browse the repository at this point in the history
This cleans up the ia32 compat ptrace code to use shared code from
native ptrace for the implementation guts of debug register access.

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 962ff38 commit d0f0817
Showing 1 changed file with 8 additions and 55 deletions.
63 changes: 8 additions & 55 deletions arch/x86/ia32/ptrace32.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@

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

switch (regno) {
Expand Down Expand Up @@ -102,43 +101,10 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
break;
}

case offsetof(struct user32, u_debugreg[4]):
case offsetof(struct user32, u_debugreg[5]):
return -EIO;

case offsetof(struct user32, u_debugreg[0]):
child->thread.debugreg0 = val;
break;

case offsetof(struct user32, u_debugreg[1]):
child->thread.debugreg1 = val;
break;

case offsetof(struct user32, u_debugreg[2]):
child->thread.debugreg2 = val;
break;

case offsetof(struct user32, u_debugreg[3]):
child->thread.debugreg3 = val;
break;

case offsetof(struct user32, u_debugreg[6]):
child->thread.debugreg6 = val;
break;

case offsetof(struct user32, u_debugreg[7]):
val &= ~DR_CONTROL_RESERVED;
/* See arch/i386/kernel/ptrace.c for an explanation of
* this awkward check.*/
for (i = 0; i < 4; i++)
if ((0x5454 >> ((val >> (16 + 4*i)) & 0xf)) & 1)
return -EIO;
child->thread.debugreg7 = val;
if (val)
set_tsk_thread_flag(child, TIF_DEBUG);
else
clear_tsk_thread_flag(child, TIF_DEBUG);
break;
case offsetof(struct user32, u_debugreg[0]) ...
offsetof(struct user32, u_debugreg[7]):
regno -= offsetof(struct user32, u_debugreg[0]);
return ptrace_set_debugreg(child, regno / 4, val);

default:
if (regno > sizeof(struct user32) || (regno & 3))
Expand Down Expand Up @@ -199,23 +165,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
*val &= ~X86_EFLAGS_TF;
break;

case offsetof(struct user32, u_debugreg[0]):
*val = child->thread.debugreg0;
break;
case offsetof(struct user32, u_debugreg[1]):
*val = child->thread.debugreg1;
break;
case offsetof(struct user32, u_debugreg[2]):
*val = child->thread.debugreg2;
break;
case offsetof(struct user32, u_debugreg[3]):
*val = child->thread.debugreg3;
break;
case offsetof(struct user32, u_debugreg[6]):
*val = child->thread.debugreg6;
break;
case offsetof(struct user32, u_debugreg[7]):
*val = child->thread.debugreg7;
case offsetof(struct user32, u_debugreg[0]) ...
offsetof(struct user32, u_debugreg[7]):
regno -= offsetof(struct user32, u_debugreg[0]);
*val = ptrace_get_debugreg(child, regno / 4);
break;

default:
Expand Down

0 comments on commit d0f0817

Please sign in to comment.