Mercurial > pub > dyncall > dyncall
comparison doc/manual/callconvs/callconv_ppc32.tex @ 328:276eb8c87aa0
- review and fixes, cleanup, amendments to calling convention appendix of manual
author | Tassilo Philipp |
---|---|
date | Fri, 22 Nov 2019 23:11:56 +0100 |
parents | cde7b1f3b8f2 |
children | 74c056b597b7 |
comparison
equal
deleted
inserted
replaced
327:c0390dc85a07 | 328:276eb8c87aa0 |
---|---|
1 %////////////////////////////////////////////////////////////////////////////// | 1 %////////////////////////////////////////////////////////////////////////////// |
2 % | 2 % |
3 % Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>, | 3 % Copyright (c) 2007-2019 Daniel Adler <dadler@uni-goettingen.de>, |
4 % Tassilo Philipp <tphilipp@potion-studios.com> | 4 % Tassilo Philipp <tphilipp@potion-studios.com> |
5 % | 5 % |
6 % Permission to use, copy, modify, and distribute this software for any | 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 | 7 % purpose with or without fee is hereby granted, provided that the above |
8 % copyright notice and this permission notice appear in all copies. | 8 % copyright notice and this permission notice appear in all copies. |
18 %////////////////////////////////////////////////////////////////////////////// | 18 %////////////////////////////////////////////////////////////////////////////// |
19 | 19 |
20 % ================================================== | 20 % ================================================== |
21 % PowerPC 32 | 21 % PowerPC 32 |
22 % ================================================== | 22 % ================================================== |
23 \subsection{PowerPC (32bit) Calling Convention} | 23 \subsection{PowerPC (32bit) Calling Conventions} |
24 | 24 |
25 \paragraph{Overview} | 25 \paragraph{Overview} |
26 | 26 |
27 \begin{itemize} | 27 \begin{itemize} |
28 \item Word size is 32 bits | 28 \item Word size is 32 bits |
33 \item PowerPC EABI is defined in the "PowerPC Embedded Application Binary Interface 32-Bit Implementation". | 33 \item PowerPC EABI is defined in the "PowerPC Embedded Application Binary Interface 32-Bit Implementation". |
34 \end{itemize} | 34 \end{itemize} |
35 | 35 |
36 \paragraph{\product{dyncall} support} | 36 \paragraph{\product{dyncall} support} |
37 | 37 |
38 \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. | 38 \product{Dyncall} and \product{dyncallback} are supported for PowerPC (32bit) Big Endian (MSB), for Darwin's and System V's calling convention. |
39 | 39 |
40 | 40 |
41 \subsubsection{Mac OS X/Darwin} | 41 \subsubsection{Mac OS X/Darwin} |
42 | 42 |
43 \paragraph{Registers and register usage} | 43 \paragraph{Registers and register usage} |
47 Name & Brief description\\ | 47 Name & Brief description\\ |
48 \hline | 48 \hline |
49 {\bf gpr0} & scratch\\ | 49 {\bf gpr0} & scratch\\ |
50 {\bf gpr1} & stack pointer\\ | 50 {\bf gpr1} & stack pointer\\ |
51 {\bf gpr2} & scratch\\ | 51 {\bf gpr2} & scratch\\ |
52 {\bf gpr3,gpr4} & return value, parameter 0 and 1 for integer or pointer\\ | 52 {\bf gpr3,gpr4} & return value, parameter 0 and 1 for integer or pointer, scratch\\ |
53 {\bf gpr5-gpr10} & parameter 2-7 for integer or pointer parameters\\ | 53 {\bf gpr5-gpr10} & parameter 2-7 for integer or pointer parameters, scratch\\ |
54 {\bf gpr11} & permanent\\ | 54 {\bf gpr11} & preserve\\ |
55 {\bf gpr12} & branch target for dynamic code generation\\ | 55 {\bf gpr12} & branch target for dynamic code generation\\ |
56 {\bf gpr13-31} & permanent\\ | 56 {\bf gpr13-31} & preserve\\ |
57 {\bf fpr0} & scratch\\ | 57 {\bf fpr0} & scratch\\ |
58 {\bf fpr1} & floating point return value, floating point parameter 0 (always double precision)\\ | 58 {\bf fpr1} & floating point return value, floating point parameter 0 (always double precision)\\ |
59 {\bf fpr2-fpr13} & floating point parameters 1-12 (always double precision)\\ | 59 {\bf fpr2-fpr13} & floating point parameters 1-12 (always double precision)\\ |
60 {\bf fpr14-fpr31} & permanent\\ | 60 {\bf fpr14-fpr31} & preserve\\ |
61 {\bf v0-v1} & scratch\\ | 61 {\bf v0-v1} & scratch\\ |
62 {\bf v2-v13} & vector parameters\\ | 62 {\bf v2-v13} & vector parameters\\ |
63 {\bf v14-v19} & scratch\\ | 63 {\bf v14-v19} & scratch\\ |
64 {\bf v20-v31} & permanent\\ | 64 {\bf v20-v31} & preserve\\ |
65 {\bf lr} & scratch, link-register\\ | 65 {\bf lr} & link-register, scratch\\ |
66 {\bf ctr} & scratch, count-register\\ | 66 {\bf ctr} & count-register, scratch\\ |
67 {\bf cr0-cr1} & scratch\\ | 67 {\bf cr0-cr7} & conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ |
68 {\bf cr2-cr4} & permanent\\ | |
69 {\bf cr5-cr7} & scratch\\ | |
70 \end{tabular*} | 68 \end{tabular*} |
71 \caption{Register usage on Darwin PowerPC 32-Bit} | 69 \caption{Register usage on Darwin PowerPC 32-Bit} |
72 \end{table} | 70 \end{table} |
73 | 71 |
74 \paragraph{Parameter passing} | 72 \paragraph{Parameter passing} |
75 | 73 |
76 \begin{itemize} | 74 \begin{itemize} |
75 \item stack grows down | |
77 \item stack parameter order: right-to-left | 76 \item stack parameter order: right-to-left |
78 \item caller cleans up the stack | 77 \item caller cleans up the stack |
79 \item the first 8 integer parameters are passed in registers gpr3-gpr10 | 78 \item the first 8 integer parameters are passed in registers gpr3-gpr10 |
80 \item the first 12 floating point parameters are passed in registers fpr1-fpr13 | 79 \item the first 12 floating point parameters are passed in registers fpr1-fpr13 |
80 \item 64 bit arguments are passed as if they were two 32 bit arguments, without skipping registers for alignment (this means passing half via a register and half via the stack is allowed) | |
81 \item if a float parameter is passed via a register, gpr registers are skipped for subsequent integer parameters (based on the size of | 81 \item if a float parameter is passed via a register, gpr registers are skipped for subsequent integer parameters (based on the size of |
82 the float - 1 register for single precision and 2 for double precision floating point values) | 82 the float - 1 register for single precision and 2 for double precision floating point values) |
83 \item the caller pushes subsequent parameters onto the stack | 83 \item the caller pushes subsequent parameters onto the stack |
84 \item for every parameter passed via a register, space is reserved in the stack parameter area (in order to spill the parameters if | 84 \item for every parameter passed via a register, space is reserved in the stack parameter area (in order to spill the parameters if |
85 needed - e.g. varargs) | 85 needed - e.g. varargs) |
102 \item floating point values are returned via fpr1 | 102 \item floating point values are returned via fpr1 |
103 \item structures \textless=\ 64 bits use gpr3 and gpr4 | 103 \item structures \textless=\ 64 bits use gpr3 and gpr4 |
104 \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed | 104 \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed |
105 \end{itemize} | 105 \end{itemize} |
106 | 106 |
107 \pagebreak | |
108 | 107 |
109 \paragraph{Stack layout} | 108 \paragraph{Stack layout} |
110 | 109 |
111 Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ | 110 % verified/amended: TP nov 2019 (see also doc/disas_examples/ppc.darwin.disas) |
111 Stack frame is always 16-byte aligned. Prolog opens frame with additional, fixed space for a linkage area, to hold a number of values (not all of them are required to be saved, though). Stack directly after function prolog:\\ | |
112 | 112 |
113 \begin{figure}[h] | 113 \begin{figure}[h] |
114 \begin{tabular}{5|3|1 1} | 114 \begin{tabular}{5|3|1 1} |
115 \hhline{~-~~} | 115 & \vdots & & \\ |
116 & \vdots & & \\ | 116 \hhline{~=~~} |
117 \hhline{~=~~} | 117 register save area & \hspace{4cm} & & \mrrbrace{14}{caller's frame} \\ |
118 local data & \hspace{4cm} & & \mrrbrace{13}{caller's frame} \\ | 118 \hhline{~-~~} |
119 \hhline{~-~~} | 119 local data & & & \\ |
120 \mrlbrace{6}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ | 120 \hhline{~-~~} |
121 & \ldots & & \\ | 121 \mrlbrace{6}{parameter area} & last arg & \mrrbrace{3}{stack parameters} & \\ |
122 & \ldots & & \\ | 122 & \ldots & & \\ |
123 & \ldots & \mrrbrace{3}{spill area (as needed)} & \\ | 123 & 9th word of arg data & & \\ |
124 & \ldots & & \\ | 124 & gpr10 & \mrrbrace{3}{spill area (as needed)} & \\ |
125 & gpr3 or fpr1 & & \\ | 125 & \ldots & & \\ |
126 \hhline{~-~~} | 126 & gpr3 & & \\ |
127 \mrlbrace{6}{linkage area} & reserved & & \\ | 127 \hhline{~-~~} |
128 & reserved & & \\ | 128 \mrlbrace{6}{linkage area} & reserved & & \\ |
129 & reserved & & \\ | 129 & reserved & & \\ |
130 & return address & & \\ | 130 & reserved & & \\ |
131 & reserved for callee & & \\ | 131 & return address (callee saved) & & \\ |
132 & saved by callee & & \\ | 132 & condition reg (callee saved) & & \\ |
133 \hhline{~=~~} | 133 & parent stack frame pointer & & \\ |
134 local data & & & \mrrbrace{3}{current frame} \\ | 134 \hhline{~=~~} |
135 \hhline{~-~~} | 135 register save area & & & \mrrbrace{4}{current frame} \\ |
136 parameter area & & & \\ | 136 \hhline{~-~~} |
137 \hhline{~-~~} | 137 local data & & & \\ |
138 linkage area & \vdots & & \\ | 138 \hhline{~-~~} |
139 \hhline{~-~~} | 139 parameter area & & & \\ |
140 \hhline{~-~~} | |
141 linkage area & \vdots & & \\ | |
140 \end{tabular} | 142 \end{tabular} |
141 \caption{Stack layout on ppc32 Darwin} | 143 \caption{Stack layout on ppc32 Darwin} |
142 \end{figure} | 144 \end{figure} |
143 | 145 |
146 | |
147 \newpage | |
148 | |
149 | |
144 \subsubsection{System V PPC 32-bit} | 150 \subsubsection{System V PPC 32-bit} |
145 | 151 |
146 \paragraph{Status} | 152 \paragraph{Status} |
147 | |
148 \begin{itemize} | |
149 \item C++ this calls do not work. | |
150 \end{itemize} | |
151 | 153 |
152 \paragraph{Registers and register usage} | 154 \paragraph{Registers and register usage} |
153 | 155 |
154 \begin{table}[h] | 156 \begin{table}[h] |
155 \begin{tabular*}{0.95\textwidth}{3 B} | 157 \begin{tabular*}{0.95\textwidth}{3 B} |
156 Name & Brief description\\ | 158 Name & Brief description\\ |
157 \hline | 159 \hline |
158 {\bf r0} & scratch\\ | 160 {\bf r0} & scratch\\ |
159 {\bf r1} & stack pointer\\ | 161 {\bf r1} & stack pointer, preserve\\ |
160 {\bf r2} & system-reserved\\ | 162 {\bf r2} & system-reserved\\ |
161 {\bf r3-r4} & parameter passing and return value\\ | 163 {\bf r3-r4} & parameter passing and return value, scratch\\ |
162 {\bf r5-r10} & parameter passing\\ | 164 {\bf r5-r10} & parameter passing, scratch\\ |
163 {\bf r11-r12} & scratch\\ | 165 {\bf r11-r12} & scratch\\ |
164 {\bf r13} & Small data area pointer register\\ | 166 {\bf r13} & small data area pointer register\\ |
165 {\bf r14-r30} & Local variables\\ | 167 {\bf r14-r30} & local variables, preserve\\ |
166 {\bf r31} & Used for local variables or \emph{environment pointer}\\ | 168 {\bf r31} & used for local variables or \emph{environment pointer}, preserve\\ |
167 {\bf f0} & scratch\\ | 169 {\bf f0} & scratch\\ |
168 {\bf f1} & parameter passing and return value\\ | 170 {\bf f1} & parameter passing and return value, scratch\\ |
169 {\bf f2-f8} & parameter passing\\ | 171 {\bf f2-f8} & parameter passing, scratch\\ |
170 {\bf f9-13} & scratch\\ | 172 {\bf f9-13} & scratch\\ |
171 {\bf f14-f31} & Local variables\\ | 173 {\bf f14-f31} & local variables, preserve\\ |
172 {\bf cr0-cr7} & Conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ | 174 {\bf cr0-cr7} & conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ |
173 {\bf lr} & Link register (scratch)\\ | 175 {\bf lr} & link register, scratch\\ |
174 {\bf ctr} & Count register (scratch) \\ | 176 {\bf ctr} & count register, scratch \\ |
175 {\bf xer} & Fixed-point exception register (scratch)\\ | 177 {\bf xer} & fixed-point exception register, scratch\\ |
176 {\bf fpscr} & Floating-point Status and Control Register\\ | 178 {\bf fpscr} & floating-point Status and Control Register\\ |
177 % {\bf v0-v1} & scratch\\ | 179 % {\bf v0-v1} & scratch\\ |
178 % {\bf v2-v13} & vector parameters\\ | 180 % {\bf v2-v13} & vector parameters\\ |
179 % {\bf v14-v19} & scratch\\ | 181 % {\bf v14-v19} & scratch\\ |
180 % {\bf v20-v31} & permanent\\ | 182 % {\bf v20-v31} & permanent\\ |
181 % {\bf lr} & scratch, link-register\\ | 183 % {\bf lr} & scratch, link-register\\ |
193 \item Stack pointer (r1) is always 16-byte aligned. The EABI differs here - it is 8-byte alignment. | 195 \item Stack pointer (r1) is always 16-byte aligned. The EABI differs here - it is 8-byte alignment. |
194 \item 8 general-purpose registers (r3-r10) for integer and pointer types. | 196 \item 8 general-purpose registers (r3-r10) for integer and pointer types. |
195 \item 8 floating-pointer registers (f1-f8) for float (promoted to double) and double types. | 197 \item 8 floating-pointer registers (f1-f8) for float (promoted to double) and double types. |
196 \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. | 198 \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. |
197 \item 64-bit integer data types are passed in general-purpose registers as a whole in two | 199 \item 64-bit integer data types are passed in general-purpose registers as a whole in two |
198 32-bit general purpose registers (an odd and an even e.g. r3 and r4), probably skipping an even integer register. | 200 32-bit general purpose registers (an odd and an even e.g. r3 and r4), skipping an even integer register |
199 or passed on the stack. They are never splitted into a register and stack part. | 201 or passed on the stack; they are never splitted into a register and stack part |
200 \item Ellipse calls set CR bit 6 | 202 \item Ellipse calls set CR bit 6 |
201 \item integer parameters \textless\ 32 bit are right-justified (meaning occupy high-order bytes) in their 4-byte area, requiring extra-care for big-endian targets | 203 \item integer parameters \textless\ 32 bit are right-justified (meaning occupy high-order bytes) in their 4-byte area, requiring extra-care for big-endian targets |
204 \item no spill area is used on stack, iterating over varargs requires a specific va\_list implementation | |
202 \end{itemize} | 205 \end{itemize} |
203 | 206 |
204 \paragraph{Return values} | 207 \paragraph{Return values} |
205 | 208 |
206 \begin{itemize} | 209 \begin{itemize} |
207 \item 32-bit integers use register r3, 64-bit use registers r3 and r4 (hiword in r3, loword in r4). | 210 \item 32-bit integers use register r3, 64-bit use registers r3 and r4 (hiword in r3, loword in r4). |
208 \item floating-point values are returned using register f1. | 211 \item floating-point values are returned using register f1. |
209 \end{itemize} | 212 \end{itemize} |
210 | 213 |
211 \pagebreak | |
212 | 214 |
213 \paragraph{Stack layout} | 215 \paragraph{Stack layout} |
214 | 216 |
217 % verified/amended: TP nov 2019 (see also doc/disas_examples/ppc.sysv.disas) | |
215 Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ | 218 Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ |
216 | 219 |
217 \begin{figure}[h] | 220 \begin{figure}[h] |
218 \begin{tabular}{5|3|1 1} | 221 \begin{tabular}{5|3|1 1} |
219 \hhline{~-~~} | 222 & \vdots & & \\ |
220 & \vdots & & \\ | 223 \hhline{~=~~} |
221 \hhline{~=~~} | 224 register save area & \hspace{4cm} & & \mrrbrace{7}{caller's frame} \\ |
222 local data & \hspace{4cm} & & \mrrbrace{6}{caller's frame} \\ | 225 \hhline{~-~~} |
223 \hhline{~-~~} | 226 local data & & & \\ |
224 \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ | 227 \hhline{~-~~} |
225 & \ldots & & \\ | 228 \mrlbrace{3}{parameter area} & last arg & \mrrbrace{3}{stack parameters} & \\ |
226 & \ldots & & \\ | 229 & \ldots & & \\ |
227 \hhline{~-~~} | 230 & first arg passed via stack & & \\ |
228 & saved return address (for callee) & & \\ | 231 \hhline{~-~~} |
229 \hhline{~-~~} | 232 & return address (callee saved) & & \\ |
230 & parent stack frame pointer & & \\ | 233 \hhline{~-~~} |
231 \hhline{~=~~} | 234 & parent stack frame pointer & & \\ |
232 local data & & & \mrrbrace{3}{current frame} \\ | 235 \hhline{~=~~} |
233 \hhline{~-~~} | 236 register save area & & & \mrrbrace{4}{current frame} \\ |
234 parameter area & & & \\ | 237 \hhline{~-~~} |
235 \hhline{~-~~} | 238 local data & & & \\ |
236 & \vdots & & \\ | 239 \hhline{~-~~} |
237 \hhline{~-~~} | 240 parameter area & & & \\ |
241 \hhline{~-~~} | |
242 & \vdots & & \\ | |
238 \end{tabular} | 243 \end{tabular} |
239 \\ | |
240 \\ | |
241 \\ | |
242 \caption{Stack layout on System V ABI for PowerPC 32-bit calling convention} | 244 \caption{Stack layout on System V ABI for PowerPC 32-bit calling convention} |
243 \end{figure} | 245 \end{figure} |
246 |