about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/signal/aarch64/sigsetjmp.s22
-rw-r--r--src/signal/arm/sigsetjmp.s24
-rw-r--r--src/signal/i386/sigsetjmp.s24
-rw-r--r--src/signal/microblaze/sigsetjmp.s26
-rw-r--r--src/signal/mips/sigsetjmp.s35
-rw-r--r--src/signal/or1k/sigsetjmp.s25
-rw-r--r--src/signal/powerpc/sigsetjmp.s46
-rw-r--r--src/signal/sh/sigsetjmp.s44
-rw-r--r--src/signal/siglongjmp.c1
-rw-r--r--src/signal/sigsetjmp_tail.c13
-rw-r--r--src/signal/x32/sigsetjmp.s25
-rw-r--r--src/signal/x86_64/sigsetjmp.s25
12 files changed, 177 insertions, 133 deletions
diff --git a/src/signal/aarch64/sigsetjmp.s b/src/signal/aarch64/sigsetjmp.s
index e0f83f06..347d0bc0 100644
--- a/src/signal/aarch64/sigsetjmp.s
+++ b/src/signal/aarch64/sigsetjmp.s
@@ -4,16 +4,18 @@
 .type __sigsetjmp,%function
 sigsetjmp:
 __sigsetjmp:
-	str x1,[x0,#176]
 	cbz x1,setjmp
 
-	// TODO errno?
-	// sigprocmask(SIG_SETMASK, 0, (sigset_t*)buf->__ss);
-	stp x0,x30,[sp,#-16]!
-	add x2,x0,#184
-	mov x1,#0
-	mov x0,#2
-	bl sigprocmask
-	ldp x0,x30,[sp],#16
+	str lr,[x0,#176]
+	str x19,[x0,#176+8+8]
+	mov x19,x0
 
-	b setjmp
+	bl setjmp
+
+	mov w1,w0
+	mov x0,x19
+	ldr lr,[x0,#176]
+	ldr x19,[x0,#176+8+8]
+
+.hidden __sigsetjmp_tail
+	b __sigsetjmp_tail
diff --git a/src/signal/arm/sigsetjmp.s b/src/signal/arm/sigsetjmp.s
index 0e7bcd49..89c020b8 100644
--- a/src/signal/arm/sigsetjmp.s
+++ b/src/signal/arm/sigsetjmp.s
@@ -4,13 +4,19 @@
 .type __sigsetjmp,%function
 sigsetjmp:
 __sigsetjmp:
-	str a2,[a1,#256]
-	tst a2,a2
+	tst r1,r1
 	beq setjmp
-	push {a1,lr}
-	add a3,a1,#260
-	mov a2,#0
-	mov a1,#2
-	bl sigprocmask
-	pop {a1,lr}
-	b setjmp
+
+	str lr,[r0,#256]
+	str r4,[r0,#260+8]
+	mov r4,r0
+
+	bl setjmp
+
+	mov r1,r0
+	mov r0,r4
+	ldr lr,[r0,#256]
+	ldr r4,[r0,#260+8]
+
+.hidden __sigsetjmp_tail
+	b __sigsetjmp_tail
diff --git a/src/signal/i386/sigsetjmp.s b/src/signal/i386/sigsetjmp.s
index 91c8c048..1d24b6f7 100644
--- a/src/signal/i386/sigsetjmp.s
+++ b/src/signal/i386/sigsetjmp.s
@@ -4,14 +4,22 @@
 .type __sigsetjmp,@function
 sigsetjmp:
 __sigsetjmp:
-	mov 4(%esp),%eax
 	mov 8(%esp),%ecx
-	mov %ecx,24(%eax)
 	jecxz 1f
-	add $28,%eax
-	push %eax
-	push $0
-	push $2
-	call sigprocmask
-	add $12,%esp
+
+	mov 4(%esp),%eax
+	popl 24(%eax)
+	mov %ebx,28+8(%eax)
+	mov %eax,%ebx
+
+	call setjmp
+
+	pushl 24(%ebx)
+	mov %ebx,4(%esp)
+	mov %eax,8(%esp)
+	mov 28+8(%ebx),%ebx
+
+.hidden __sigsetjmp_tail
+	jmp __sigsetjmp_tail
+
 1:	jmp setjmp
diff --git a/src/signal/microblaze/sigsetjmp.s b/src/signal/microblaze/sigsetjmp.s
index 2a23d147..8430c9c4 100644
--- a/src/signal/microblaze/sigsetjmp.s
+++ b/src/signal/microblaze/sigsetjmp.s
@@ -4,18 +4,18 @@
 .type __sigsetjmp,@function
 sigsetjmp:
 __sigsetjmp:
-	swi     r6, r5, 72
-	beqi    r6, setjmp@PLT
+	beqi r6, setjmp@PLT
 
-	addi    r1, r1, -32
-	swi     r15, r1, 28
-	swi     r5, r1, 24
-	addi    r7, r5, 76
-	add     r6, r0, r0
-	brlid   r15, sigprocmask@PLT
-	ori     r5, r0, 2
+	swi r15,r5,72
+	swi r19,r5,72+4+8
 
-	lwi     r15, r1, 28
-	lwi     r5, r1, 24
-	brid    setjmp@PLT
-	addi    r1, r1, 32
+	brlid r15,setjmp@PLT
+	 ori r19,r5,0
+
+	ori r6,r3,0
+	ori r5,r19,0
+	lwi r15,r5,72
+	lwi r19,r5,72+4+8
+
+.hidden __sigsetjmp_tail
+	bri __sigsetjmp_tail
diff --git a/src/signal/mips/sigsetjmp.s b/src/signal/mips/sigsetjmp.s
index 133ca777..74b65ff6 100644
--- a/src/signal/mips/sigsetjmp.s
+++ b/src/signal/mips/sigsetjmp.s
@@ -9,22 +9,25 @@ __sigsetjmp:
 	lui $gp, %hi(_gp_disp)
 	addiu $gp, %lo(_gp_disp)
 	beq $5, $0, 1f
-	addu $gp, $gp, $25
-	subu $sp, $sp, 32
-	sw $4, 20($sp)
-	sw $ra, 24($sp)
-	sw $gp, 28($sp)
-	addu $6, $4, 108
-	li $5, 0
-	li $4, 1
-	sw $4, -4($6)
-	lw $25, %call16(sigprocmask)($gp)
+	 addu $gp, $gp, $25
+
+	sw $ra, 104($4)
+	sw $16, 104+4+16($4)
+
+	lw $25, %call16(setjmp)($gp)
 	jalr $25
-	nop
-	lw $gp, 28($sp)
-	lw $ra, 24($sp)
-	lw $4, 20($sp)
-	addu $sp, $sp, 32
+	 move $16, $4
+
+	move $5,$2
+	move $4,$16
+	lw $ra, 104($4)
+	lw $16, 104+4+16($4)
+
+.hidden __sigsetjmp_tail
+	lw $25, %call16(__sigsetjmp_tail)($gp)
+	jr $25
+	 nop
+
 1:	lw $25, %call16(setjmp)($gp)
 	jr $25
-	nop
+	 nop
diff --git a/src/signal/or1k/sigsetjmp.s b/src/signal/or1k/sigsetjmp.s
index 70a29223..350c00e2 100644
--- a/src/signal/or1k/sigsetjmp.s
+++ b/src/signal/or1k/sigsetjmp.s
@@ -6,17 +6,18 @@ sigsetjmp:
 __sigsetjmp:
 	l.sfeq	r4, r0
 	l.bf	plt(setjmp)
-	 l.sw	52(r3), r4	/* buf->__fl = save */
 
-	l.addi	r1, r1, -8
-	l.sw	0(r1), r9
-	l.sw	4(r1), r3
-	l.addi	r5, r3, 56	/* buf->__ss */
-	l.add	r4, r0, r0
-	l.jal	plt(sigprocmask)
-	 l.ori	r3, r0, 2	/* SIG_SETMASK */
+	l.sw    52(r3), r9
+	l.sw    52+4+8(r3), r20
 
-	l.lwz	r9, 0(r1)
-	l.lwz	r3, 4(r1)
-	l.j	plt(setjmp)
-	 l.addi	r1, r1, 8
+	l.jal	plt(setjmp)
+	 l.ori   r20, r3, 0
+
+	l.ori r4, r11, 0
+	l.ori r3, r20, 0
+
+	l.lwz   r9, 52(r3)
+
+.hidden __sigsetjmp_tail
+	l.j	plt(__sigsetjmp_tail)
+	 l.lwz   r20, 52+4+8(r3)
diff --git a/src/signal/powerpc/sigsetjmp.s b/src/signal/powerpc/sigsetjmp.s
index 461b7372..78acf590 100644
--- a/src/signal/powerpc/sigsetjmp.s
+++ b/src/signal/powerpc/sigsetjmp.s
@@ -4,35 +4,23 @@
 	.type __sigsetjmp,%function
 sigsetjmp:
 __sigsetjmp:
-	#int sigsetjmp(sigjmp_buf buf, int save)
-	#		r3		r4
-	#0) store save into buf->__fl
-	stw 4, 448(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);
-	# store non-volatile regs 30, 31 into the setjmp buf
-	stw 30, 0(3)
-	stw 31, 4(3)
-	# use them to store the pointer to the jmpbuf and the link reg
-	mr 30, 3
-	mflr 31
-	
-	# put pointer to ss buf into r5 (3rd arg)
-	addi 5, 3, 452
-	# put "2" i.e. SIG_SETMASK in r3
-	li 3, 2
-	li 4, 0
-	bl pthread_sigmask
-	
-	#restore jmpbuf pointer and link reg
-	mr 3, 30
-	mtlr 31
-	#resore non-volatile regs
-	lwz 30, 0(3)
-	lwz 31, 4(3)
 
-1:
-	b setjmp
+	mflr 5
+	stw 5, 448(3)
+	stw 16, 448+4+8(3)
+	mr 16, 3
+
+	bl setjmp
+
+	mr 4, 3
+	mr 3, 16
+	lwz 5, 448(3)
+	mtlr 5
+	lwz 16, 448+4+8(3)
+
+.hidden __sigsetjmp_tail
+	b __sigsetjmp_tail
+
+1:	b setjmp
diff --git a/src/signal/sh/sigsetjmp.s b/src/signal/sh/sigsetjmp.s
index 7951f07e..7d1e7c95 100644
--- a/src/signal/sh/sigsetjmp.s
+++ b/src/signal/sh/sigsetjmp.s
@@ -4,27 +4,37 @@
 .type __sigsetjmp,@function
 sigsetjmp:
 __sigsetjmp:
-	mov.l r5, @(36,r4)
 	tst r5, r5
-	bf  2f
+	bt 9f
 
-	sts.l pr, @-r15
-	mov.l r4, @-r15
 	mov r4, r6
-	add #40, r6
-	mov #0, r5
-	mov #2, r4
-	mov.l L1, r0
-	bsrf  r0
-	 nop
-1:	mov.l @r15+, r4
-	lds.l @r15+, pr
+	add #52, r6
+	sts pr, r0
+	mov.l r0, @r6
+	mov.l r8, @(4+8,r6)
+
+	mov.l 1f, r0
+2:	bsrf r0
+	 mov r4, r8
+
+	mov r0, r5
+	mov r8, r4
+	mov r4, r6
+	add #52, r6
+
+	mov.l @r6, r0
+	lds r0, pr
+
+	mov.l 3f, r0
+4:	braf r0
+	 mov.l @(4+8,r4), r8
 
-2:	mov.l L2, r0
-	braf  r0
+9:	mov.l 5f, r0
+6:	braf r0
 	 nop
-3:
 
 .align 2
-L1:	.long pthread_sigmask@PLT-(1b-.)
-L2:	.long setjmp@PLT-(3b-.)
+1:	.long setjmp@PLT-(2b+4-.)
+.hidden __sigsetjmp_tail
+3:	.long __sigsetjmp_tail@PLT-(4b+4-.)
+5:	.long setjmp@PLT-(6b+4-.)
diff --git a/src/signal/siglongjmp.c b/src/signal/siglongjmp.c
index b644cebb..bc317acc 100644
--- a/src/signal/siglongjmp.c
+++ b/src/signal/siglongjmp.c
@@ -5,6 +5,5 @@
 
 _Noreturn void siglongjmp(sigjmp_buf buf, int ret)
 {
-	if (buf->__fl) __restore_sigs(buf->__ss);
 	longjmp(buf, ret);
 }
diff --git a/src/signal/sigsetjmp_tail.c b/src/signal/sigsetjmp_tail.c
new file mode 100644
index 00000000..487ad8ca
--- /dev/null
+++ b/src/signal/sigsetjmp_tail.c
@@ -0,0 +1,13 @@
+#include <setjmp.h>
+#include <signal.h>
+#include "syscall.h"
+
+#ifdef SHARED
+__attribute__((__visibility__("hidden")))
+#endif
+int __sigsetjmp_tail(sigjmp_buf jb, int ret)
+{
+	void *p = jb->__ss;
+	__syscall(SYS_rt_sigprocmask, SIG_SETMASK, ret?p:0, ret?0:p, _NSIG/8);
+	return ret;
+}
diff --git a/src/signal/x32/sigsetjmp.s b/src/signal/x32/sigsetjmp.s
index 17436f02..d354d680 100644
--- a/src/signal/x32/sigsetjmp.s
+++ b/src/signal/x32/sigsetjmp.s
@@ -1,17 +1,24 @@
-/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
 .global sigsetjmp
 .global __sigsetjmp
 .type sigsetjmp,@function
 .type __sigsetjmp,@function
 sigsetjmp:
 __sigsetjmp:
-	andl %esi,%esi
-	movq %rsi,64(%rdi)
+	test %esi,%esi
 	jz 1f
-	pushq %rdi
-	leaq 72(%rdi),%rdx
-	xorl %esi,%esi
-	movl $2,%edi
-	call sigprocmask
-	popq %rdi
+
+	popq 64(%rdi)
+	mov %rbx,72+8(%rdi)
+	mov %rdi,%rbx
+
+	call setjmp
+
+	pushq 64(%rbx)
+	mov %rbx,%rdi
+	mov %eax,%esi
+	mov 72+8(%rbx),%rbx
+
+.hidden __sigsetjmp_tail
+	jmp __sigsetjmp_tail
+
 1:	jmp setjmp
diff --git a/src/signal/x86_64/sigsetjmp.s b/src/signal/x86_64/sigsetjmp.s
index 17436f02..d354d680 100644
--- a/src/signal/x86_64/sigsetjmp.s
+++ b/src/signal/x86_64/sigsetjmp.s
@@ -1,17 +1,24 @@
-/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
 .global sigsetjmp
 .global __sigsetjmp
 .type sigsetjmp,@function
 .type __sigsetjmp,@function
 sigsetjmp:
 __sigsetjmp:
-	andl %esi,%esi
-	movq %rsi,64(%rdi)
+	test %esi,%esi
 	jz 1f
-	pushq %rdi
-	leaq 72(%rdi),%rdx
-	xorl %esi,%esi
-	movl $2,%edi
-	call sigprocmask
-	popq %rdi
+
+	popq 64(%rdi)
+	mov %rbx,72+8(%rdi)
+	mov %rdi,%rbx
+
+	call setjmp
+
+	pushq 64(%rbx)
+	mov %rbx,%rdi
+	mov %eax,%esi
+	mov 72+8(%rbx),%rbx
+
+.hidden __sigsetjmp_tail
+	jmp __sigsetjmp_tail
+
 1:	jmp setjmp