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 */