summaryrefslogtreecommitdiff
path: root/src/signal/powerpc64
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2024-10-01 15:47:05 +0200
committerVladimir Azarov <avm@intermediate-node.net>2024-10-01 15:47:05 +0200
commit4abab5ad6c8465a7528ccdd5f49367da05f78bbd (patch)
treeebf009bf1376a5a223a915bc27cbbd791a1316bc /src/signal/powerpc64
Initial version
Diffstat (limited to 'src/signal/powerpc64')
-rw-r--r--src/signal/powerpc64/restore.s13
-rw-r--r--src/signal/powerpc64/sigsetjmp.s37
2 files changed, 50 insertions, 0 deletions
diff --git a/src/signal/powerpc64/restore.s b/src/signal/powerpc64/restore.s
new file mode 100644
index 0000000..29c8afd
--- /dev/null
+++ b/src/signal/powerpc64/restore.s
@@ -0,0 +1,13 @@
+ .global __restore
+ .hidden __restore
+ .type __restore,%function
+__restore:
+ li 0, 119 #__NR_sigreturn
+ sc
+
+ .global __restore_rt
+ .hidden __restore_rt
+ .type __restore_rt,%function
+__restore_rt:
+ li 0, 172 # __NR_rt_sigreturn
+ sc
diff --git a/src/signal/powerpc64/sigsetjmp.s b/src/signal/powerpc64/sigsetjmp.s
new file mode 100644
index 0000000..410c283
--- /dev/null
+++ b/src/signal/powerpc64/sigsetjmp.s
@@ -0,0 +1,37 @@
+ .global sigsetjmp
+ .global __sigsetjmp
+ .type sigsetjmp,%function
+ .type __sigsetjmp,%function
+ .hidden __setjmp_toc
+sigsetjmp:
+__sigsetjmp:
+ addis 2, 12, .TOC.-__sigsetjmp@ha
+ addi 2, 2, .TOC.-__sigsetjmp@l
+ ld 5, 24(1) # load from the TOC slot in the caller's stack frame
+ b 1f
+
+ .localentry sigsetjmp,.-sigsetjmp
+ .localentry __sigsetjmp,.-__sigsetjmp
+ mr 5, 2
+
+1:
+ cmpwi cr7, 4, 0
+ beq- cr7, __setjmp_toc
+
+ mflr 6
+ std 6, 512(3)
+ std 2, 512+16(3)
+ std 16, 512+24(3)
+ mr 16, 3
+
+ bl __setjmp_toc
+
+ mr 4, 3
+ mr 3, 16
+ ld 5, 512(3)
+ mtlr 5
+ ld 2, 512+16(3)
+ ld 16, 512+24(3)
+
+.hidden __sigsetjmp_tail
+ b __sigsetjmp_tail