From 59b9f2439d83acec065783806d952741a5e98b6a Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Tue, 20 Jan 2004 03:13:39 -0800 Subject: [PATCH] [PATCH] Fix x86-64 ptrace From: Andi Kleen 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 file changed, 9 insertions(+), 2 deletions(-) diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c index 6d9b8da52c9d0..0457e49999adc 100644 --- a/arch/x86_64/ia32/ptrace32.c +++ b/arch/x86_64/ia32/ptrace32.c @@ -26,6 +26,10 @@ #include #include +/* 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 *child, unsigned regno, u32 val) 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]): -- 2.53.0