Subject: Re: Gdbserver syscall clobber

From: Daniel Jacobowitz <[email-masked]>
Date: Mon, 23 Jul 2007 12:15:12 -0400

On Mon, Jul 23, 2007 at 11:06:13AM -0500, Bill Gatliff wrote:
> Daniel Jacobowitz wrote:
> > On Wed, Jul 18, 2007 at 12:59:42PM -0500, Bill Gatliff wrote:
> >   
> >> Now, I'm a little rusty on PPC asm (I've been doing a lot of ARM
> >> lately), but it looks to me like the kernel is setting bit 0 in CR0
> >> (oris r10, r10, 0x1000) a.k.a LT, but the user side is looking at CR0
> >> (bnslr+) bit 3 a.k.a. SO.  Or maybe the other way around, I'm not sure
> >> after reading Sections 1.2 and 2.1 of the Programming Environments manual.
> >>     
> >
> > It's not checking for restart here - userspace isn't supposed to have to.
> > It's probably checking for error.  Check for the bit of kernel code
> > that's supposed to back you up two instructions.
> >
> >   
> 
> I don't see it in this kernel.  What I see is this after the call to the 
> syscall handler:

Look around do_signal:

                        regs->nip -= 4; /* Back up & retry system call */

If your kernel has corrupted the register containing the syscall
number at this point, that would explain your problem.  It will then
do the wrong syscall.  I guess PPC only backs up one instruction.

-- 
Daniel Jacobowitz
CodeSourcery