[PATCH] Fix MIPS N64 build.

Steve Ellcey sellcey at mips.com
Mon Mar 10 22:43:59 UTC 2014


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.
Can this patch go ahead and be checked in to uclibc?

Steve Ellcey
sellcey at mips.com




More information about the uClibc mailing list