diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/signal/aarch64/sigsetjmp.s | 22 | ||||
| -rw-r--r-- | src/signal/arm/sigsetjmp.s | 24 | ||||
| -rw-r--r-- | src/signal/i386/sigsetjmp.s | 24 | ||||
| -rw-r--r-- | src/signal/microblaze/sigsetjmp.s | 26 | ||||
| -rw-r--r-- | src/signal/mips/sigsetjmp.s | 35 | ||||
| -rw-r--r-- | src/signal/or1k/sigsetjmp.s | 25 | ||||
| -rw-r--r-- | src/signal/powerpc/sigsetjmp.s | 46 | ||||
| -rw-r--r-- | src/signal/sh/sigsetjmp.s | 44 | ||||
| -rw-r--r-- | src/signal/siglongjmp.c | 1 | ||||
| -rw-r--r-- | src/signal/sigsetjmp_tail.c | 13 | ||||
| -rw-r--r-- | src/signal/x32/sigsetjmp.s | 25 | ||||
| -rw-r--r-- | src/signal/x86_64/sigsetjmp.s | 25 | 
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  | 
