0
|
1 %//////////////////////////////////////////////////////////////////////////////
|
|
2 %
|
|
3 % Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>,
|
|
4 % Tassilo Philipp <tphilipp@potion-studios.com>
|
|
5 %
|
|
6 % Permission to use, copy, modify, and distribute this software for any
|
|
7 % purpose with or without fee is hereby granted, provided that the above
|
|
8 % copyright notice and this permission notice appear in all copies.
|
|
9 %
|
|
10 % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
11 % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
12 % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
13 % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
14 % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
15 % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
16 % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
17 %
|
|
18 %//////////////////////////////////////////////////////////////////////////////
|
|
19
|
|
20 % ==================================================
|
|
21 % PowerPC 32
|
|
22 % ==================================================
|
|
23 \subsection{PowerPC (32bit) Calling Convention}
|
|
24
|
|
25 \paragraph{Overview}
|
|
26
|
|
27 \begin{itemize}
|
|
28 \item Word size is 32 bits
|
|
29 \item Big endian (MSB) and litte endian (LSB) operating modes.
|
|
30 \item Processor operates on floats in double precision floating point arithmetc (IEEE-754) values directly (single precision is converted on the fly)
|
|
31 \item Apple Mac OS X/Darwin PPC is specified in "Mac OS X ABI Function Call Guide"\cite{ppcMacOSX}. It uses Big Endian (MSB).
|
|
32 \item Linux PPC 32-bit ABI is specified in "LSB for PPC"\cite{ppc32LSB} which is based on "System V ABI". It uses Big Endian (MSB).
|
|
33 \item PowerPC EABI is defined in the "PowerPC Embedded Application Binary Interface 32-Bit Implementation".
|
|
34 \end{itemize}
|
|
35
|
|
36
|
|
37 \paragraph{\product{dyncall} support}
|
|
38
|
|
39 \product{Dyncall} and \product{dyncallback} are supported for PowerPC (32bit) Big Endian (MSB) on Darwin (tested on Apple Mac OS X) and Linux, however, fail for *BSD.
|
|
40
|
|
41
|
|
42 \subsubsection{Mac OS X/Darwin}
|
|
43
|
|
44 \paragraph{Registers and register usage}
|
|
45
|
|
46 \begin{table}[h]
|
|
47 \begin{tabular}{3 B}
|
|
48 \hline
|
|
49 Name & Brief description\\
|
|
50 \hline
|
|
51 {\bf gpr0} & scratch\\
|
|
52 {\bf gpr1} & stack pointer\\
|
|
53 {\bf gpr2} & scratch\\
|
|
54 {\bf gpr3} & return value, parameter 0 if integer or pointer\\
|
|
55 {\bf gpr4-gpr10} & return value, parameter 1-7 for integer or pointer parameters\\
|
|
56 {\bf gpr11} & permanent\\
|
|
57 {\bf gpr12} & branch target for dynamic code generation\\
|
|
58 {\bf gpr13-31} & permanent\\
|
|
59 {\bf fpr0} & scratch\\
|
|
60 {\bf fpr1-fpr13} & parameter 0-12 for floating point (always double precision)\\
|
|
61 {\bf fpr14-fpr31} & permanent\\
|
|
62 {\bf v0-v1} & scratch\\
|
|
63 {\bf v2-v13} & vector parameters\\
|
|
64 {\bf v14-v19} & scratch\\
|
|
65 {\bf v20-v31} & permanent\\
|
|
66 {\bf lr} & scratch, link-register\\
|
|
67 {\bf ctr} & scratch, count-register\\
|
|
68 {\bf cr0-cr1} & scratch\\
|
|
69 {\bf cr2-cr4} & permanent\\
|
|
70 {\bf cr5-cr7} & scratch\\
|
|
71 \hline
|
|
72 \end{tabular}
|
|
73 \caption{Register usage on Darwin PowerPC 32-Bit}
|
|
74 \end{table}
|
|
75
|
|
76 \paragraph{Parameter passing}
|
|
77
|
|
78 \begin{itemize}
|
|
79 \item stack parameter order: right-to-left@@@?
|
|
80 \item caller cleans up the stack@@@?
|
|
81 \item the first 8 integer parameters are passed in registers gpr3-gpr10
|
|
82 \item the first 12 floating point parameters are passed in registers fpr1-fpr13
|
|
83 \item if a float parameter is passed via a register, gpr registers are skipped for subsequent integer parameters (based on the size of
|
|
84 the float - 1 register for single precision and 2 for double precision floating point values)
|
|
85 \item the caller pushes subsequent parameters onto the stack
|
|
86 \item for every parameter passed via a register, space is reserved in the stack parameter area (in order to spill the parameters if
|
|
87 needed - e.g. varargs)
|
|
88 \item ellipsis calls take floating point values in int and float registers (single precision floats are promoted to double precision
|
|
89 as defined for ellipsis calls)
|
|
90 \item all nonvector parameters are aligned on 4-byte boundaries
|
|
91 \item vector parameters are aligned on 16-byte boundaries
|
|
92 \item integer parameters \textless\ 32 bit occupy high-order bytes of their 4-byte area
|
|
93 \item composite parameters with size of 1 or 2 bytes occupy low-order bytes of their 4-byte area. INCONSISTENT with other 32-bit PPC
|
|
94 binary interfaces. In AIX and OS 9, padding bytes always follow the data structure
|
|
95 \item composite parameters 3 bytes or larger in size occupy high-order bytes
|
|
96 \end{itemize}
|
|
97
|
|
98
|
|
99 \paragraph{Return values}
|
|
100
|
|
101 \begin{itemize}
|
|
102 \item return values of integer \textless=\ 32bit or pointer type use gpr3
|
|
103 \item 64 bit integers use gpr3 and gpr4 (hiword in gpr3, loword in gpr4)
|
|
104 \item floating point values are returned via fpr1
|
|
105 \item structures \textless=\ 64 bits use gpr3 and gpr4
|
|
106 \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed
|
|
107 \end{itemize}
|
|
108
|
|
109 \pagebreak
|
|
110
|
|
111 \paragraph{Stack layout}
|
|
112
|
|
113 Stack frame is always 16-byte aligned. Stack directly after function prolog:\\
|
|
114
|
|
115 \begin{figure}[h]
|
|
116 \begin{tabular}{5|3|1 1}
|
|
117 \hhline{~-~~}
|
|
118 & \vdots & & \\
|
|
119 \hhline{~=~~}
|
|
120 local data & & & \mrrbrace{13}{caller's frame} \\
|
|
121 \hhline{~-~~}
|
|
122 \mrlbrace{6}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\
|
|
123 & \ldots & & \\
|
|
124 & \ldots & & \\
|
|
125 & \ldots & \mrrbrace{3}{spill area (as needed)} & \\
|
|
126 & \ldots & & \\
|
|
127 & gpr3 or fpr1 & & \\
|
|
128 \hhline{~-~~}
|
|
129 \mrlbrace{6}{linkage area} & reserved & & \\
|
|
130 & reserved & & \\
|
|
131 & reserved & & \\
|
|
132 & return address & & \\
|
|
133 & reserved for callee & & \\
|
|
134 & saved by callee & & \\
|
|
135 \hhline{~=~~}
|
|
136 local data & & & \mrrbrace{3}{current frame} \\
|
|
137 \hhline{~-~~}
|
|
138 parameter area & & & \\
|
|
139 \hhline{~-~~}
|
|
140 linkage area & \vdots & & \\
|
|
141 \hhline{~-~~}
|
|
142 \end{tabular}
|
|
143 \caption{Stack layout on ppc32 Darwin}
|
|
144 \end{figure}
|
|
145
|
|
146 \subsubsection{System V PPC 32-bit}
|
|
147
|
|
148 \paragraph{Status}
|
|
149
|
|
150 \begin{itemize}
|
|
151 \item C++ this calls do not work.
|
|
152 \item Callbacks don't work on *BSD.
|
|
153 \end{itemize}
|
|
154
|
|
155 \paragraph{Registers and register usage}
|
|
156
|
|
157 \begin{table}[h]
|
|
158 \begin{tabular}{3 B}
|
|
159 \hline
|
|
160 Name & Brief description\\
|
|
161 \hline
|
|
162 {\bf r0} & scratch\\
|
|
163 {\bf r1} & stack pointer\\
|
|
164 {\bf r2} & system-reserved\\
|
|
165 {\bf r3-r4} & parameter passing and return value\\
|
|
166 {\bf r5-r10} & parameter passing\\
|
|
167 {\bf r11-r12} & scratch\\
|
|
168 {\bf r13} & Small data area pointer register\\
|
|
169 {\bf r14-r30} & Local variables\\
|
|
170 {\bf r31} & Used for local variables or \emph{environment pointer}\\
|
|
171 {\bf f0} & scratch\\
|
|
172 {\bf f1} & parameter passing and return value\\
|
|
173 {\bf f2-f8} & parameter passing\\
|
|
174 {\bf f9-13} & scratch\\
|
|
175 {\bf f14-f31} & Local variables\\
|
|
176 {\bf cr0-cr7} & Conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\
|
|
177 {\bf lr} & Link register (scratch)\\
|
|
178 {\bf ctr} & Count register (scratch) \\
|
|
179 {\bf xer} & Fixed-point exception register (scratch)\\
|
|
180 {\bf fpscr} & Floating-point Status and Control Register\\
|
|
181
|
|
182 % {\bf v0-v1} & scratch\\
|
|
183 % {\bf v2-v13} & vector parameters\\
|
|
184 % {\bf v14-v19} & scratch\\
|
|
185 % {\bf v20-v31} & permanent\\
|
|
186 % {\bf lr} & scratch, link-register\\
|
|
187 % {\bf ctr} & scratch, count-register\\
|
|
188 % {\bf cr0-cr1} & scratch\\
|
|
189 % {\bf cr2-cr4} & permanent\\
|
|
190 % {\bf cr5-cr7} & scratch\\
|
|
191 \hline
|
|
192 \end{tabular}
|
|
193 \caption{Register usage on System V ABI PowerPC Processor}
|
|
194 \end{table}
|
|
195
|
|
196 \paragraph{Parameter passing}
|
|
197
|
|
198 \begin{itemize}
|
|
199 \item Stack pointer (r1) is always 16-byte aligned. The EABI differs here - it is 8-byte alignment.
|
|
200 \item 8 general-purpose registers (r3-r10) for integer and pointer types.
|
|
201 \item 8 floating-pointer registers (f1-f8) for float (promoted to double) and double types.
|
|
202 \item Additional arguments are passed on the stack directly after the back-chain and saved return address (8 bytes structure) on the callers stack frame.
|
|
203 \item 64-bit integer data types are passed in general-purpose registers as a whole in two
|
|
204 32-bit general purpose registers (an odd and an even e.g. r3 and r4), probably skipping an even integer register.
|
|
205 or passed on the stack. They are never splitted into a register and stack part.
|
|
206 \item Ellipse calls set CR bit 6
|
|
207
|
|
208 \end{itemize}
|
|
209
|
|
210 \paragraph{Return values}
|
|
211
|
|
212 \begin{itemize}
|
|
213 \item 32-bit integers use register r3, 64-bit use registers r3 and r4 (hiword in r3, loword in r4).
|
|
214 \item floating-point values are returned using register f1.
|
|
215 \end{itemize}
|
|
216
|
|
217 \pagebreak
|
|
218
|
|
219 \paragraph{Stack layout}
|
|
220
|
|
221 Stack frame is always 16-byte aligned. Stack directly after function prolog:\\
|
|
222
|
|
223 \begin{figure}[h]
|
|
224 \begin{tabular}{5|3|1 1}
|
|
225 \hhline{~-~~}
|
|
226 & \vdots & & \\
|
|
227 \hhline{~=~~}
|
|
228 local data & & & \mrrbrace{6}{caller's frame} \\
|
|
229 \hhline{~-~~}
|
|
230 \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\
|
|
231 & \ldots & & \\
|
|
232 & \ldots & & \\
|
|
233 \hhline{~-~~}
|
|
234 & saved return address (for callee) & & \\
|
|
235 \hhline{~-~~}
|
|
236 & parent stack frame pointer & & \\
|
|
237 \hhline{~=~~}
|
|
238 local data & & & \mrrbrace{3}{current frame} \\
|
|
239 \hhline{~-~~}
|
|
240 parameter area & & & \\
|
|
241 \hhline{~-~~}
|
|
242 & \vdots & & \\
|
|
243 \hhline{~-~~}
|
|
244 \end{tabular}
|
|
245 \\
|
|
246 \\
|
|
247 \\
|
|
248 \caption{Stack layout on System V ABI for PowerPC 32-bit calling convention}
|
|
249 \end{figure}
|