about summary refs log tree commit diff
path: root/src/signal/mips64/sigsetjmp.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal/mips64/sigsetjmp.s')
-rw-r--r--src/signal/mips64/sigsetjmp.s38
1 files changed, 38 insertions, 0 deletions
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