about summary refs log tree commit diff
path: root/src/internal
diff options
context:
space:
mode:
authorRichard Pennington <rich@pennware.com>2012-11-09 23:32:57 +0100
committerrofl0r <retnyg@gmx.net>2012-11-13 18:15:10 +0100
commit7669d1e334e6b96455eece78da43bf830b93d697 (patch)
tree6649acfaa61ec6780498b55fa8015ca4f7a6cdae /src/internal
parent1e717ea3d2a864e00e507f1a70a892c551955f1b (diff)
downloadmusl-7669d1e334e6b96455eece78da43bf830b93d697.tar.gz
musl-7669d1e334e6b96455eece78da43bf830b93d697.tar.xz
musl-7669d1e334e6b96455eece78da43bf830b93d697.zip
import preliminary ppc work by rdp.
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/ppc/syscall.S24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/internal/ppc/syscall.S b/src/internal/ppc/syscall.S
new file mode 100644
index 00000000..e56abc6f
--- /dev/null
+++ b/src/internal/ppc/syscall.S
@@ -0,0 +1,24 @@
+#include <bits/asm.h>
+        .global __syscall
+        .type   __syscall,@function
+__syscall:
+        mflr    r0
+        stw     r0, -4(r1)              // Save the return address.
+        mr      r0, r3                  // Save the system call number
+        mr      r3, r4                  // Shift the arguments: arg1
+        mr      r4, r5                  // arg2
+        mr      r5, r6                  // arg3
+        mr      r6, r7                  // arg4
+        mr      r7, r8                  // arg5
+        mr      r8, r9                  // arg6
+        sc
+        mfcr    r0                      // Check for an error
+        rlwinm  r4, r0, r0, 3, 3        // by checking for bit 28.
+        cmplwi  r0, r4, 0               // It is an error if non-zero.
+        beq     r0, 1f                  // Jump if not an error.
+        neg     r3, r3                  // Negate the error number.
+1:      lwz     r0, -4(r1)              // Restore the return address.
+        mtlr    r0
+	blr
+        .end    __syscall
+        .size   __syscall, .-__syscall