annotate dyncall/dyncall_call_ppc64.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
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 */