From 564a95241f8468145ff85998ef9173c46aed7636 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 1 Apr 2013 05:53:38 -0400 Subject: 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 --- 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(-) delete mode 100644 libc/sysdeps/linux/powerpc/pread_write.c delete mode 100644 libc/sysdeps/linux/xtensa/pread_write.c 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 - * - * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - */ - -#include -#include -#include - -#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 -#include -#include - -#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 - * - * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - */ - -#include -#include -#include - -#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" -- cgit v1.2.3