annotate dyncall/dyncall_call_ppc64.S @ 663:127b569978cc default tip

- another tweak handling clang trying to be too smart (see last commit)
author Tassilo Philipp
date Sun, 24 Mar 2024 13:52:44 +0100
parents d982a00c2177
children
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_ppc64.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Call Kernel for PowerPC 64-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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2014-2015 Masanori Mitsugi <mitsugi@linux.vnet.ibm.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
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
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
26 #include "../portasm/portasm-ppc64.S"
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 Call Kernel Implementations for PowerPC64.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 /* ============================================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 DynCall Call Kernels for PPC64 Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 -------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 struct DCRegData { int i[8]; double d[13]; };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 dcCall_ppc64(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 ChangeLog:
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
40 2015-07-08: Added support for system calls
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 2014-08-07: Initial Support
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 /* ----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 Call Kernel for ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 Input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 r3 : target address ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 r4 : register data ptr (8 x GPR 64 bytes, 13 x FPR 64 bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 r5 : stack data size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 r6 : stack data ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 - Stack frames are always aligned on 16 byte
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 - Reserve GPR2 (System register)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 - The GPR3 .. GPR10 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 - The FPR1 .. FPR8 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 - No support for Vector Parameters so far.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 - Parameter Area (min. v1:64 Bytes v2:0 Byte)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 - Frame Header Area (v1:48 Bytes v2:32 Bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 Frame structure:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 on entry, parent frame layout:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 offset
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 16: LR save word (Callee stores LR in parent frame)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 0: parent stack frame (back-chain)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 after frame initialization:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 v1: stack size = ( (48+64+8+15) + stacksize ) & -(16)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 v2: stack size = ( (32+0+8+15) + stacksize ) & -(16)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 ... locals and register spills
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 48 or 32: parameter list area
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 16: LR save word (Callee stores LR in parent frame)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 0: parent stack frame (back-chain)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 /* Constants */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 STACK_MIN = 120 /* v1 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 TOC_SAVE = 40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 PARAM_SAVE = 48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 STACK_MIN = 40 /* v2 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 TOC_SAVE = 24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 PARAM_SAVE = 32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 .text
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
95 .align 2
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
96 GLOBAL_C(dcCall_ppc64)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
97 ENTRY_C(dcCall_ppc64)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 mflr r0 /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 std r0,16(r1) /* store r0 to link-area */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 std r31,-8(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 /* compute aligned stack-size */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 /* add link area and align to 16 byte (+15) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 /* r0 = stacksize + frame parameter(back-chain link, this callee's call return address) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 addi r0,r5,STACK_MIN+15 /* r0 = r5 + STACK_MIN + 15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 neg r0,r0 /* r0 = -r0 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 stdux r1,r1,r0 /* store r1 and decrement */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 /* copy stack data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 subi r6,r6,8 /* r6 = 8 bytes before source stack ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 addi r7,r1,PARAM_SAVE-8 /* r7 = 8 bytes before target stack parameter-block */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 srwi r5,r5,3 /* r5 = size in double words */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118
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
119 cmpi cr0,0,r5,0 /* if stacksize != 0 .. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 beq cr0,.copy_done
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 mtctr r5 /* copy loop */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 .copy_next:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 ldu r0, 8(r6)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 stdu r0, 8(r7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 bdnz .copy_next
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 .copy_done:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 /* this call support using ctr branch register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 mr r12, r3 /* r12 = target function */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 std r2,TOC_SAVE(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 ld r2,8(r12)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 ld r0,0(r12)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 mtctr r0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 mtctr r12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 mr r11, r4 /* r11 = reg data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 /* load 8 integer registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 ld r3 , 0(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 ld r4 , 8(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 ld r5 ,16(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 ld r6 ,24(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 ld r7 ,32(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 ld r8 ,40(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 ld r9 ,48(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 ld r10,56(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 /* load 13 float registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 lfd f1 , 64(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 lfd f2 , 72(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 lfd f3 , 80(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 lfd f4 , 88(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 lfd f5 , 96(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 lfd f6 ,104(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 lfd f7 ,112(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 lfd f8 ,120(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 lfd f9 ,128(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 lfd f10,136(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 lfd f11,144(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 lfd f12,152(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 lfd f13,160(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 bctrl /* branch with this call support */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 /* epilog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 ld r2,TOC_SAVE(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 ld r1, 0(r1) /* restore stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 ld r31,-8(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 ld r0,16(r1) /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 mtlr r0 /* setup link register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 blr /* return */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
182 .align 2
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
183 GLOBAL_C(dcCall_ppc64_syscall)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
184 ENTRY_C(dcCall_ppc64_syscall)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
185 mflr r0 /* r0 = return address */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
186 std r0,16(r1) /* store r0 to link-area */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
187 std r31,-8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
188 li r0, -STACK_MIN
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
189 stdux r1,r1,r0 /* store r1 and decrement */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
190
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
191 mr r0, r3 /* r0 = syscall number ( passed as 'target function' ) */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
192 mr r11, r4 /* r11 = reg data */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
193
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
194 /* load 5 integer registers */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
195 ld r3 , 0(r11)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
196 ld r4 , 8(r11)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
197 ld r5 ,16(r11)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
198 ld r6 ,24(r11)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
199 ld r7 ,32(r11)
345
c607d67cd6b8 - doc: added syscall info to appendix, fixed broken literature link
Tassilo Philipp
parents: 7
diff changeset
200 /* @@@ missing r8,r9,10 on some platforms? */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
201 sc /* system call */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
202
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
203 /* epilog */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
204
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
205 ld r2,TOC_SAVE(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
206 ld r1, 0(r1) /* restore stack */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
207 ld r31,-8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
208 ld r0,16(r1) /* r0 = return address */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
209 mtlr r0 /* setup link register */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
210 blr /* return */