[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: Daniel Jacobowitz <dan@codesourcery.com> Acked-by: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
c91096d85c
commit
e8ed11b9dc
|
@ -43,11 +43,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
|
|||
switch (regno) {
|
||||
case offsetof(struct user32, regs.fs):
|
||||
if (val && (val & 3) != 3) return -EIO;
|
||||
child->thread.fs = val & 0xffff;
|
||||
child->thread.fsindex = val & 0xffff;
|
||||
break;
|
||||
case offsetof(struct user32, regs.gs):
|
||||
if (val && (val & 3) != 3) return -EIO;
|
||||
child->thread.gs = val & 0xffff;
|
||||
child->thread.gsindex = val & 0xffff;
|
||||
break;
|
||||
case offsetof(struct user32, regs.ds):
|
||||
if (val && (val & 3) != 3) return -EIO;
|
||||
|
@ -138,10 +138,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
|
|||
|
||||
switch (regno) {
|
||||
case offsetof(struct user32, regs.fs):
|
||||
*val = child->thread.fs;
|
||||
*val = child->thread.fsindex;
|
||||
break;
|
||||
case offsetof(struct user32, regs.gs):
|
||||
*val = child->thread.gs;
|
||||
*val = child->thread.gsindex;
|
||||
break;
|
||||
case offsetof(struct user32, regs.ds):
|
||||
*val = child->thread.ds;
|
||||
|
|
Loading…
Reference in New Issue