From: Andrew Pinski <apin...@cavium.com>

The generic typesizes does not work for ILP32 as the kernel long type
needs to be long long (quad).  time_t, off_t, clock_t, suseconds_t,
ino_t, rlim_t are 64bits.
FDSET bitmask is a 64bit type.

* sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h: New file.

Signed-off-by: Yury Norov <yno...@caviumnetworks.com>
---
 sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h | 79 ++++++++++++++++++++++++
 sysdeps/unix/sysv/linux/sysdep-vdso.h            |  4 +-
 2 files changed, 81 insertions(+), 2 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h

diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h 
b/sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h
new file mode 100644
index 0000000..844da49
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/aarch64/bits/typesizes.h
@@ -0,0 +1,79 @@
+/* bits/typesizes.h -- underlying types for *_t.  Linux/AARCh64 version.
+   Copyright (C) 2011-2015 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/>.  */
+
+#ifndef _BITS_TYPES_H
+# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead."
+#endif
+
+#ifndef        _BITS_TYPESIZES_H
+#define        _BITS_TYPESIZES_H       1
+
+/* See <bits/types.h> for the meaning of these macros.  This file exists so
+   that <bits/types.h> need not vary across different GNU platforms.  */
+
+#define __DEV_T_TYPE           __UQUAD_TYPE
+#define __UID_T_TYPE           __U32_TYPE
+#define __GID_T_TYPE           __U32_TYPE
+#define __INO_T_TYPE           __ULONGWORD_TYPE
+#define __INO64_T_TYPE         __UQUAD_TYPE
+#define __MODE_T_TYPE          __U32_TYPE
+#define __NLINK_T_TYPE         __U32_TYPE
+#define __OFF_T_TYPE           __SQUAD_TYPE
+#define __OFF64_T_TYPE         __SQUAD_TYPE
+#define __PID_T_TYPE           __S32_TYPE
+#define __RLIM_T_TYPE          __ULONGWORD_TYPE
+#define __RLIM64_T_TYPE                __UQUAD_TYPE
+#define        __BLKCNT_T_TYPE         __SLONGWORD_TYPE
+#define        __BLKCNT64_T_TYPE       __SQUAD_TYPE
+#define        __FSBLKCNT_T_TYPE       __ULONGWORD_TYPE
+#define        __FSBLKCNT64_T_TYPE     __UQUAD_TYPE
+#define        __FSFILCNT_T_TYPE       __ULONGWORD_TYPE
+#define        __FSFILCNT64_T_TYPE     __UQUAD_TYPE
+#define        __FSWORD_T_TYPE         __SWORD_TYPE
+#define        __ID_T_TYPE             __U32_TYPE
+#define __CLOCK_T_TYPE         __SLONGWORD_TYPE
+#define __TIME_T_TYPE          __SLONGWORD_TYPE
+#define __USECONDS_T_TYPE      __U32_TYPE
+#define __SUSECONDS_T_TYPE     __SLONGWORD_TYPE
+#define __DADDR_T_TYPE         __S32_TYPE
+#define __KEY_T_TYPE           __S32_TYPE
+#define __CLOCKID_T_TYPE       __S32_TYPE
+#define __TIMER_T_TYPE         void *
+#define __BLKSIZE_T_TYPE       __S32_TYPE
+#define __FSID_T_TYPE          struct { int __val[2]; }
+/* ssize_t is always singed long in both ABIs. */
+#define __SSIZE_T_TYPE         __SLONGWORD_TYPE
+#define __SYSCALL_SLONG_TYPE   __SLONGWORD_TYPE
+#define __SYSCALL_ULONG_TYPE   __ULONGWORD_TYPE
+#define __CPU_MASK_TYPE         __ULONGWORD_TYPE
+
+#ifdef __LP64__
+/* Tell the libc code that off_t and off64_t are actually the same type
+   for all ABI purposes, even if possibly expressed as different base types
+   for C type-checking purposes.  */
+# define __OFF_T_MATCHES_OFF64_T       1
+
+/* Same for ino_t and ino64_t.  */
+# define __INO_T_MATCHES_INO64_T       1
+#endif
+
+/* Number of descriptors that can fit in an `fd_set'.  */
+#define        __FD_SETSIZE            1024
+
+
+#endif /* bits/typesizes.h */
diff --git a/sysdeps/unix/sysv/linux/sysdep-vdso.h 
b/sysdeps/unix/sysv/linux/sysdep-vdso.h
index e8c4a7b..351d6bb 100644
--- a/sysdeps/unix/sysv/linux/sysdep-vdso.h
+++ b/sysdeps/unix/sysv/linux/sysdep-vdso.h
@@ -37,7 +37,7 @@
     __label__ out;                                                           \
     __label__ iserr;                                                         \
     INTERNAL_SYSCALL_DECL (sc_err);                                          \
-    long int sc_ret;                                                         \
+    __syscall_slong_t sc_ret;                                                \
                                                                              \
     __typeof (__vdso_##name) vdsop = __vdso_##name;                          \
     PTR_DEMANGLE (vdsop);                                                    \
@@ -64,7 +64,7 @@
 #  define INTERNAL_VSYSCALL(name, err, nr, args...)                          \
   ({                                                                         \
     __label__ out;                                                           \
-    long v_ret;                                                                
      \
+    __syscall_slong_t v_ret;                                                 \
                                                                              \
     __typeof (__vdso_##name) vdsop = __vdso_##name;                          \
     PTR_DEMANGLE (vdsop);                                                    \
-- 
2.7.4

Reply via email to