summaryrefslogtreecommitdiff
path: root/src/signal
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-11-14 14:01:39 -0500
committerRich Felker <dalias@aerifal.cx>2012-11-14 14:01:39 -0500
commitc6d441e3a246370d9c459396ec22b096db93850e (patch)
treefa3d4a4ca03531ceab9e60abb50e37780fce60ed /src/signal
parentc4a35f8c2a4b1a7e62a4b9e5b2748fb4fbcace79 (diff)
parent1c8eb8bad791fe9d01d0d4ab77882db634fa933d (diff)
downloadmusl-c6d441e3a246370d9c459396ec22b096db93850e.tar.gz
Merge remote-tracking branch 'ppc-port/ppc-squashed'
Diffstat (limited to 'src/signal')
-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