diff options
-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 |