Commit d0f08175 authored by Roland McGrath's avatar Roland McGrath Committed by Ingo Molnar

x86: x86-64 ia32 ptrace debugreg cleanup

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: default avatarRoland McGrath <roland@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 962ff380
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
static int putreg32(struct task_struct *child, unsigned regno, u32 val) static int putreg32(struct task_struct *child, unsigned regno, u32 val)
{ {
int i;
__u64 *stack = (__u64 *)task_pt_regs(child); __u64 *stack = (__u64 *)task_pt_regs(child);
switch (regno) { switch (regno) {
...@@ -102,43 +101,10 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val) ...@@ -102,43 +101,10 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
break; break;
} }
case offsetof(struct user32, u_debugreg[4]): case offsetof(struct user32, u_debugreg[0]) ...
case offsetof(struct user32, u_debugreg[5]): offsetof(struct user32, u_debugreg[7]):
return -EIO; regno -= offsetof(struct user32, u_debugreg[0]);
return ptrace_set_debugreg(child, regno / 4, val);
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;
default: default:
if (regno > sizeof(struct user32) || (regno & 3)) if (regno > sizeof(struct user32) || (regno & 3))
...@@ -199,23 +165,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val) ...@@ -199,23 +165,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
*val &= ~X86_EFLAGS_TF; *val &= ~X86_EFLAGS_TF;
break; break;
case offsetof(struct user32, u_debugreg[0]): case offsetof(struct user32, u_debugreg[0]) ...
*val = child->thread.debugreg0; offsetof(struct user32, u_debugreg[7]):
break; regno -= offsetof(struct user32, u_debugreg[0]);
case offsetof(struct user32, u_debugreg[1]): *val = ptrace_get_debugreg(child, regno / 4);
*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;
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment