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 <sell...@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
sell...@mips.com


_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to