summary refs log tree commit diff
path: root/arch/x86/ia32
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-01-30 13:30:52 +0100
committerIngo Molnar <mingo@elte.hu>2008-01-30 13:30:52 +0100
commitd0f081758260e9221729cabbc3aba63d89b8c8d4 (patch)
tree2dad42c69f33a875f984cf7397e6a9385c5f6c46 /arch/x86/ia32
parent962ff3804d31a4d090bbcbd3d06a4b63e3a5b5fd (diff)
downloadlinux-d0f081758260e9221729cabbc3aba63d89b8c8d4.tar.gz
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: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/ia32')
-rw-r--r--arch/x86/ia32/ptrace32.c63
1 files changed, 8 insertions, 55 deletions
diff --git a/arch/x86/ia32/ptrace32.c b/arch/x86/ia32/ptrace32.c
index 5dee33417313..5ababea1307a 100644
--- a/arch/x86/ia32/ptrace32.c
+++ b/arch/x86/ia32/ptrace32.c
@@ -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) {
@@ -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))
@@ -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: