annotate dyncall/dyncall_call_ppc32.S @ 368:f28b7f4f5749

- removed some pseudo-op on non-darwin platforms to make clang's integrated assembler happy
author Tassilo Philipp
date Wed, 05 Aug 2020 15:50:49 +0200
parents d982a00c2177
children 26aa936d4841
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
368
f28b7f4f5749 - removed some pseudo-op on non-darwin platforms to make clang's integrated assembler happy
Tassilo Philipp
parents: 357
diff changeset
36 #.machine ppc # clang's integrated as doesn't handle this on anything but Darwin (at least for clang <= 9)
0
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