From: Andi Kleen <ak@muc.de>

The EFLAGS checking was not correct.  This also fixes some problems with
32bit gdb who would sometimes make the kernel BUG.



---

 arch/x86_64/ia32/ptrace32.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff -puN arch/x86_64/ia32/ptrace32.c~x86_64-ptrace-fix arch/x86_64/ia32/ptrace32.c
--- 25/arch/x86_64/ia32/ptrace32.c~x86_64-ptrace-fix	2004-01-17 15:23:49.000000000 -0800
+++ 25-akpm/arch/x86_64/ia32/ptrace32.c	2004-01-17 15:23:49.000000000 -0800
@@ -26,6 +26,10 @@
 #include <linux/ptrace.h>
 #include <linux/mm.h>
 
+/* determines which flags the user has access to. */
+/* 1 = access 0 = no access */
+#define FLAG_MASK 0x44dd5UL
+
 #define R32(l,q) \
 	case offsetof(struct user32, regs.l): stack[offsetof(struct pt_regs, q)/8] = val; break
 
@@ -70,9 +74,12 @@ static int putreg32(struct task_struct *
 	R32(eip, rip);
 	R32(esp, rsp);
 
-	case offsetof(struct user32, regs.eflags): 
-		stack[offsetof(struct pt_regs, eflags)/8] = val & 0x44dd5; 
+	case offsetof(struct user32, regs.eflags): {
+		__u64 *flags = &stack[offsetof(struct pt_regs, eflags)/8];
+		val &= FLAG_MASK;
+		*flags = val | (*flags & ~FLAG_MASK);
 		break;
+	}
 
 	case offsetof(struct user32, u_debugreg[4]): 
 	case offsetof(struct user32, u_debugreg[5]):

_