about summary refs log tree commit diff
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
musl-83933573aff71a5d178ab71912f177d2d844e63e.tar.xz
musl-83933573aff71a5d178ab71912f177d2d844e63e.zip
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