			ILP32 AARCH64 SYSCALL ABI
			=====================

Author: Andrew Pinski  <apinski@cavium.com>
Date: May 23, 2014

This document describes the ILP32 syscall ABI and where it differs
from the generic linux syscall interface.
ILP32 sets __kernel_long_t and __kernel_ulong_t both to 64bit
(long long).  This effects the following types:
* time_t: unsigned long long
* clock_t: unsigned long long
* fsword_t: long long
* suseconds_t: long long
* swblk_t: long long
* fd_mask_t: long long

Some structures are changed to reduce the difference in the code path
for both ILP32 and LP64 ABIs for signal handling.

The following structures have been changed so the layout of the structures are the same between ILP32 and LP64 ABIs.
* timespec: Uses time_t and suseconds_t
* timeval: Uses time_t and suseconds_t
* stat: Uses timespec/time_t.
* semid64_ds: Uses time_t.
* msqid64_ds: Uses time_t.
* shmid64_ds: Uses time_t.
* rt_sigframe: Uses siginfo and ucontext.
* siginfo_t: Uses clock_t and sigval_t
* ucontext: Uses stack_t and sigset_t
* stack_t: NOTE special handling inside the kernel is done to make sure
  the pointers are zero extended
* sigval_t: Contains pointers
* sigevent: Uses sigval_t which causes it to be the same.  Special
  handing is needed for reading; in the mq_notify syscall
* sigaction: NOTE the userland structure inside glibc does
  not match the kernel structure here (this causes issues with LTP).
  Uses sigset_t.
* fd_set: This is done to avoid endian issues between ILP32 and LP64
  Also the syscall which uses fd_set uses timespec


Also the syscalls which normally would pass 64bit values as two
arguments; now pass the 64bit value as one argument.  Also they have
been renamed (removing the 64 from the name) to avoid confusion.
The list of these syscalls:
* fcntl
* statfs
* fstatfs
* truncate
* ftruncate
* lseek
* sendfile
* newfstatat
* fstat
* mmap
* fadvise64
