annotate doc/manual/callconvs/callconv_arm64.tex @ 92:5c3fa8897e0e

- manual work * better html output * added min width for calling convention diagrams * some cleanups
author cslag
date Sat, 04 Jun 2016 12:33:09 +0200
parents e932e6331f35
children 9e99918065e6
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).\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 For more details, take a look at the Procedure Call Standard for the ARM 64-bit Architecture \cite{AAPCS64}.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 \paragraph{\product{dyncall} support}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 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
34
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 \subsubsection{AAPCS64 Calling Convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 \paragraph{Registers and register usage}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
68
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
39 ARM64 features thirty-one 64 bit general purpose registers, namely x0-x30.
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
40 Also, there is SP, a register with restricted use, used for the stack pointer,
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
41 and PC dedicated as program counter. Additionally, there are thirty-two 128 bit
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
42 registers v0-v31, to be used as SIMD and floating point registers, referred to
b36a2fe30602 - cleanup
cslag
parents: 0
diff changeset
43 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
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 \begin{table}[h]
77
e441ef3ec782 - manual layout tweaks
cslag
parents: 76
diff changeset
46 \begin{tabular*}{0.95\textwidth}{3 B}
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 Name & Brief description\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 {\bf x0-x7} & parameters, scratch, return value\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 {\bf x8} & indirect result location pointer\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 {\bf x9-x15} & scratch\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 {\bf x16} & permanent in some cases, can have special function (IP0), see doc\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 {\bf x17} & permanent in some cases, can have special function (IP1), see doc\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 {\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
55 {\bf x19-x28} & permanent\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 {\bf x29} & permanent, frame pointer\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 {\bf x30} & permanent, link register\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 {\bf SP} & permanent, stack pointer\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 {\bf PC} & program counter\\
76
7ca46969e0ad - tweaks in manual, mainly for html generation
cslag
parents: 68
diff changeset
60 \end{tabular*}
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 \caption{Register usage on arm64}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 \paragraph{Parameter passing}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 \item stack parameter order: right-to-left
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 \item caller cleans up the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 \item first 8 integer arguments are passed using x0-x7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 \item first 8 floating point arguments are passed using d0-d7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 \item subsequent parameters are pushed onto the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 \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
73 \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
74 \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
75 \item stack is required to be throughout eight-byte aligned
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 \paragraph{Return values}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 \item integer return values use x0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 \item floating-point return values use d0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 \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
83 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 \paragraph{Stack layout}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 Stack directly after function prolog:\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 \begin{figure}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 \begin{tabular}{5|3|1 1}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 \hhline{~-~~}
92
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
92 & \vdots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
93 \hhline{~=~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
94 register save area & \hspace{4cm} & & \mrrbrace{5}{caller's frame} \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
95 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
96 local data & & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
97 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
98 \mrlbrace{13}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
99 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
100 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
101 \hhline{~=~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
102 & x0 & \mrrbrace{10}{spill area (if needed)} & \mrrbrace{15}{current frame} \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
103 & x1 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
104 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
105 & x2 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
106 & x7 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
107 & d0 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
108 & d1 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
109 & \ldots & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
110 & d2 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
111 & d7 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
112 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
113 register save area & & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
114 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
115 local data & & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
116 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
117 link and frame register & x30 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
118 & x29 & & \\
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
119 \hhline{~-~~}
5c3fa8897e0e - manual work
cslag
parents: 90
diff changeset
120 parameter area & \vdots & & \\
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 \end{tabular}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 \caption{Stack layout on arm64}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 \end{figure}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 \newpage
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 \subsubsection{Apple's ARM64 Function Calling Conventions}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 \paragraph{Overview}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 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
134 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
135
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 \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
138 \item caller is required to sign and zero-extend arguments smaller than 32bits
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140