This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Fix get ERESTARTSYS with m32 in x86_64 when debug by GDB
- From: Mark Kettenis <mark dot kettenis at xs4all dot nl>
- To: hpa at zytor dot com
- Cc: pinskia at gmail dot com, teawater at gmail dot com, tglx at linutronix dot de, mingo at redhat dot com, x86 at kernel dot org, eparis at redhat dot com, ak at linux dot intel dot com, linux-kernel at vger dot kernel dot org, gdb at sourceware dot org
- Date: Wed, 30 Apr 2014 15:35:33 +0200 (CEST)
- Subject: Re: [PATCH] Fix get ERESTARTSYS with m32 in x86_64 when debug by GDB
- Authentication-results: sourceware.org; auth=none
- References: <CANFwon0oLO+qCtpewc=BxKBOm05aBMpV=yG0CxwW1isWHfnZqw at mail dot gmail dot com> <53554846 dot 3070608 at zytor dot com> <CANFwon3zA9FMujmnN3nMiv8Zr8bU9o72XXa26dkePNq57U=JcQ at mail dot gmail dot com> <53608125 dot 2020103 at zytor dot com> <CA+=Sn1=y-smZOaD_yRxEwgu-PPaZYdQtB_RGPCA5-9wmB6=hvQ at mail dot gmail dot com> <536085B7 dot 5070002 at zytor dot com>
> Date: Tue, 29 Apr 2014 22:10:15 -0700
> From: "H. Peter Anvin" <hpa@zytor.com>
>
> On 04/29/2014 10:08 PM, Andrew Pinski wrote:
> >
> > restoring the values is hard since even the ptrace interface does not
> > allow for that.
> >
>
> So that begs the ultimate question, which is: given the fact that there
> is *state missing* from the state vector (this is the core of the
> problem), is there a way we can add that state so that gdb will be able
> to save and restore it?
Carrying around additional state in GDB is complicated; I'd rather
avoid it.
arch/x86/kernel/ptrace.c:putreg32() has this bit of code:
case offsetof(struct user32, regs.orig_eax):
/*
* A 32-bit debugger setting orig_eax means to restore
* the state of the task restarting a 32-bit syscall.
* Make sure we interpret the -ERESTART* codes correctly
* in case the task is not actually still sitting at the
* exit from a 32-bit syscall with TS_COMPAT still set.
*/
regs->orig_ax = value;
if (syscall_get_nr(child, regs) >= 0)
task_thread_info(child)->status |= TS_COMPAT;
break;
which gets used for 32-bit compat ptrace(2). Perhaps the same logic
should be added to putreg() if the child is a 32-bit process?
If (and only if) the goal of that TS_COMPAT flag solely is to trigger
the error code sign-extension in arch/x86/asm/syscall.h:syscall_get_error(),
we could work around to problem in GDB by checking "orig_ax" to see if
we're continuing an interrupted system call and sign extend the error
code in the real "eax" register if we are.