[17/23,AARCH64] ILP32: introduce syscalls that pass off_t
Commit Message
From: Yury Norov <yury.norov@gmail.com>
ILP32 has 64-bit off_t, to follow modern requirements.
But kernel clears top-halves of input registers. It means
we have to pass corresponding arguments in a pair, like
aarch32 does. In this patch all affected syscalls are redefined.
Most of them are taken from arm code.
Signed-off-by: Yury Norov <ynorov@caviumnetworks.com>
---
sysdeps/unix/sysv/linux/aarch64/ilp32/ftruncate.c | 1 +
.../unix/sysv/linux/aarch64/ilp32/ftruncate64.c | 4 +++
sysdeps/unix/sysv/linux/aarch64/ilp32/lseek.c | 36 ++++++++++++++++++++++
sysdeps/unix/sysv/linux/aarch64/ilp32/lseek64.c | 0
sysdeps/unix/sysv/linux/aarch64/ilp32/mmap.c | 1 +
.../unix/sysv/linux/aarch64/ilp32/posix_fadvise.c | 1 +
.../sysv/linux/aarch64/ilp32/posix_fadvise64.c | 2 ++
sysdeps/unix/sysv/linux/aarch64/ilp32/readahead.c | 1 +
sysdeps/unix/sysv/linux/aarch64/ilp32/truncate.c | 1 +
sysdeps/unix/sysv/linux/aarch64/ilp32/truncate64.c | 4 +++
sysdeps/unix/sysv/linux/aarch64/kernel-features.h | 27 ++++++++++++++++
11 files changed, 78 insertions(+)
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/ftruncate.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/ftruncate64.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/lseek.c
delete mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/lseek64.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/mmap.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/posix_fadvise.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/posix_fadvise64.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/readahead.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/truncate.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/ilp32/truncate64.c
create mode 100644 sysdeps/unix/sysv/linux/aarch64/kernel-features.h
Comments
On Tue, 28 Jun 2016, Yury Norov wrote:
> ILP32 has 64-bit off_t, to follow modern requirements.
> But kernel clears top-halves of input registers. It means
> we have to pass corresponding arguments in a pair, like
> aarch32 does. In this patch all affected syscalls are redefined.
> Most of them are taken from arm code.
Please follow the spirit of Adhemerval's recent work. Determine the
appropriate abstractions for the architecture differences for these
syscalls, and set up unified implementations used on all architectures,
rather than increasing the number of architecture-specific variants.
> +#ifdef __ILP32__
> +/* Define this if your 32-bit syscall API requires 64-bit register
> + pairs to start with an even-number register. */
> +#define __ASSUME_ALIGNED_REGISTER_PAIRS 1
> +#endif /* __ILP32__ */
Preprocessor indentation.
rpm: ../sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c:31: __libc_pread: Assertion `sizeof (offset) == 4' failed.
Andreas.
Sorry, I was trying to backport to 2.23, and failed. Won't happen
again.
Andreas.
new file mode 100644
@@ -0,0 +1 @@
+/* See sysdeps/unix/sysv/linux/aarch64/ilp32/ftruncatei64.c */
new file mode 100644
@@ -0,0 +1,4 @@
+#include <sysdeps/unix/sysv/linux/arm/ftruncate64.c>
+
+weak_alias (__ftruncate64, __ftruncate)
+weak_alias (__ftruncate64, ftruncate)
new file mode 100644
@@ -0,0 +1,36 @@
+/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+
+off_t
+__lseek (int fd, off_t offset, int whence)
+{
+ loff_t res;
+ int rc = INLINE_SYSCALL (_llseek, 5, fd, (off_t) (offset >> 32),
+ (off_t) offset, &res, whence);
+ return rc ?: res;
+}
+libc_hidden_def (__lseek)
+weak_alias (__lseek, lseek)
+strong_alias (__lseek, __libc_lseek)
deleted file mode 100644
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/arm/mmap.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/arm/posix_fadvise.c>
new file mode 100644
@@ -0,0 +1,2 @@
+#define __NR_arm_fadvise64_64 __NR_fadvise64_64
+#include <sysdeps/unix/sysv/linux/arm/posix_fadvise64.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/arm/readahead.c>
new file mode 100644
@@ -0,0 +1 @@
+/* See sysdeps/unix/sysv/linux/aarch64/ilp32/truncate64.c */
new file mode 100644
@@ -0,0 +1,4 @@
+#include <sysdeps/unix/sysv/linux/arm/truncate64.c>
+
+weak_alias (truncate64, __truncate)
+weak_alias (truncate64, truncate)
new file mode 100644
@@ -0,0 +1,27 @@
+/* Set flags signalling availability of kernel features based on given
+ kernel version number.
+ Copyright (C) 2006-2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include_next <kernel-features.h>
+
+#ifdef __ILP32__
+/* Define this if your 32-bit syscall API requires 64-bit register
+ pairs to start with an even-number register. */
+#define __ASSUME_ALIGNED_REGISTER_PAIRS 1
+#endif /* __ILP32__ */
+