annotate doc/manual/callconvs/callconv_arm64.tex @ 95:9e99918065e6

- doc fixes (mainly for html output)
author cslag
date Sat, 04 Jun 2016 18:36:12 +0200
parents 5c3fa8897e0e
children 4a64b733dc76
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 % Copyright (c) 2014,2015 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 % Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 % Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 % purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 % copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 % ==================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 % ARM64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 % ==================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 \subsection{ARM64 Calling Convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 \paragraph{Overview}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25 ARMv8 introduced the AArch64 calling convention. ARM64 chips can be run in 64 or 32bit mode, but not by the same process. Interworking is only intre-process.\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 The word size is defined to be 32 bits, a dword 64 bits. Note that this is due to historical reasons (terminology
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 didn't change from ARM32).\\
95
9e99918065e6 - doc fixes (mainly for html output)
cslag
parents: 92
diff changeset
28 For more details, take a look at the Procedure Call Standard for the ARM 64-bit Architecture \cite{AAPCS64}.\\
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 \paragraph{\product{dyncall} support}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 The \product{dyncall} library supports the ARM 64-bit AArch64 PCS ABI, for calls and callbacks.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 \subsubsection{AAPCS64 Calling Convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 \paragraph{Registers and register usage}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37
68
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
38 ARM64 features thirty-one 64 bit general purpose registers, namely x0-x30.
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
39 Also, there is SP, a register with restricted use, used for the stack pointer,
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
40 and PC dedicated as program counter. Additionally, there are thirty-two 128 bit
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
41 registers v0-v31, to be used as SIMD and floating point registers, referred to
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
42 as q0-q31, d0-d31 and s0-s31, respectively, depending on their use:\\
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 \begin{table}[h]
77
e441ef3ec782 - manual layout tweaks
cslag
parents: 76
diff changeset
45 \begin{tabular*}{0.95\textwidth}{3 B}
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 Name & Brief description\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 {\bf x0-x7} & parameters, scratch, return value\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 {\bf x8} & indirect result location pointer\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 {\bf x9-x15} & scratch\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 {\bf x16} & permanent in some cases, can have special function (IP0), see doc\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 {\bf x17} & permanent in some cases, can have special function (IP1), see doc\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 {\bf x18} & reserved as platform register, advised not to be used for handwritten, portable asm, see doc \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 {\bf x19-x28} & permanent\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 {\bf x29} & permanent, frame pointer\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 {\bf x30} & permanent, link register\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 {\bf SP} & permanent, stack pointer\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 {\bf PC} & program counter\\
76
7ca46969e0ad - tweaks in manual, mainly for html generation
cslag
parents: 68
diff changeset
59 \end{tabular*}
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 \caption{Register usage on arm64}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 \paragraph{Parameter passing}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 \item stack parameter order: right-to-left
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 \item caller cleans up the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 \item first 8 integer arguments are passed using x0-x7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 \item first 8 floating point arguments are passed using d0-d7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 \item subsequent parameters are pushed onto the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 \item if the callee takes the address of one of the parameters and uses it to address other parameters (e.g. varargs) it has to copy - in its prolog - the first 8 integer and 8 floating-point registers to a reserved stack area adjacent to the other parameters on the stack (only the unnamed parameters require saving, though)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 \item structures and unions are passed by value, with the first four words of the parameters in r0-r3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 \item if return value is a structure, a pointer pointing to the return value's space is passed in r0, the first parameter in r1, etc... (see {\bf return values})
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 \item stack is required to be throughout eight-byte aligned
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 \paragraph{Return values}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 \item integer return values use x0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 \item floating-point return values use d0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 \item otherwise, the caller allocates space, passes pointer to it to the callee through x8, and callee writes return value to this space
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 \paragraph{Stack layout}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 Stack directly after function prolog:\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 \begin{figure}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 \begin{tabular}{5|3|1 1}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 \hhline{~-~~}
92
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
91 & \vdots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
92 \hhline{~=~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
93 register save area & \hspace{4cm} & & \mrrbrace{5}{caller's frame} \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
94 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
95 local data & & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
96 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
97 \mrlbrace{13}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
98 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
99 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
100 \hhline{~=~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
101 & x0 & \mrrbrace{10}{spill area (if needed)} & \mrrbrace{15}{current frame} \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
102 & x1 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
103 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
104 & x2 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
105 & x7 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
106 & d0 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
107 & d1 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
108 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
109 & d2 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
110 & d7 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
111 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
112 register save area & & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
113 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
114 local data & & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
115 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
116 link and frame register & x30 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
117 & x29 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
118 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
119 parameter area & \vdots & & \\
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 \end{tabular}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 \caption{Stack layout on arm64}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 \end{figure}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 \newpage
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 \subsubsection{Apple's ARM64 Function Calling Conventions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 \paragraph{Overview}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 Apple's ARM64 calling convention is based on the AAPCS64 standard, however, diverges in some ways.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 Only the differences are listed here, for more details, take a look at Apple's official documentation \cite{AppleARM64}.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 \item arguments passed via stack use only the space they need, but are subject to the type alignment requirements (which is 1 byte for char and bool, 2 for short, 4 for int and 8 for every other type)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 \item caller is required to sign and zero-extend arguments smaller than 32bits
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139