Browse Source

linux: pread/write: convert to SYSCALL_ALIGN_64BIT

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@gentoo.org>
Mike Frysinger 11 years ago
parent
commit
564a95241f

+ 18 - 4
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
 

+ 1 - 1
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 \

+ 0 - 47
libc/sysdeps/linux/powerpc/pread_write.c

@@ -1,47 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen@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"

+ 3 - 38
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"

+ 1 - 1
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

+ 0 - 46
libc/sysdeps/linux/xtensa/pread_write.c

@@ -1,46 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen@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"