about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/internal/ppc/syscall.S24
-rw-r--r--src/ldso/ppc/dlsym.S9
-rw-r--r--src/ldso/ppc/start.S22
-rw-r--r--src/setjmp/ppc/longjmp.S17
-rw-r--r--src/setjmp/ppc/setjmp.S18
-rw-r--r--src/signal/ppc/restore.S13
-rw-r--r--src/signal/ppc/sigsetjmp.S12
-rw-r--r--src/thread/ppc/__unmapself.S11
8 files changed, 126 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
diff --git a/src/ldso/ppc/dlsym.S b/src/ldso/ppc/dlsym.S
new file mode 100644
index 00000000..e36de10b
--- /dev/null
+++ b/src/ldso/ppc/dlsym.S
@@ -0,0 +1,9 @@
+#include <bits/asm.h>
+        .text
+        .global dlsym
+        .type   dlsym,@function
+dlsym:
+        mflr    r5                      // The return address is arg3.
+        b       __dlsym
+        .end    dlsym
+        .size   dlsym, .-dlsym
diff --git a/src/ldso/ppc/start.S b/src/ldso/ppc/start.S
new file mode 100644
index 00000000..f3419824
--- /dev/null
+++ b/src/ldso/ppc/start.S
@@ -0,0 +1,22 @@
+#include <bits/asm.h>
+        .global _start
+        .type   _start,@function
+_start:
+        mr      r9, r1                  // Save the original stack pointer.
+        clrrwi  r1, r1, 4               // Align the stack to 16 bytes.
+        lis     r13, _SDA_BASE_@ha      // r13 points to the small data area.
+        addi    r13, r13, _SDA_BASE_@l  //
+        li      r0, 0                   // Zero the frame pointer.
+        lwz     r3, 0(r9)               // and argc...
+        addi    r4, r9, 4               // and argv ...
+        mtlr    r0                      // Clear the link register.
+        // Go to the musl dynamic linker entry point.
+        bl      __dynlink
+        cmpi    r4, 0, r3, 1            // Check for a 1.
+        bne     r4, .                   // Stay here
+        mtlr    r3                      // Set the link address...
+        li      r3, 0
+        blr                             // and go.
+        .end    _start
+        .size   _start, .-_start
+
diff --git a/src/setjmp/ppc/longjmp.S b/src/setjmp/ppc/longjmp.S
new file mode 100644
index 00000000..df13c7b1
--- /dev/null
+++ b/src/setjmp/ppc/longjmp.S
@@ -0,0 +1,17 @@
+#include <bits/asm.h>
+        .global _longjmp
+        .global longjmp
+        .type   _longjmp,@function
+        .type   longjmp,@function
+_longjmp:
+longjmp:
+        cmpi    7, 0, r3, 0
+        bne     7, 1f
+        addi    r3, r3, 1
+1:      lmw     r8, 4(r3)               // load r8-r31
+        mr      r6, r4
+        mtlr    r11
+        mtcr    r12
+        mr      r2, r9
+        mr      r1, r10
+        blr 
diff --git a/src/setjmp/ppc/setjmp.S b/src/setjmp/ppc/setjmp.S
new file mode 100644
index 00000000..7d0b9ac5
--- /dev/null
+++ b/src/setjmp/ppc/setjmp.S
@@ -0,0 +1,18 @@
+#include <bits/asm.h>
+        .global __setjmp
+        .global _setjmp
+        .global setjmp
+        .type   __setjmp,@function
+        .type   _setjmp,@function
+        .type   setjmp,@function
+__setjmp:
+_setjmp:
+setjmp:
+        mflr    r11
+        mfcr    r12
+        mr      r10, r1
+        mr      r9, r2
+        stmw    r8, 0(r3)               // save r8-r31
+        li      r3,0
+        blr
+
diff --git a/src/signal/ppc/restore.S b/src/signal/ppc/restore.S
new file mode 100644
index 00000000..50887e91
--- /dev/null
+++ b/src/signal/ppc/restore.S
@@ -0,0 +1,13 @@
+#include <bits/asm.h>
+#include <bits/syscall.h>
+        .global __restore
+        .type __restore,@function
+__restore:
+        li      r0, __NR_sigreturn
+        sc
+
+        .global __restore_rt
+        .type __restore_rt,@function
+__restore_rt:
+        li      r0, __NR_rt_sigreturn
+        sc
diff --git a/src/signal/ppc/sigsetjmp.S b/src/signal/ppc/sigsetjmp.S
new file mode 100644
index 00000000..527ef8e4
--- /dev/null
+++ b/src/signal/ppc/sigsetjmp.S
@@ -0,0 +1,12 @@
+#include <bits/asm.h>
+        .global sigsetjmp
+        .type sigsetjmp,@function
+sigsetjmp:
+        lwz     r4, 64*4-2*4(r3)        // Second last long.
+        cmpi    r4, 0, r4, 0
+        bne     r4, 1f
+        addi    r5, r3, 64*4-1*4        // Address of last long.
+        li      r4, 0
+        li      r3, 2
+        bl      sigprocmask
+1:      b       setjmp
diff --git a/src/thread/ppc/__unmapself.S b/src/thread/ppc/__unmapself.S
new file mode 100644
index 00000000..e14663e7
--- /dev/null
+++ b/src/thread/ppc/__unmapself.S
@@ -0,0 +1,11 @@
+#include <bits/asm.h>
+#include <bits/syscall.h>
+        .text
+        .global __unmapself
+        .type   __unmapself,%function
+__unmapself:
+        li      r0, __NR_munmap
+        sc
+        li      r0, __NR_exit
+        sc
+        blr