ILP32 AARCH64 SYSCALL ABI ========================= This document describes the ILP32 syscall ABI and where it differs from the generic compat linux syscall interface. AARCH64/ILP32 userspace can pass garbage in the top halve of w0-w7 registers (syscall arguments). So top 32 bits are zeroed for them. Comparing to AARCH32, AARCH64/ILP32 has 64-bit length of following types: ino_t is u64 type. off_t is s64 type. blkcnt_t is s64 type. fsblkcnt_t is u64 type. fsfilcnt_t is u64 type. rlim_t is u64 type. AARCH64/ILP32 ABI uses standard syscall table which can be found at include/uapi/asm-generic/unistd.h, with the exceptions listed below. Syscalls which pass 64-bit values are handled by the code shared from AARCH32 and pass that value as a pair. Next syscalls are affected: fadvise64_64() fallocate() ftruncate64() pread64() pwrite64() readahead() sync_file_range() truncate64() ptrace() syscall is handled by compat version. shmat() syscall is handled by non-compat handler as aarch64/ilp32 has no limitation on 4-pages alignement for shared memory. statfs() and fstatfs() take the size of struct statfs as an argument. It is calculated differently in kernel and user spaces. So AARCH32 handlers are taken to handle it. struct rt_sigframe is redefined and contains struct compat_siginfo, as compat syscalls expects, and struct ilp32_sigframe, to handle AARCH64 register set and 32-bit userspace register representation. elf_gregset_t is taken from lp64 to handle registers properly.