[PATCH] Fix MIPS N64 build.

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Wed Mar 12 20:05:39 UTC 2014


On Mon, Mar 10, 2014 at 03:43:59PM -0700, Steve Ellcey wrote:
> On Sat, 2014-02-15 at 11:14 +0100, Bernhard Reutner-Fischer wrote:
> > On Fri, Feb 14, 2014 at 03:21:32PM +0100, Waldemar Brodkorb wrote:
> > > Hi Steve,
> > > Steve Ellcey  wrote,
> > > 
> > > > Uclibc is not building for MIPS N64 because pread is trying to use the
> > > > pread/pwrite system calls instead of pread64/pwrite64.  This patch fixes
> > > > the problem and was tested with LFS enabled and disabled.
> > > 
> > > I think you mean MIPS64 N32.
> > >  
> > > > Signed-off-by: Steve Ellcey <sellcey at mips.com>
> > > > ---
> > > >  libc/sysdeps/linux/mips/pread_write.c |    4 ++--
> > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/libc/sysdeps/linux/mips/pread_write.c b/libc/sysdeps/linux/mips/pread_write.c
> > > > index 3dc97c9..1220fec 100644
> > > > --- a/libc/sysdeps/linux/mips/pread_write.c
> > > > +++ b/libc/sysdeps/linux/mips/pread_write.c
> > > > @@ -13,14 +13,14 @@
> > > >  /* We should generalize this for 32bit userlands w/64bit regs.  This applies
> > > >   * to the x86_64 x32 and the mips n32 ABIs.  */
> > > >  #if _MIPS_SIM == _MIPS_SIM_NABI32
> > > > -# define __NR___syscall_pread __NR_pread
> > > > +# define __NR___syscall_pread __NR_pread64
> > > >  static _syscall4(ssize_t, __syscall_pread, int, fd, void *, buf, size_t, count, off_t, offset)
> > > >  # define MY_PREAD(fd, buf, count, offset) \
> > > >  	__syscall_pread(fd, buf, count, offset)
> > > >  # define MY_PREAD64(fd, buf, count, offset) \
> > > >  	__syscall_pread(fd, buf, count, offset)
> > > >  
> > > > -# define __NR___syscall_pwrite __NR_pwrite
> > > > +# define __NR___syscall_pwrite __NR_pwrite64
> > > >  static _syscall4(ssize_t, __syscall_pwrite, int, fd, const void *, buf, size_t, count, off_t, offset)
> > > >  # define MY_PWRITE(fd, buf, count, offset) \
> > > >  	__syscall_pwrite(fd, buf, count, offset)
> > > > -- 
> > > 
> > > Works for me, too.
> > > Did you start any real machine or emulator with this? I get bus
> > > errors after executing any application.
> > 
> > I suspect this needs a different register passing handling
> > (__LONG_LONG_PAIR) then.
> 
> Bernhard,
> 
> I looked into __LONG_LONG_PAIR but that is used to pass a 64 bit value
> in two 32 bit registers.  In this case (MIPS N32 mode) we are passing a
> 32 bit value (offset) in a 64 bit register and the system interface
> already takes care of any extension from 32 bits to 64 bits that is
> needed.  I did some more testing of pread and pwrite and it seems to be
> working fine.  Waldemar's comment about bus errors was not about this
> pread/pwrite patch but issues with booting an N32 MIPS linux kernel.

I see.

> Can this patch go ahead and be checked in to uclibc?

It unconditionally uses the 64 variants of the syscall which presumably
would have failed on you iff there was an N32 that did not have the 64
syscalls..

Applied, thanks.


More information about the uClibc mailing list