diff 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
line wrap: on
line diff
--- a/dyncall/dyncall_call_ppc64.S	Thu Jul 09 20:51:11 2015 +0200
+++ b/dyncall/dyncall_call_ppc64.S	Sun Jul 19 13:05:34 2015 +0200
@@ -23,7 +23,7 @@
 */
 
 
-#include "../portasm/portasm-ppc.S"
+#include "../portasm/portasm-ppc64.S"
 
 /*
   Call Kernel Implementations for PowerPC64.
@@ -37,6 +37,7 @@
      dcCall_ppc64(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata);
    
   ChangeLog:
+  2015-07-08: Added support for system calls
   2014-08-07: Initial Support
 
 */
@@ -60,7 +61,6 @@
    - Parameter Area (min. v1:64 Bytes v2:0 Byte)
    - Frame Header Area (v1:48 Bytes v2:32 Bytes)
 
-
    Frame structure:
 
      on entry, parent frame layout:
@@ -92,25 +92,9 @@
 #endif
 
 .text
-	.global dcCall_ppc64
-	.type dcCall_ppc64, @function
-#if DC__ABI_PPC64_ELF_V != 2
-	.section .opd, "aw"
-	.align 3
-#endif
-
-dcCall_ppc64:
-#if DC__ABI_PPC64_ELF_V != 2
-	.quad .dcCall_ppc64, .TOC.@tocbase, 0
-	.previous
-	.global .dcCall_ppc64
-
-.dcCall_ppc64:
-#else
-0:	addis r2, r12,.TOC.-0b@ha
-	addi  r2, r2,.TOC.-0b@l
-	.localentry dcCall_ppc64,.-dcCall_ppc64
-#endif
+.align 2
+GLOBAL_C(dcCall_ppc64)
+ENTRY_C(dcCall_ppc64)
 	mflr r0                 /* r0 = return address */
 	std  r0,16(r1)          /* store r0 to link-area */
 	std  r31,-8(r1)
@@ -195,3 +179,32 @@
 	mtlr r0                 /* setup link register */
 	blr                     /* return */
 
+.align 2
+GLOBAL_C(dcCall_ppc64_syscall)
+ENTRY_C(dcCall_ppc64_syscall)
+	mflr r0                 /* r0 = return address */
+	std  r0,16(r1)          /* store r0 to link-area */
+	std  r31,-8(r1)
+	li   r0, -STACK_MIN
+	stdux r1,r1,r0          /* store r1 and decrement */
+
+	mr   r0, r3             /* r0 = syscall number ( passed as 'target function' ) */
+	mr   r11, r4            /* r11 = reg data */
+
+	/* load 5 integer registers */
+	ld  r3 , 0(r11)
+	ld  r4 , 8(r11)
+	ld  r5 ,16(r11)
+	ld  r6 ,24(r11)
+	ld  r7 ,32(r11)
+	
+	sc                    /* system call */
+
+	/* epilog */
+
+	ld   r2,TOC_SAVE(r1)
+	ld   r1, 0(r1)          /* restore stack */
+	ld   r31,-8(r1)
+	ld   r0,16(r1)          /* r0 = return address */
+	mtlr r0                 /* setup link register */
+	blr                     /* return */