about summary refs log tree commit diff
path: root/src/signal
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal')
-rw-r--r--src/signal/powerpc/restore.s11
-rw-r--r--src/signal/powerpc/sigsetjmp.s34
-rw-r--r--src/signal/ppc/restore.S13
-rw-r--r--src/signal/ppc/sigsetjmp.S12
4 files changed, 45 insertions, 25 deletions
diff --git a/src/signal/powerpc/restore.s b/src/signal/powerpc/restore.s
new file mode 100644
index 00000000..fd7bcba5
--- /dev/null
+++ b/src/signal/powerpc/restore.s
@@ -0,0 +1,11 @@
+        .global __restore
+        .type __restore,%function
+__restore:
+        li      0, 119 #__NR_sigreturn
+        sc
+
+        .global __restore_rt
+        .type __restore_rt,%function
+__restore_rt:
+        li      0, 172 # __NR_rt_sigreturn
+        sc
diff --git a/src/signal/powerpc/sigsetjmp.s b/src/signal/powerpc/sigsetjmp.s
new file mode 100644
index 00000000..0b79dcce
--- /dev/null
+++ b/src/signal/powerpc/sigsetjmp.s
@@ -0,0 +1,34 @@
+        .global sigsetjmp
+        .type sigsetjmp,%function
+sigsetjmp:
+	#int sigsetjmp(sigjmp_buf buf, int save)
+	#		r3		r4
+	#0) store save into buf->__fl
+	stw 4, 256(3)
+	#1) compare save with 0
+	cmpwi cr7, 4, 0
+	#2) if its 0, goto setjmp code
+	beq- cr7, 1f
+	#3) else: we must call pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
+	# thus store r3 on the stack, to restore it later
+	stw 3, -4(1)
+	# store old link reg
+	mflr 0
+	stw 0, -8(1)
+	# increase stack frame by 16
+	subi 1, 1, 16
+	# put pointer to ss buf into r5 (3rd arg)
+	addi 5, 3, 260
+	# put "2" i.e. SIG_SETMASK in r3
+	li 3, 2
+	li 4, 0
+	bl pthread_sigmask
+	#restore sp
+	addi 1, 1, 16
+	#restore r3
+	lwz 3, -4(1)
+	#restore link reg
+	lwz 0, -8(1)
+	mtlr 0
+1:
+	b setjmp
diff --git a/src/signal/ppc/restore.S b/src/signal/ppc/restore.S
deleted file mode 100644
index 50887e91..00000000
--- a/src/signal/ppc/restore.S
+++ /dev/null
@@ -1,13 +0,0 @@
-#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
deleted file mode 100644
index 527ef8e4..00000000
--- a/src/signal/ppc/sigsetjmp.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#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