Commit e8ed11b9 authored by Daniel Jacobowitz's avatar Daniel Jacobowitz Committed by Linus Torvalds

[PATCH] x86_64: fix 32-bit thread debugging

The IA32 ptrace emulation currently returns the wrong registers for fs/gs;
it's returning what x86_64 calls gs_base.  We need regs.gsindex in order
for GDB to correctly locate the TLS area.  Without this patch, the 32-bit
GDB testsuite bombs on a 64-bit kernel.  With it, results look about like
I'd expect, although there are still a handful of kernel-related failures
(vsyscall related?).
Signed-off-by: default avatarDaniel Jacobowitz <dan@codesourcery.com>
Acked-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c91096d8
...@@ -43,11 +43,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val) ...@@ -43,11 +43,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
switch (regno) { switch (regno) {
case offsetof(struct user32, regs.fs): case offsetof(struct user32, regs.fs):
if (val && (val & 3) != 3) return -EIO; if (val && (val & 3) != 3) return -EIO;
child->thread.fs = val & 0xffff; child->thread.fsindex = val & 0xffff;
break; break;
case offsetof(struct user32, regs.gs): case offsetof(struct user32, regs.gs):
if (val && (val & 3) != 3) return -EIO; if (val && (val & 3) != 3) return -EIO;
child->thread.gs = val & 0xffff; child->thread.gsindex = val & 0xffff;
break; break;
case offsetof(struct user32, regs.ds): case offsetof(struct user32, regs.ds):
if (val && (val & 3) != 3) return -EIO; if (val && (val & 3) != 3) return -EIO;
...@@ -138,10 +138,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val) ...@@ -138,10 +138,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
switch (regno) { switch (regno) {
case offsetof(struct user32, regs.fs): case offsetof(struct user32, regs.fs):
*val = child->thread.fs; *val = child->thread.fsindex;
break; break;
case offsetof(struct user32, regs.gs): case offsetof(struct user32, regs.gs):
*val = child->thread.gs; *val = child->thread.gsindex;
break; break;
case offsetof(struct user32, regs.ds): case offsetof(struct user32, regs.ds):
*val = child->thread.ds; *val = child->thread.ds;
......
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