aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Mike Frysinger <vapier@gentoo.org>2013-04-01 05:53:38 -0400
committerGravatar Mike Frysinger <vapier@gentoo.org>2013-04-01 05:58:03 -0400
commit564a95241f8468145ff85998ef9173c46aed7636 (patch)
treed5f70f34fd006802eba3f27536cc93f233018cf2
parent81c9eaafecd4b3d53ef09931fe2c65de1cda98ca (diff)
downloaduClibc-564a95241f8468145ff85998ef9173c46aed7636.tar.gz
uClibc-564a95241f8468145ff85998ef9173c46aed7636.tar.bz2
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>
-rw-r--r--libc/sysdeps/linux/common/pread_write.c22
-rw-r--r--libc/sysdeps/linux/powerpc/Makefile.arch2
-rw-r--r--libc/sysdeps/linux/powerpc/pread_write.c47
-rw-r--r--libc/sysdeps/linux/sh/pread_write.c41
-rw-r--r--libc/sysdeps/linux/xtensa/Makefile.arch2
-rw-r--r--libc/sysdeps/linux/xtensa/pread_write.c46
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 25899d321..fa22f82b1 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 7830ce3a9..4fbcb1126 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 5cb338622..000000000
--- 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@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 f4453a604..5877f686f 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 eab82ec93..277a1e325 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 f4453a604..000000000
--- 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@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"