summaryrefslogtreecommitdiff
path: root/src/signal
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2016-03-06 17:41:56 +0000
committerRich Felker <dalias@aerifal.cx>2016-03-06 17:41:56 +0000
commit83933573aff71a5d178ab71912f177d2d844e63e (patch)
tree3c7057d0c83c0030b8a6c0405f1b2797fbbcf450 /src/signal
parent71392a91c333d47b6b3c8f99c897e3b5a7eb6d58 (diff)
downloadmusl-83933573aff71a5d178ab71912f177d2d844e63e.tar.gz
add mips64 port
patch by Mahesh Bodapati and Jaydeep Patil of Imagination Technologies.
Diffstat (limited to 'src/signal')
-rw-r--r--src/signal/mips64/restore.s9
-rw-r--r--src/signal/mips64/sigsetjmp.s38
2 files changed, 47 insertions, 0 deletions
diff --git a/src/signal/mips64/restore.s b/src/signal/mips64/restore.s
new file mode 100644
index 00000000..e8988369
--- /dev/null
+++ b/src/signal/mips64/restore.s
@@ -0,0 +1,9 @@
+.set noreorder
+.global __restore_rt
+.global __restore
+.type __restore_rt,@function
+.type __restore,@function
+__restore_rt:
+__restore:
+ li $2,5211
+ syscall
diff --git a/src/signal/mips64/sigsetjmp.s b/src/signal/mips64/sigsetjmp.s
new file mode 100644
index 00000000..156e70bd
--- /dev/null
+++ b/src/signal/mips64/sigsetjmp.s
@@ -0,0 +1,38 @@
+.set noreorder
+.global sigsetjmp
+.global __sigsetjmp
+.type sigsetjmp,@function
+.type __sigsetjmp,@function
+sigsetjmp:
+__sigsetjmp:
+ lui $3, %hi(%neg(%gp_rel(sigsetjmp)))
+ daddiu $3, $3, %lo(%neg(%gp_rel(sigsetjmp)))
+
+ # comparing save mask with 0, if equals to 0 then
+ # sigsetjmp is equal to setjmp.
+ beq $5, $0, 1f
+ daddu $3, $3, $25
+ sd $ra, 160($4)
+ sd $16, 168($4)
+
+ # save base of got so that we can use it later
+ # once we return from 'longjmp'
+ sd $3, 176($4)
+ ld $25, %got_disp(setjmp)($3)
+ jalr $25
+ move $16, $4
+
+ move $5, $2 # Return from 'setjmp' or 'longjmp'
+ move $4, $16 # Restore the pointer-to-sigjmp_buf
+ ld $ra, 160($4) # Restore ra of sigsetjmp
+ ld $16, 168($4) # Restore $16 of sigsetjmp
+ ld $3, 176($4) # Restore base of got
+
+.hidden __sigsetjmp_tail
+ ld $25, %got_disp(__sigsetjmp_tail)($3)
+ jr $25
+ nop
+1:
+ ld $25, %got_disp(setjmp)($3)
+ jr $25
+ nop