Re: [PATCH 2/2] powerpc: FULL_REGS on exec
On Mon, 2007-09-24 at 16:52 -0700, Roland McGrath wrote: > When PTRACE_O_TRACEEXEC is used, a ptrace call to fetch the registers at > the PTRACE_EVENT_EXEC stop (PTRACE_PEEKUSR) will oops in CHECK_FULL_REGS. > With recent versions, "gdb --args /bin/sh -c 'exec /bin/true'" and "run" at > the (gdb) prompt is sufficient to produce this. I also have written an > isolated test case, see > https://bugzilla.redhat.com/show_bug.cgi?id=301791#c15. > > This change fixes the problem by clearing the low bit of pt_regs.trap in > start_thread so that FULL_REGS is true again. This is correct since all of > the GPRs that "full" refers to are cleared in start_thread. Looks good, nice catch. > Signed-off-by: Roland McGrath <[EMAIL PROTECTED]> Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]> > --- > arch/powerpc/kernel/process.c |7 +++ > 1 files changed, 7 insertions(+), 0 deletions(-) > > diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c > index e477c9d..fd799d2 100644 > --- a/arch/powerpc/kernel/process.c > +++ b/arch/powerpc/kernel/process.c > @@ -605,6 +605,13 @@ void start_thread(struct pt_regs *regs, unsigned long > start, unsigned long sp) > regs->ccr = 0; > regs->gpr[1] = sp; > > + /* > + * We have just cleared all the nonvolatile GPRs, so make > + * FULL_REGS(regs) return true. This is necessary to allow > + * ptrace to examine the thread immediately after exec. > + */ > + regs->trap &= ~1UL; > + > #ifdef CONFIG_PPC32 > regs->mq = 0; > regs->nip = start; > ___ > Linuxppc-dev mailing list > [EMAIL PROTECTED] > https://ozlabs.org/mailman/listinfo/linuxppc-dev - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/2] powerpc: FULL_REGS on exec
When PTRACE_O_TRACEEXEC is used, a ptrace call to fetch the registers at the PTRACE_EVENT_EXEC stop (PTRACE_PEEKUSR) will oops in CHECK_FULL_REGS. With recent versions, "gdb --args /bin/sh -c 'exec /bin/true'" and "run" at the (gdb) prompt is sufficient to produce this. I also have written an isolated test case, see https://bugzilla.redhat.com/show_bug.cgi?id=301791#c15. This change fixes the problem by clearing the low bit of pt_regs.trap in start_thread so that FULL_REGS is true again. This is correct since all of the GPRs that "full" refers to are cleared in start_thread. Signed-off-by: Roland McGrath <[EMAIL PROTECTED]> --- arch/powerpc/kernel/process.c |7 +++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index e477c9d..fd799d2 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -605,6 +605,13 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) regs->ccr = 0; regs->gpr[1] = sp; + /* +* We have just cleared all the nonvolatile GPRs, so make +* FULL_REGS(regs) return true. This is necessary to allow +* ptrace to examine the thread immediately after exec. +*/ + regs->trap &= ~1UL; + #ifdef CONFIG_PPC32 regs->mq = 0; regs->nip = start; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/2] powerpc: FULL_REGS on exec
When PTRACE_O_TRACEEXEC is used, a ptrace call to fetch the registers at the PTRACE_EVENT_EXEC stop (PTRACE_PEEKUSR) will oops in CHECK_FULL_REGS. With recent versions, gdb --args /bin/sh -c 'exec /bin/true' and run at the (gdb) prompt is sufficient to produce this. I also have written an isolated test case, see https://bugzilla.redhat.com/show_bug.cgi?id=301791#c15. This change fixes the problem by clearing the low bit of pt_regs.trap in start_thread so that FULL_REGS is true again. This is correct since all of the GPRs that full refers to are cleared in start_thread. Signed-off-by: Roland McGrath [EMAIL PROTECTED] --- arch/powerpc/kernel/process.c |7 +++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index e477c9d..fd799d2 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -605,6 +605,13 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) regs-ccr = 0; regs-gpr[1] = sp; + /* +* We have just cleared all the nonvolatile GPRs, so make +* FULL_REGS(regs) return true. This is necessary to allow +* ptrace to examine the thread immediately after exec. +*/ + regs-trap = ~1UL; + #ifdef CONFIG_PPC32 regs-mq = 0; regs-nip = start; - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/2] powerpc: FULL_REGS on exec
On Mon, 2007-09-24 at 16:52 -0700, Roland McGrath wrote: When PTRACE_O_TRACEEXEC is used, a ptrace call to fetch the registers at the PTRACE_EVENT_EXEC stop (PTRACE_PEEKUSR) will oops in CHECK_FULL_REGS. With recent versions, gdb --args /bin/sh -c 'exec /bin/true' and run at the (gdb) prompt is sufficient to produce this. I also have written an isolated test case, see https://bugzilla.redhat.com/show_bug.cgi?id=301791#c15. This change fixes the problem by clearing the low bit of pt_regs.trap in start_thread so that FULL_REGS is true again. This is correct since all of the GPRs that full refers to are cleared in start_thread. Looks good, nice catch. Signed-off-by: Roland McGrath [EMAIL PROTECTED] Signed-off-by: Benjamin Herrenschmidt [EMAIL PROTECTED] --- arch/powerpc/kernel/process.c |7 +++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index e477c9d..fd799d2 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -605,6 +605,13 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) regs-ccr = 0; regs-gpr[1] = sp; + /* + * We have just cleared all the nonvolatile GPRs, so make + * FULL_REGS(regs) return true. This is necessary to allow + * ptrace to examine the thread immediately after exec. + */ + regs-trap = ~1UL; + #ifdef CONFIG_PPC32 regs-mq = 0; regs-nip = start; ___ Linuxppc-dev mailing list [EMAIL PROTECTED] https://ozlabs.org/mailman/listinfo/linuxppc-dev - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/