Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_call_ppc64.S @ 7:7ca57dbefed4
- ppc64 update from Masanori
author | cslag |
---|---|
date | Sun, 19 Jul 2015 13:05:34 +0200 |
parents | 3e629dc19168 |
children | c607d67cd6b8 |
comparison
equal
deleted
inserted
replaced
6:b8ea1d2a34a3 | 7:7ca57dbefed4 |
---|---|
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
22 | 22 |
23 */ | 23 */ |
24 | 24 |
25 | 25 |
26 #include "../portasm/portasm-ppc.S" | 26 #include "../portasm/portasm-ppc64.S" |
27 | 27 |
28 /* | 28 /* |
29 Call Kernel Implementations for PowerPC64. | 29 Call Kernel Implementations for PowerPC64. |
30 */ | 30 */ |
31 | 31 |
35 C Interface: | 35 C Interface: |
36 struct DCRegData { int i[8]; double d[13]; }; | 36 struct DCRegData { int i[8]; double d[13]; }; |
37 dcCall_ppc64(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata); | 37 dcCall_ppc64(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata); |
38 | 38 |
39 ChangeLog: | 39 ChangeLog: |
40 2015-07-08: Added support for system calls | |
40 2014-08-07: Initial Support | 41 2014-08-07: Initial Support |
41 | 42 |
42 */ | 43 */ |
43 | 44 |
44 /* ---------------------------------------------------------------------------- | 45 /* ---------------------------------------------------------------------------- |
57 - The GPR3 .. GPR10 are loaded | 58 - The GPR3 .. GPR10 are loaded |
58 - The FPR1 .. FPR8 are loaded | 59 - The FPR1 .. FPR8 are loaded |
59 - No support for Vector Parameters so far. | 60 - No support for Vector Parameters so far. |
60 - Parameter Area (min. v1:64 Bytes v2:0 Byte) | 61 - Parameter Area (min. v1:64 Bytes v2:0 Byte) |
61 - Frame Header Area (v1:48 Bytes v2:32 Bytes) | 62 - Frame Header Area (v1:48 Bytes v2:32 Bytes) |
62 | |
63 | 63 |
64 Frame structure: | 64 Frame structure: |
65 | 65 |
66 on entry, parent frame layout: | 66 on entry, parent frame layout: |
67 | 67 |
90 TOC_SAVE = 24 | 90 TOC_SAVE = 24 |
91 PARAM_SAVE = 32 | 91 PARAM_SAVE = 32 |
92 #endif | 92 #endif |
93 | 93 |
94 .text | 94 .text |
95 .global dcCall_ppc64 | 95 .align 2 |
96 .type dcCall_ppc64, @function | 96 GLOBAL_C(dcCall_ppc64) |
97 #if DC__ABI_PPC64_ELF_V != 2 | 97 ENTRY_C(dcCall_ppc64) |
98 .section .opd, "aw" | |
99 .align 3 | |
100 #endif | |
101 | |
102 dcCall_ppc64: | |
103 #if DC__ABI_PPC64_ELF_V != 2 | |
104 .quad .dcCall_ppc64, .TOC.@tocbase, 0 | |
105 .previous | |
106 .global .dcCall_ppc64 | |
107 | |
108 .dcCall_ppc64: | |
109 #else | |
110 0: addis r2, r12,.TOC.-0b@ha | |
111 addi r2, r2,.TOC.-0b@l | |
112 .localentry dcCall_ppc64,.-dcCall_ppc64 | |
113 #endif | |
114 mflr r0 /* r0 = return address */ | 98 mflr r0 /* r0 = return address */ |
115 std r0,16(r1) /* store r0 to link-area */ | 99 std r0,16(r1) /* store r0 to link-area */ |
116 std r31,-8(r1) | 100 std r31,-8(r1) |
117 | 101 |
118 /* compute aligned stack-size */ | 102 /* compute aligned stack-size */ |
193 ld r31,-8(r1) | 177 ld r31,-8(r1) |
194 ld r0,16(r1) /* r0 = return address */ | 178 ld r0,16(r1) /* r0 = return address */ |
195 mtlr r0 /* setup link register */ | 179 mtlr r0 /* setup link register */ |
196 blr /* return */ | 180 blr /* return */ |
197 | 181 |
182 .align 2 | |
183 GLOBAL_C(dcCall_ppc64_syscall) | |
184 ENTRY_C(dcCall_ppc64_syscall) | |
185 mflr r0 /* r0 = return address */ | |
186 std r0,16(r1) /* store r0 to link-area */ | |
187 std r31,-8(r1) | |
188 li r0, -STACK_MIN | |
189 stdux r1,r1,r0 /* store r1 and decrement */ | |
190 | |
191 mr r0, r3 /* r0 = syscall number ( passed as 'target function' ) */ | |
192 mr r11, r4 /* r11 = reg data */ | |
193 | |
194 /* load 5 integer registers */ | |
195 ld r3 , 0(r11) | |
196 ld r4 , 8(r11) | |
197 ld r5 ,16(r11) | |
198 ld r6 ,24(r11) | |
199 ld r7 ,32(r11) | |
200 | |
201 sc /* system call */ | |
202 | |
203 /* epilog */ | |
204 | |
205 ld r2,TOC_SAVE(r1) | |
206 ld r1, 0(r1) /* restore stack */ | |
207 ld r31,-8(r1) | |
208 ld r0,16(r1) /* r0 = return address */ | |
209 mtlr r0 /* setup link register */ | |
210 blr /* return */ |