summaryrefslogtreecommitdiff
path: root/src/signal/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal/powerpc')
-rw-r--r--src/signal/powerpc/restore.s11
-rw-r--r--src/signal/powerpc/sigsetjmp.s34
2 files changed, 45 insertions, 0 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