[git commit] linux: pread/write: convert to SYSCALL_ALIGN_64BIT

Mike Frysinger vapier at gentoo.org
Mon Apr 1 09:58:03 UTC 2013


commit: http://git.uclibc.org/uClibc/commit/?id=564a95241f8468145ff85998ef9173c46aed7636
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master

The pread64/write64 syscalls have the 64bit register align issue for
all arches.  Use this new define so we can merge the powerc/xtensa
versions back into the common code.

SuperH is funky and also allows us to do this.

We should be able to merge the mips version too, but that'll require
someone to take a closer look as the current stuff doesn't look quite
right.

Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
 libc/sysdeps/linux/common/pread_write.c  |   22 +++++++++++--
 libc/sysdeps/linux/powerpc/Makefile.arch |    2 +-
 libc/sysdeps/linux/powerpc/pread_write.c |   47 ------------------------------
 libc/sysdeps/linux/sh/pread_write.c      |   41 ++------------------------
 libc/sysdeps/linux/xtensa/Makefile.arch  |    2 +-
 libc/sysdeps/linux/xtensa/pread_write.c  |   46 -----------------------------
 6 files changed, 23 insertions(+), 137 deletions(-)

diff --git a/libc/sysdeps/linux/common/pread_write.c b/libc/sysdeps/linux/common/pread_write.c
index 25899d3..fa22f82 100644
--- a/libc/sysdeps/linux/common/pread_write.c
+++ b/libc/sysdeps/linux/common/pread_write.c
@@ -31,20 +31,34 @@
 #ifndef MY_PREAD
 # ifdef __NR_pread
 #  define __NR___syscall_pread __NR_pread
+#  if defined(__UCLIBC_SYSCALL_ALIGN_64BIT__)
+static _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,
+		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
+#   define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, 0, OFF_HI_LO(offset))
+#   define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, 0, OFF64_HI_LO(offset))
+#  else
 static _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,
 		 size_t, count, off_t, offset_hi, off_t, offset_lo)
-#  define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, OFF_HI_LO(offset))
-#  define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, OFF64_HI_LO(offset))
+#   define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, OFF_HI_LO(offset))
+#   define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, OFF64_HI_LO(offset))
+#  endif
 # endif
 #endif
 
 #ifndef MY_PWRITE
 # ifdef __NR_pwrite
 #  define __NR___syscall_pwrite __NR_pwrite
+#  if defined(__UCLIBC_SYSCALL_ALIGN_64BIT__)
+static _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
+		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
+#   define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, 0, OFF_HI_LO(offset))
+#   define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, 0, OFF64_HI_LO(offset))
+#  else
 static _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
 		 size_t, count, off_t, offset_hi, off_t, offset_lo)
-#  define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, OFF_HI_LO(offset))
-#  define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, OFF64_HI_LO(offset))
+#   define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, OFF_HI_LO(offset))
+#   define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, OFF64_HI_LO(offset))
+#  endif
 # endif
 #endif
 
diff --git a/libc/sysdeps/linux/powerpc/Makefile.arch b/libc/sysdeps/linux/powerpc/Makefile.arch
index 7830ce3..4fbcb11 100644
--- a/libc/sysdeps/linux/powerpc/Makefile.arch
+++ b/libc/sysdeps/linux/powerpc/Makefile.arch
@@ -5,7 +5,7 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
-CSRC-y := __syscall_error.c pread_write.c ioctl.c
+CSRC-y := __syscall_error.c ioctl.c
 
 SSRC-y := \
 	__longjmp.S setjmp.S bsd-setjmp.S bsd-_setjmp.S brk.S \
diff --git a/libc/sysdeps/linux/powerpc/pread_write.c b/libc/sysdeps/linux/powerpc/pread_write.c
deleted file mode 100644
index 5cb3386..0000000
--- a/libc/sysdeps/linux/powerpc/pread_write.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
-
-#include <sys/syscall.h>
-#include <unistd.h>
-#include <endian.h>
-
-#ifdef __NR_pread64
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-#ifdef __NR_pread
-# define __NR___syscall_pread __NR_pread
-static _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,
-		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
-# define MY_PREAD(fd, buf, count, offset) \
-	__syscall_pread(fd, buf, count, 0, OFF_HI_LO(offset))
-# define MY_PREAD64(fd, buf, count, offset) \
-	__syscall_pread(fd, buf, count, 0, OFF64_HI_LO(offset))
-#endif
-
-#ifdef __NR_pwrite64
-# ifdef __NR_pwrite
-#  error "__NR_pwrite and __NR_pwrite64 both defined???"
-# endif
-# define __NR_pwrite __NR_pwrite64
-#endif
-
-#ifdef __NR_pwrite
-# define __NR___syscall_pwrite __NR_pwrite
-
-static _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
-		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
-# define MY_PWRITE(fd, buf, count, offset) \
-	__syscall_pwrite(fd, buf, count, 0, OFF_HI_LO(offset))
-# define MY_PWRITE64(fd, buf, count, offset) \
-	__syscall_pwrite(fd, buf, count, 0, OFF64_HI_LO(offset))
-#endif
-
-#include "../common/pread_write.c"
diff --git a/libc/sysdeps/linux/sh/pread_write.c b/libc/sysdeps/linux/sh/pread_write.c
index f4453a6..5877f68 100644
--- a/libc/sysdeps/linux/sh/pread_write.c
+++ b/libc/sysdeps/linux/sh/pread_write.c
@@ -5,42 +5,7 @@
  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  */
 
-#include <sys/syscall.h>
-#include <unistd.h>
-#include <endian.h>
-
-#ifdef __NR_pread64
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-#ifdef __NR_pread
-# define __NR___syscall_pread __NR_pread
-static _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,
-		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
-# define MY_PREAD(fd, buf, count, offset) \
-	__syscall_pread(fd, buf, count, 0, OFF_HI_LO(offset))
-# define MY_PREAD64(fd, buf, count, offset) \
-	__syscall_pread(fd, buf, count, 0, OFF64_HI_LO(offset))
-#endif
-
-#ifdef __NR_pwrite64
-# ifdef __NR_pwrite
-#  error "__NR_pwrite and __NR_pwrite64 both defined???"
-# endif
-# define __NR_pwrite __NR_pwrite64
-#endif
-
-#ifdef __NR_pwrite
-# define __NR___syscall_pwrite __NR_pwrite
-static _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
-		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
-# define MY_PWRITE(fd, buf, count, offset) \
-	__syscall_pwrite(fd, buf, count, 0, OFF_HI_LO(offset))
-# define MY_PWRITE64(fd, buf, count, offset) \
-	__syscall_pwrite(fd, buf, count, 0, OFF64_HI_LO(offset))
-#endif
-
+/* SuperH doesn't have this alignment issue.  It just decided to copy
+ * the syscall interface from another arch for no good reason. */
+#define __UCLIBC_SYSCALL_ALIGN_64BIT__
 #include "../common/pread_write.c"
diff --git a/libc/sysdeps/linux/xtensa/Makefile.arch b/libc/sysdeps/linux/xtensa/Makefile.arch
index eab82ec..277a1e3 100644
--- a/libc/sysdeps/linux/xtensa/Makefile.arch
+++ b/libc/sysdeps/linux/xtensa/Makefile.arch
@@ -5,7 +5,7 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
-CSRC-y := brk.c fork.c pread_write.c sigaction.c __syscall_error.c
+CSRC-y := brk.c fork.c sigaction.c __syscall_error.c
 
 SSRC-y := bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S \
 	sigrestorer.S syscall.S mmap.S windowspill.S __longjmp.S vfork.S
diff --git a/libc/sysdeps/linux/xtensa/pread_write.c b/libc/sysdeps/linux/xtensa/pread_write.c
deleted file mode 100644
index f4453a6..0000000
--- a/libc/sysdeps/linux/xtensa/pread_write.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
-
-#include <sys/syscall.h>
-#include <unistd.h>
-#include <endian.h>
-
-#ifdef __NR_pread64
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-#ifdef __NR_pread
-# define __NR___syscall_pread __NR_pread
-static _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,
-		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
-# define MY_PREAD(fd, buf, count, offset) \
-	__syscall_pread(fd, buf, count, 0, OFF_HI_LO(offset))
-# define MY_PREAD64(fd, buf, count, offset) \
-	__syscall_pread(fd, buf, count, 0, OFF64_HI_LO(offset))
-#endif
-
-#ifdef __NR_pwrite64
-# ifdef __NR_pwrite
-#  error "__NR_pwrite and __NR_pwrite64 both defined???"
-# endif
-# define __NR_pwrite __NR_pwrite64
-#endif
-
-#ifdef __NR_pwrite
-# define __NR___syscall_pwrite __NR_pwrite
-static _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
-		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)
-# define MY_PWRITE(fd, buf, count, offset) \
-	__syscall_pwrite(fd, buf, count, 0, OFF_HI_LO(offset))
-# define MY_PWRITE64(fd, buf, count, offset) \
-	__syscall_pwrite(fd, buf, count, 0, OFF64_HI_LO(offset))
-#endif
-
-#include "../common/pread_write.c"


More information about the uClibc-cvs mailing list