annotate dyncall/dyncall_call_ppc32.S @ 357:d982a00c2177

- PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
author Tassilo Philipp
date Tue, 25 Feb 2020 18:16:13 +0100
parents c607d67cd6b8
children f28b7f4f5749
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_call_ppc32.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Call Kernel for PowerPC 32-bit Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 0
diff changeset
9 Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "../portasm/portasm-ppc.S"
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 Call Kernel Implementations for PowerPC.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 Supported Calling Conventions: sysv, darwin, syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 .machine ppc
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 /* ============================================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 DynCall Call Kernels for PPC32 Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 -------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 struct DCRegData { int i[8]; double d[13]; };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 dcCall_ppc32_XXX(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 Where XXX is one of the following Calling Conventions:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 darwin, sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 ChangeLog:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 2015-01-15: Added support for system calls.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 2011-04-03: Using portasm.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 2009-01-09: Added Support for System V ABI.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 2007-11-28: Initial Support for Darwin.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 /*---------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 Call Kernel for ppc32 Darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 Input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 r3 : target address ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 r4 : register data ptr (8 x GPR 32 bytes, 13 x FPR 64 bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 r5 : stack data size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 r6 : stack data ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 - Stack frames are always aligned on 16 byte
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 - The GPR3 .. GPR10 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 - The FPR1 .. FPR13 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 - No support for Vector Parameters so far.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 - Parameter Area (min. 32 Bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 - Linkage Area (24 Bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 .align 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 GLOBAL_C(dcCall_ppc32_darwin)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 ENTRY_C(dcCall_ppc32_darwin)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 mflr r0 /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 stw r0,8(r1) /* store return address in caller link-area */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 /* compute aligned stack-size */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 /* add link area and align to 16 byte border */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 addi r0,r5,24+15 /* r0 = stacksize + link area */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 /* r0 = r0 and -15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 neg r2,r0 /* r2 = -stacksize */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 stwux r1,r1,r2 /* r1 = r1 - stacksize */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 /* copy stack data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 subi r6,r6,4 /* r6 = 4 bytes before source stack ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 addi r7,r1,20 /* r7 = 4 bytes before target stack parameter-block */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 srwi r5,r5,2 /* r5 = size in words */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102
357
d982a00c2177 - PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
Tassilo Philipp
parents: 345
diff changeset
103 cmpi cr0,0,r5,0 /* if stacksize != 0 .. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 beq cr0,.osx_done
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 mtctr r5 /* copy loop */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 .osx_next:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 lwzu r0, 4(r6)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 stwu r0, 4(r7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 bdnz .osx_next
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 .osx_done:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 mr r12, r3 /* r12 = target function */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 mtctr r12 /* control register = target function */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 mr r2, r4 /* r2 = reg data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 /* load 8 integer registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 lwz r3 , 0(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 lwz r4 , 4(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 lwz r5 , 8(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 lwz r6 ,12(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 lwz r7 ,16(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 lwz r8 ,20(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 lwz r9 ,24(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 lwz r10,28(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 /* load 13 float registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 lfd f1 ,32(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 lfd f2 ,40(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 lfd f3 ,48(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 lfd f4 ,56(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 lfd f5 ,64(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 lfd f6 ,72(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 lfd f7 ,80(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 lfd f8 ,88(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 lfd f9 ,96(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 lfd f10,104(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 lfd f11,112(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 lfd f12,120(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 lfd f13,128(r2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 /* branch */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 bctrl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 /* epilog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 lwz r1, 0(r1) /* restore stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 lwz r0, 8(r1) /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 mtlr r0 /* setup link register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 blr /* return */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 /* ----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 Call Kernel for ppc32 System
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 Input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 r3 : target address ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 r4 : register data ptr (8 x GPR 32 bytes, 8 x FPR 64 bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 r5 : stack data size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 r6 : stack data ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 - Stack frames are always aligned on 16 byte
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 - Reserve GPR2 (System register)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 - The GPR3 .. GPR10 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 - The FPR1 .. FPR8 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 - No support for Vector Parameters so far.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 Frame structure:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 on entry, parent frame layout:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 offset
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 4: LR save word (Callee stores LR in parent frame)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 0: parent stack frame (back-chain)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 after frame initialization:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 stack size = ( (8+15) + stacksize ) & -(16)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 ... locals and register spills
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 8: parameter list area
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 4: LR save word (Callee stores LR in parent frame)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 0: parent stack frame (back-chain)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 .align 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 GLOBAL_C(dcCall_ppc32_sysv)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 ENTRY_C(dcCall_ppc32_sysv)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 mflr r0 /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 stw r0,4(r1) /* store r0 to link-area */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 /* compute aligned stack-size */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 /* add link area (+8) and align to 16 byte (+15) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 /* r0 = stacksize + frame parameter(back-chain link, this callee's call return address) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 addi r0,r5,8+15 /* r0 = r5 + 8 + 15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 neg r0,r0 /* r0 = -r0 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 stwux r1,r1,r0 /* store r1 and decrement */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 /* copy stack data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 subi r6,r6,4 /* r6 = 4 bytes before source stack ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 /* 4 bytes before target stack parameter-block */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 addi r7,r1,4 /* r7 = r1 + 8 offset - 4 displacement */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 srwi r5,r5,2 /* r5 = size in words */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216
357
d982a00c2177 - PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
Tassilo Philipp
parents: 345
diff changeset
217 cmpi cr0,0,r5,0 /* if stacksize != 0 .. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 beq cr0,.sysv_done
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 mtctr r5 /* copy loop */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 .sysv_next:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 lwzu r0, 4(r6)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 stwu r0, 4(r7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 bdnz .sysv_next
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 .sysv_done:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 /* this call support using ctr branch register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 mr r12, r3 /* r12 = target function */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 mtctr r12 /* control register = r12 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 mr r11, r4 /* r11 = reg data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 /* load 8 integer registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 lwz r3 , 0(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 lwz r4 , 4(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239 lwz r5 , 8(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 lwz r6 ,12(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 lwz r7 ,16(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 lwz r8 ,20(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243 lwz r9 ,24(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244 lwz r10,28(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
245
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 /* load 8 float registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 lfd f1 ,32(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249 lfd f2 ,40(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 lfd f3 ,48(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251 lfd f4 ,56(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252 lfd f5 ,64(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253 lfd f6 ,72(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 lfd f7 ,80(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255 lfd f8 ,88(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 creqv 6,6,6 /* used for ellipsis calls */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259 bctrl /* branch with this call support */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 /* epilog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263 lwz r1, 0(r1) /* restore stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 lwz r0, 4(r1) /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265 mtlr r0 /* setup link register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
266 blr /* return */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
267
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
268
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
269 .align 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
270
345
c607d67cd6b8 - doc: added syscall info to appendix, fixed broken literature link
Tassilo Philipp
parents: 281
diff changeset
271 /* @@@ Bus Error on Darwin */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272 GLOBAL_C(dcCall_ppc32_syscall)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273 ENTRY_C(dcCall_ppc32_syscall)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 mflr r0 /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275 stw r0,4(r1) /* store r0 to link-area */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276 li r0, -8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277 stwux r1,r1,r0 /* store r1 and decrement */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279 mr r0, r3 /* r0 = syscall number ( passed as 'target function' ) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 mr r11, r4 /* r11 = reg data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281 lwz r3 , 0(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 lwz r4 , 4(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283 lwz r5 , 8(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 lwz r6 ,12(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 lwz r7 ,16(r11)
345
c607d67cd6b8 - doc: added syscall info to appendix, fixed broken literature link
Tassilo Philipp
parents: 281
diff changeset
286 /* @@@ missing r8,r9,10 on some platforms? */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287 sc
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289 lwz r1, 0(r1) /* restore stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290 lwz r0, 4(r1) /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 mtlr r0 /* setup link register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292 blr
345
c607d67cd6b8 - doc: added syscall info to appendix, fixed broken literature link
Tassilo Philipp
parents: 281
diff changeset
293