Mercurial > pub > dyncall > dyncall
diff 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 |
line wrap: on
line diff
--- a/doc/manual/callconvs/callconv_ppc32.tex Fri Nov 22 23:08:59 2019 +0100 +++ b/doc/manual/callconvs/callconv_ppc32.tex Fri Nov 22 23:11:56 2019 +0100 @@ -1,6 +1,6 @@ %////////////////////////////////////////////////////////////////////////////// % -% Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>, +% Copyright (c) 2007-2019 Daniel Adler <dadler@uni-goettingen.de>, % Tassilo Philipp <tphilipp@potion-studios.com> % % Permission to use, copy, modify, and distribute this software for any @@ -20,7 +20,7 @@ % ================================================== % PowerPC 32 % ================================================== -\subsection{PowerPC (32bit) Calling Convention} +\subsection{PowerPC (32bit) Calling Conventions} \paragraph{Overview} @@ -35,7 +35,7 @@ \paragraph{\product{dyncall} support} -\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. +\product{Dyncall} and \product{dyncallback} are supported for PowerPC (32bit) Big Endian (MSB), for Darwin's and System V's calling convention. \subsubsection{Mac OS X/Darwin} @@ -49,24 +49,22 @@ {\bf gpr0} & scratch\\ {\bf gpr1} & stack pointer\\ {\bf gpr2} & scratch\\ -{\bf gpr3,gpr4} & return value, parameter 0 and 1 for integer or pointer\\ -{\bf gpr5-gpr10} & parameter 2-7 for integer or pointer parameters\\ -{\bf gpr11} & permanent\\ +{\bf gpr3,gpr4} & return value, parameter 0 and 1 for integer or pointer, scratch\\ +{\bf gpr5-gpr10} & parameter 2-7 for integer or pointer parameters, scratch\\ +{\bf gpr11} & preserve\\ {\bf gpr12} & branch target for dynamic code generation\\ -{\bf gpr13-31} & permanent\\ +{\bf gpr13-31} & preserve\\ {\bf fpr0} & scratch\\ {\bf fpr1} & floating point return value, floating point parameter 0 (always double precision)\\ {\bf fpr2-fpr13} & floating point parameters 1-12 (always double precision)\\ -{\bf fpr14-fpr31} & permanent\\ +{\bf fpr14-fpr31} & preserve\\ {\bf v0-v1} & scratch\\ {\bf v2-v13} & vector parameters\\ {\bf v14-v19} & scratch\\ -{\bf v20-v31} & permanent\\ -{\bf lr} & scratch, link-register\\ -{\bf ctr} & scratch, count-register\\ -{\bf cr0-cr1} & scratch\\ -{\bf cr2-cr4} & permanent\\ -{\bf cr5-cr7} & scratch\\ +{\bf v20-v31} & preserve\\ +{\bf lr} & link-register, scratch\\ +{\bf ctr} & count-register, scratch\\ +{\bf cr0-cr7} & conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ \end{tabular*} \caption{Register usage on Darwin PowerPC 32-Bit} \end{table} @@ -74,10 +72,12 @@ \paragraph{Parameter passing} \begin{itemize} +\item stack grows down \item stack parameter order: right-to-left \item caller cleans up the stack \item the first 8 integer parameters are passed in registers gpr3-gpr10 \item the first 12 floating point parameters are passed in registers fpr1-fpr13 +\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) \item if a float parameter is passed via a register, gpr registers are skipped for subsequent integer parameters (based on the size of the float - 1 register for single precision and 2 for double precision floating point values) \item the caller pushes subsequent parameters onto the stack @@ -104,51 +104,53 @@ \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed \end{itemize} -\pagebreak \paragraph{Stack layout} -Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ +% verified/amended: TP nov 2019 (see also doc/disas_examples/ppc.darwin.disas) +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:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} + & \vdots & & \\ +\hhline{~=~~} +register save area & \hspace{4cm} & & \mrrbrace{14}{caller's frame} \\ \hhline{~-~~} - & \vdots & & \\ -\hhline{~=~~} -local data & \hspace{4cm} & & \mrrbrace{13}{caller's frame} \\ +local data & & & \\ \hhline{~-~~} -\mrlbrace{6}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ - & \ldots & & \\ - & \ldots & & \\ - & \ldots & \mrrbrace{3}{spill area (as needed)} & \\ - & \ldots & & \\ - & gpr3 or fpr1 & & \\ +\mrlbrace{6}{parameter area} & last arg & \mrrbrace{3}{stack parameters} & \\ + & \ldots & & \\ + & 9th word of arg data & & \\ + & gpr10 & \mrrbrace{3}{spill area (as needed)} & \\ + & \ldots & & \\ + & gpr3 & & \\ \hhline{~-~~} -\mrlbrace{6}{linkage area} & reserved & & \\ - & reserved & & \\ - & reserved & & \\ - & return address & & \\ - & reserved for callee & & \\ - & saved by callee & & \\ +\mrlbrace{6}{linkage area} & reserved & & \\ + & reserved & & \\ + & reserved & & \\ + & return address (callee saved) & & \\ + & condition reg (callee saved) & & \\ + & parent stack frame pointer & & \\ \hhline{~=~~} -local data & & & \mrrbrace{3}{current frame} \\ +register save area & & & \mrrbrace{4}{current frame} \\ +\hhline{~-~~} +local data & & & \\ \hhline{~-~~} -parameter area & & & \\ +parameter area & & & \\ \hhline{~-~~} -linkage area & \vdots & & \\ -\hhline{~-~~} +linkage area & \vdots & & \\ \end{tabular} \caption{Stack layout on ppc32 Darwin} \end{figure} + +\newpage + + \subsubsection{System V PPC 32-bit} \paragraph{Status} -\begin{itemize} -\item C++ this calls do not work. -\end{itemize} - \paragraph{Registers and register usage} \begin{table}[h] @@ -156,24 +158,24 @@ Name & Brief description\\ \hline {\bf r0} & scratch\\ -{\bf r1} & stack pointer\\ +{\bf r1} & stack pointer, preserve\\ {\bf r2} & system-reserved\\ -{\bf r3-r4} & parameter passing and return value\\ -{\bf r5-r10} & parameter passing\\ +{\bf r3-r4} & parameter passing and return value, scratch\\ +{\bf r5-r10} & parameter passing, scratch\\ {\bf r11-r12} & scratch\\ -{\bf r13} & Small data area pointer register\\ -{\bf r14-r30} & Local variables\\ -{\bf r31} & Used for local variables or \emph{environment pointer}\\ +{\bf r13} & small data area pointer register\\ +{\bf r14-r30} & local variables, preserve\\ +{\bf r31} & used for local variables or \emph{environment pointer}, preserve\\ {\bf f0} & scratch\\ -{\bf f1} & parameter passing and return value\\ -{\bf f2-f8} & parameter passing\\ +{\bf f1} & parameter passing and return value, scratch\\ +{\bf f2-f8} & parameter passing, scratch\\ {\bf f9-13} & scratch\\ -{\bf f14-f31} & Local variables\\ -{\bf cr0-cr7} & Conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ -{\bf lr} & Link register (scratch)\\ -{\bf ctr} & Count register (scratch) \\ -{\bf xer} & Fixed-point exception register (scratch)\\ -{\bf fpscr} & Floating-point Status and Control Register\\ +{\bf f14-f31} & local variables, preserve\\ +{\bf cr0-cr7} & conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\ +{\bf lr} & link register, scratch\\ +{\bf ctr} & count register, scratch \\ +{\bf xer} & fixed-point exception register, scratch\\ +{\bf fpscr} & floating-point Status and Control Register\\ % {\bf v0-v1} & scratch\\ % {\bf v2-v13} & vector parameters\\ % {\bf v14-v19} & scratch\\ @@ -195,10 +197,11 @@ \item 8 floating-pointer registers (f1-f8) for float (promoted to double) and double types. \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. \item 64-bit integer data types are passed in general-purpose registers as a whole in two - 32-bit general purpose registers (an odd and an even e.g. r3 and r4), probably skipping an even integer register. - or passed on the stack. They are never splitted into a register and stack part. + 32-bit general purpose registers (an odd and an even e.g. r3 and r4), skipping an even integer register + or passed on the stack; they are never splitted into a register and stack part \item Ellipse calls set CR bit 6 \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 +\item no spill area is used on stack, iterating over varargs requires a specific va\_list implementation \end{itemize} \paragraph{Return values} @@ -208,36 +211,36 @@ \item floating-point values are returned using register f1. \end{itemize} -\pagebreak \paragraph{Stack layout} +% verified/amended: TP nov 2019 (see also doc/disas_examples/ppc.sysv.disas) Stack frame is always 16-byte aligned. Stack directly after function prolog:\\ \begin{figure}[h] \begin{tabular}{5|3|1 1} -\hhline{~-~~} - & \vdots & & \\ + & \vdots & & \\ \hhline{~=~~} -local data & \hspace{4cm} & & \mrrbrace{6}{caller's frame} \\ +register save area & \hspace{4cm} & & \mrrbrace{7}{caller's frame} \\ \hhline{~-~~} -\mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ - & \ldots & & \\ - & \ldots & & \\ +local data & & & \\ \hhline{~-~~} - & saved return address (for callee) & & \\ +\mrlbrace{3}{parameter area} & last arg & \mrrbrace{3}{stack parameters} & \\ + & \ldots & & \\ + & first arg passed via stack & & \\ \hhline{~-~~} - & parent stack frame pointer & & \\ + & return address (callee saved) & & \\ +\hhline{~-~~} + & parent stack frame pointer & & \\ \hhline{~=~~} -local data & & & \mrrbrace{3}{current frame} \\ -\hhline{~-~~} -parameter area & & & \\ +register save area & & & \mrrbrace{4}{current frame} \\ \hhline{~-~~} - & \vdots & & \\ +local data & & & \\ \hhline{~-~~} +parameter area & & & \\ +\hhline{~-~~} + & \vdots & & \\ \end{tabular} -\\ -\\ -\\ \caption{Stack layout on System V ABI for PowerPC 32-bit calling convention} \end{figure} +