summaryrefslogtreecommitdiff
path: root/Documentation/arm64/ilp32.txt
blob: 08935a34e7e9fc9882b3d556471e8d6abf52e516 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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.