diff options
author | Elliott Hughes <enh@google.com> | 2014-12-05 16:25:50 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-12-05 22:20:08 -0800 |
commit | 8d4c55cc741c4107f8a0fba16e5c178c9feb5d81 (patch) | |
tree | c52134050dabbfae3e4e95ec1d90e1e40942f330 | |
parent | 289f44a459b6b28f8e1bb7eef165699129878c85 (diff) | |
download | bionic-8d4c55cc741c4107f8a0fba16e5c178c9feb5d81.zip bionic-8d4c55cc741c4107f8a0fba16e5c178c9feb5d81.tar.gz bionic-8d4c55cc741c4107f8a0fba16e5c178c9feb5d81.tar.bz2 |
Clean up the x86-64 and x86 setjmp families.
Bug: 16918359
Change-Id: Ic8ca0af9ea99636bc71f19d46071f1cea6eef982
-rw-r--r-- | libc/arch-x86/bionic/_setjmp.S | 73 | ||||
-rw-r--r-- | libc/arch-x86/bionic/setjmp.S | 140 | ||||
-rw-r--r-- | libc/arch-x86/bionic/sigsetjmp.S | 86 | ||||
-rw-r--r-- | libc/arch-x86/x86.mk | 2 | ||||
-rw-r--r-- | libc/arch-x86_64/bionic/_setjmp.S | 83 | ||||
-rw-r--r-- | libc/arch-x86_64/bionic/setjmp.S | 145 | ||||
-rw-r--r-- | libc/arch-x86_64/bionic/sigsetjmp.S | 101 | ||||
-rw-r--r-- | libc/arch-x86_64/include/machine/setjmp.h | 17 | ||||
-rw-r--r-- | libc/arch-x86_64/x86_64.mk | 2 |
9 files changed, 181 insertions, 468 deletions
diff --git a/libc/arch-x86/bionic/_setjmp.S b/libc/arch-x86/bionic/_setjmp.S deleted file mode 100644 index 0b256a2..0000000 --- a/libc/arch-x86/bionic/_setjmp.S +++ /dev/null @@ -1,73 +0,0 @@ -/* $OpenBSD: _setjmp.S,v 1.5 2005/08/07 11:30:38 espie Exp $ */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> - -/* - * C library -- _setjmp, _longjmp - * - * _longjmp(a,v) - * will generate a "return(v)" from the last call to - * _setjmp(a) - * by restoring registers from the stack. - * The previous signal state is NOT restored. - */ - -ENTRY(_setjmp) - movl 4(%esp),%eax - movl 0(%esp),%edx - movl %edx, 0(%eax) /* rta */ - movl %ebx, 4(%eax) - movl %esp, 8(%eax) - movl %ebp,12(%eax) - movl %esi,16(%eax) - movl %edi,20(%eax) - xorl %eax,%eax - ret -END(_setjmp) - -ENTRY(_longjmp) - movl 4(%esp),%edx - movl 8(%esp),%eax - movl 0(%edx),%ecx - movl 4(%edx),%ebx - movl 8(%edx),%esp - movl 12(%edx),%ebp - movl 16(%edx),%esi - movl 20(%edx),%edi - testl %eax,%eax - jnz 1f - incl %eax -1: movl %ecx,0(%esp) - ret -END(_longjmp) diff --git a/libc/arch-x86/bionic/setjmp.S b/libc/arch-x86/bionic/setjmp.S index 8f9d67c..25a016d 100644 --- a/libc/arch-x86/bionic/setjmp.S +++ b/libc/arch-x86/bionic/setjmp.S @@ -1,4 +1,3 @@ -/* $OpenBSD: setjmp.S,v 1.8 2005/08/07 11:30:38 espie Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. @@ -33,55 +32,98 @@ #include <private/bionic_asm.h> -/* - * C library -- setjmp, longjmp - * - * longjmp(a,v) - * will generate a "return(v)" from the last call to - * setjmp(a) - * by restoring registers from the stack. - * The previous signal state is restored. - */ +#define _JB_EDX 0 +#define _JB_EBX 1 +#define _JB_ESP 2 +#define _JB_EBP 3 +#define _JB_ESI 4 +#define _JB_EDI 5 +#define _JB_SIGMASK 6 +#define _JB_SIGFLAG 7 ENTRY(setjmp) - PIC_PROLOGUE - pushl $0 - call PIC_PLT(sigblock) - addl $4,%esp - PIC_EPILOGUE - - movl 4(%esp),%ecx - movl 0(%esp),%edx - movl %edx, 0(%ecx) - movl %ebx, 4(%ecx) - movl %esp, 8(%ecx) - movl %ebp,12(%ecx) - movl %esi,16(%ecx) - movl %edi,20(%ecx) - movl %eax,24(%ecx) - xorl %eax,%eax - ret + movl 4(%esp),%ecx + movl $1,(_JB_SIGFLAG * 4)(%ecx) + jmp .L_sigsetjmp_signal_mask END(setjmp) -ENTRY(longjmp) - movl 4(%esp),%edx - PIC_PROLOGUE - pushl 24(%edx) - call PIC_PLT(sigsetmask) - addl $4,%esp - PIC_EPILOGUE - - movl 4(%esp),%edx - movl 8(%esp),%eax - movl 0(%edx),%ecx - movl 4(%edx),%ebx - movl 8(%edx),%esp - movl 12(%edx),%ebp - movl 16(%edx),%esi - movl 20(%edx),%edi - testl %eax,%eax - jnz 1f - incl %eax -1: movl %ecx,0(%esp) - ret -END(longjmp) +ENTRY(_setjmp) + movl 4(%esp),%ecx + movl $0,(_JB_SIGFLAG * 4)(%ecx) + jmp .L_sigsetjmp_no_signal_mask +END(_setjmp) + +ENTRY(sigsetjmp) + movl 4(%esp),%ecx + movl 8(%esp),%eax + + // Record whether or not the signal mask is valid. + movl %eax,(_JB_SIGFLAG * 4)(%ecx) + + // Do we need to save the signal mask? + testl %eax,%eax + jz 1f + +.L_sigsetjmp_signal_mask: + // Get the current signal mask. + PIC_PROLOGUE + pushl $0 + call PIC_PLT(sigblock) + addl $4,%esp + PIC_EPILOGUE + + // Save the signal mask. + movl 4(%esp),%ecx + movl %eax,(_JB_SIGMASK * 4)(%ecx) + +.L_sigsetjmp_no_signal_mask: +1: + // Save the callee-save registers. + movl 0(%esp),%edx + movl %edx,(_JB_EDX * 4)(%ecx) + movl %ebx,(_JB_EBX * 4)(%ecx) + movl %esp,(_JB_ESP * 4)(%ecx) + movl %ebp,(_JB_EBP * 4)(%ecx) + movl %esi,(_JB_ESI * 4)(%ecx) + movl %edi,(_JB_EDI * 4)(%ecx) + + xorl %eax,%eax + ret +END(sigsetjmp) + +ENTRY(siglongjmp) + // Do we have a signal mask to restore? + movl 4(%esp),%edx + cmpl $0,(_JB_SIGFLAG * 4)(%edx) + jz 1f + + // Restore the signal mask. + PIC_PROLOGUE + pushl (_JB_SIGMASK * 4)(%edx) + call PIC_PLT(sigsetmask) + addl $4,%esp + PIC_EPILOGUE + +1: + // Restore the callee-save registers. + movl 4(%esp),%edx + movl 8(%esp),%eax + movl (_JB_EDX * 4)(%edx),%ecx + movl (_JB_EBX * 4)(%edx),%ebx + movl (_JB_ESP * 4)(%edx),%esp + movl (_JB_EBP * 4)(%edx),%ebp + movl (_JB_ESI * 4)(%edx),%esi + movl (_JB_EDI * 4)(%edx),%edi + + testl %eax,%eax + jnz 2f + incl %eax +2: + movl %ecx,0(%esp) + ret +END(siglongjmp) + + .globl longjmp + .equ longjmp, siglongjmp + .globl _longjmp + .equ _longjmp, siglongjmp diff --git a/libc/arch-x86/bionic/sigsetjmp.S b/libc/arch-x86/bionic/sigsetjmp.S deleted file mode 100644 index 250c606..0000000 --- a/libc/arch-x86/bionic/sigsetjmp.S +++ /dev/null @@ -1,86 +0,0 @@ -/* $OpenBSD: sigsetjmp.S,v 1.7 2005/08/07 11:30:38 espie Exp $ */ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> - -ENTRY(sigsetjmp) - movl 4(%esp),%ecx - movl 8(%esp),%eax - movl %eax,28(%ecx) - testl %eax,%eax - jz 1f - - PIC_PROLOGUE - pushl $0 - call PIC_PLT(sigblock) - addl $4,%esp - PIC_EPILOGUE - - movl 4(%esp),%ecx - movl %eax,24(%ecx) -1: movl 0(%esp),%edx - movl %edx, 0(%ecx) - movl %ebx, 4(%ecx) - movl %esp, 8(%ecx) - movl %ebp,12(%ecx) - movl %esi,16(%ecx) - movl %edi,20(%ecx) - xorl %eax,%eax - ret -END(sigsetjmp) - -ENTRY(siglongjmp) - movl 4(%esp),%edx - cmpl $0,28(%edx) - jz 1f - - PIC_PROLOGUE - pushl 24(%edx) - call PIC_PLT(sigsetmask) - addl $4,%esp - PIC_EPILOGUE - -1: movl 4(%esp),%edx - movl 8(%esp),%eax - movl 0(%edx),%ecx - movl 4(%edx),%ebx - movl 8(%edx),%esp - movl 12(%edx),%ebp - movl 16(%edx),%esi - movl 20(%edx),%edi - testl %eax,%eax - jnz 2f - incl %eax -2: movl %ecx,0(%esp) - ret -END(siglongjmp) diff --git a/libc/arch-x86/x86.mk b/libc/arch-x86/x86.mk index 2c90317..989690c 100644 --- a/libc/arch-x86/x86.mk +++ b/libc/arch-x86/x86.mk @@ -40,10 +40,8 @@ libc_bionic_src_files_x86 += \ arch-x86/bionic/_exit_with_stack_teardown.S \ arch-x86/bionic/libgcc_compat.c \ arch-x86/bionic/__restore.S \ - arch-x86/bionic/_setjmp.S \ arch-x86/bionic/setjmp.S \ arch-x86/bionic/__set_tls.c \ - arch-x86/bionic/sigsetjmp.S \ arch-x86/bionic/syscall.S \ arch-x86/bionic/vfork.S \ diff --git a/libc/arch-x86_64/bionic/_setjmp.S b/libc/arch-x86_64/bionic/_setjmp.S deleted file mode 100644 index c617030..0000000 --- a/libc/arch-x86_64/bionic/_setjmp.S +++ /dev/null @@ -1,83 +0,0 @@ -/* $OpenBSD: _setjmp.S,v 1.1 2004/01/28 01:44:45 mickey Exp $ */ -/* $NetBSD: _setjmp.S,v 1.1 2001/06/19 00:25:02 fvdl Exp $ */ - -/* - * Copyright (c) 2001 Wasabi Systems, Inc. - * All rights reserved. - * - * Written by Frank van der Linden for Wasabi Systems, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed for the NetBSD Project by - * Wasabi Systems, Inc. - * 4. The name of Wasabi Systems, Inc. may not be used to endorse - * or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <private/bionic_asm.h> -#include <machine/setjmp.h> - -/* - * C library -- _setjmp, _longjmp - * - * _longjmp(a,v) - * will generate a "return(v)" from the last call to - * _setjmp(a) - * by restoring registers from the stack. - * The previous signal state is NOT restored. - */ - -ENTRY(_setjmp) - movq (%rsp),%r11 - movq %rbx,(_JB_RBX * 8)(%rdi) - movq %rbp,(_JB_RBP * 8)(%rdi) - movq %r12,(_JB_R12 * 8)(%rdi) - movq %r13,(_JB_R13 * 8)(%rdi) - movq %r14,(_JB_R14 * 8)(%rdi) - movq %r15,(_JB_R15 * 8)(%rdi) - movq %rsp,(_JB_RSP * 8)(%rdi) - movq %r11,(_JB_PC * 8)(%rdi) - - xorl %eax,%eax - ret -END(_setjmp) - -ENTRY(_longjmp) - movq (_JB_RBX * 8)(%rdi),%rbx - movq (_JB_RBP * 8)(%rdi),%rbp - movq (_JB_R12 * 8)(%rdi),%r12 - movq (_JB_R13 * 8)(%rdi),%r13 - movq (_JB_R14 * 8)(%rdi),%r14 - movq (_JB_R15 * 8)(%rdi),%r15 - movq (_JB_RSP * 8)(%rdi),%rsp - movq (_JB_PC * 8)(%rdi),%r11 - - movl %esi,%eax - testl %eax,%eax - jnz 1f - incl %eax -1: movq %r11,0(%rsp) - ret -END(_longjmp) diff --git a/libc/arch-x86_64/bionic/setjmp.S b/libc/arch-x86_64/bionic/setjmp.S index f356877..a8f614f 100644 --- a/libc/arch-x86_64/bionic/setjmp.S +++ b/libc/arch-x86_64/bionic/setjmp.S @@ -1,6 +1,3 @@ -/* $OpenBSD: setjmp.S,v 1.3 2012/08/22 17:19:34 pascal Exp $ */ -/* $NetBSD: __setjmp14.S,v 1.1 2001/06/19 00:25:02 fvdl Exp $ */ - /* * Copyright (c) 2001 Wasabi Systems, Inc. * All rights reserved. @@ -37,60 +34,98 @@ */ #include <private/bionic_asm.h> -#include <machine/setjmp.h> -/* - * C library -- _setjmp, _longjmp - * - * longjmp(a,v) - * will generate a "return(v)" from the last call to - * setjmp(a) - * by restoring registers from the stack. - * The previous signal state is restored. - */ +// These are only the callee-saved registers. Code calling setjmp +// will expect the rest to be clobbered anyway. + +#define _JB_RBX 0 +#define _JB_RBP 1 +#define _JB_R12 2 +#define _JB_R13 3 +#define _JB_R14 4 +#define _JB_R15 5 +#define _JB_RSP 6 +#define _JB_PC 7 +#define _JB_SIGFLAG 8 +#define _JB_SIGMASK 9 ENTRY(setjmp) - pushq %rdi - xorq %rdi,%rdi - call PIC_PLT(sigblock) - popq %rdi - movq %rax,(_JB_SIGMASK * 8)(%rdi) - - movq (%rsp),%r11 - movq %rbx,(_JB_RBX * 8)(%rdi) - movq %rbp,(_JB_RBP * 8)(%rdi) - movq %r12,(_JB_R12 * 8)(%rdi) - movq %r13,(_JB_R13 * 8)(%rdi) - movq %r14,(_JB_R14 * 8)(%rdi) - movq %r15,(_JB_R15 * 8)(%rdi) - movq %rsp,(_JB_RSP * 8)(%rdi) - movq %r11,(_JB_PC * 8)(%rdi) - -2: xorl %eax,%eax - ret + movl $1,%esi + jmp PIC_PLT(sigsetjmp) END(setjmp) -ENTRY(longjmp) - movq %rdi,%r12 - movl %esi,%r8d - - movq (_JB_SIGMASK * 8)(%rdi),%rdi - pushq %r8 - call PIC_PLT(sigsetmask) - popq %r8 - movq (_JB_RBX * 8)(%r12),%rbx - movq (_JB_RBP * 8)(%r12),%rbp - movq (_JB_R13 * 8)(%r12),%r13 - movq (_JB_R14 * 8)(%r12),%r14 - movq (_JB_R15 * 8)(%r12),%r15 - movq (_JB_RSP * 8)(%r12),%rsp - movq (_JB_PC * 8)(%r12),%r11 - movq (_JB_R12 * 8)(%r12),%r12 - - movl %r8d,%eax - testl %eax,%eax - jnz 1f - incl %eax -1: movq %r11,0(%rsp) - ret -END(longjmp) +ENTRY(_setjmp) + movl $0,%esi + jmp PIC_PLT(sigsetjmp) +END(_setjmp) + +// int sigsetjmp(sigjmp_buf env, int save_signal_mask); +ENTRY(sigsetjmp) + // Record whether or not we're saving the signal mask. + movl %esi,(_JB_SIGFLAG * 8)(%rdi) + + // Do we need to save the signal mask? + testl %esi,%esi + jz 2f + + // Save the signal mask. + pushq %rdi + xorq %rdi,%rdi + call PIC_PLT(sigblock) + popq %rdi + movq %rax,(_JB_SIGMASK * 8)(%rdi) + +2: + // Save the callee-save registers. + movq (%rsp),%r11 + movq %rbx,(_JB_RBX * 8)(%rdi) + movq %rbp,(_JB_RBP * 8)(%rdi) + movq %r12,(_JB_R12 * 8)(%rdi) + movq %r13,(_JB_R13 * 8)(%rdi) + movq %r14,(_JB_R14 * 8)(%rdi) + movq %r15,(_JB_R15 * 8)(%rdi) + movq %rsp,(_JB_RSP * 8)(%rdi) + movq %r11,(_JB_PC * 8)(%rdi) + + xorl %eax,%eax + ret +END(sigsetjmp) + +// void siglongjmp(sigjmp_buf env, int value); +ENTRY(siglongjmp) + movq %rdi,%r12 + pushq %rsi // Push 'value'. + + // Do we need to restore the signal mask? + cmpl $0, (_JB_SIGFLAG * 8)(%rdi) + jz 2f + + // Restore the signal mask. + movq (_JB_SIGMASK * 8)(%rdi),%rdi + call PIC_PLT(sigsetmask) + +2: + popq %rax // Pop 'value'. + + // Restore the callee-save registers. + movq (_JB_RBX * 8)(%r12),%rbx + movq (_JB_RBP * 8)(%r12),%rbp + movq (_JB_R13 * 8)(%r12),%r13 + movq (_JB_R14 * 8)(%r12),%r14 + movq (_JB_R15 * 8)(%r12),%r15 + movq (_JB_RSP * 8)(%r12),%rsp + movq (_JB_PC * 8)(%r12),%r11 + movq (_JB_R12 * 8)(%r12),%r12 + + testl %eax,%eax + jnz 1f + incl %eax +1: + movq %r11,0(%rsp) + ret +END(siglongjmp) + + .globl longjmp + .equ longjmp, siglongjmp + .globl _longjmp + .equ _longjmp, siglongjmp diff --git a/libc/arch-x86_64/bionic/sigsetjmp.S b/libc/arch-x86_64/bionic/sigsetjmp.S deleted file mode 100644 index 571fea3..0000000 --- a/libc/arch-x86_64/bionic/sigsetjmp.S +++ /dev/null @@ -1,101 +0,0 @@ -/* $OpenBSD: sigsetjmp.S,v 1.3 2012/08/22 17:19:34 pascal Exp $ */ -/* $NetBSD: __setjmp14.S,v 1.1 2001/06/19 00:25:02 fvdl Exp $ */ - -/* - * Copyright (c) 2001 Wasabi Systems, Inc. - * All rights reserved. - * - * Written by Frank van der Linden for Wasabi Systems, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed for the NetBSD Project by - * Wasabi Systems, Inc. - * 4. The name of Wasabi Systems, Inc. may not be used to endorse - * or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - -#include <private/bionic_asm.h> -#include <machine/setjmp.h> - -/* - * C library -- _setjmp, _longjmp - * - * longjmp(a,v) - * will generate a "return(v)" from the last call to - * setjmp(a) - * by restoring registers from the stack. - * The previous signal state is restored. - */ - -ENTRY(sigsetjmp) - movl %esi,(_JB_SIGFLAG * 8)(%rdi) - testl %esi,%esi - jz 2f - - pushq %rdi - xorq %rdi,%rdi - call PIC_PLT(sigblock) - popq %rdi - movq %rax,(_JB_SIGMASK * 8)(%rdi) - -2: movq (%rsp),%r11 - movq %rbx,(_JB_RBX * 8)(%rdi) - movq %rbp,(_JB_RBP * 8)(%rdi) - movq %r12,(_JB_R12 * 8)(%rdi) - movq %r13,(_JB_R13 * 8)(%rdi) - movq %r14,(_JB_R14 * 8)(%rdi) - movq %r15,(_JB_R15 * 8)(%rdi) - movq %rsp,(_JB_RSP * 8)(%rdi) - movq %r11,(_JB_PC * 8)(%rdi) - -2: xorl %eax,%eax - ret -END(sigsetjmp) - -ENTRY(siglongjmp) - movq %rdi,%r12 - pushq %rsi - cmpl $0, (_JB_SIGFLAG * 8)(%rdi) - jz 2f - - movq (_JB_SIGMASK * 8)(%rdi),%rdi - call PIC_PLT(sigsetmask) -2: popq %rax - movq (_JB_RBX * 8)(%r12),%rbx - movq (_JB_RBP * 8)(%r12),%rbp - movq (_JB_R13 * 8)(%r12),%r13 - movq (_JB_R14 * 8)(%r12),%r14 - movq (_JB_R15 * 8)(%r12),%r15 - movq (_JB_RSP * 8)(%r12),%rsp - movq (_JB_PC * 8)(%r12),%r11 - movq (_JB_R12 * 8)(%r12),%r12 - - testl %eax,%eax - jnz 1f - incl %eax -1: movq %r11,0(%rsp) - ret -END(siglongjmp) diff --git a/libc/arch-x86_64/include/machine/setjmp.h b/libc/arch-x86_64/include/machine/setjmp.h index 01d6066..46ddd4b 100644 --- a/libc/arch-x86_64/include/machine/setjmp.h +++ b/libc/arch-x86_64/include/machine/setjmp.h @@ -1,21 +1,4 @@ /* $OpenBSD: setjmp.h,v 1.1 2004/01/28 01:39:39 mickey Exp $ */ /* $NetBSD: setjmp.h,v 1.1 2003/04/26 18:39:47 fvdl Exp $ */ -/* - * machine/setjmp.h: machine dependent setjmp-related information. - * These are only the callee-saved registers, code calling setjmp - * will expect the rest to be clobbered anyway. - */ - -#define _JB_RBX 0 -#define _JB_RBP 1 -#define _JB_R12 2 -#define _JB_R13 3 -#define _JB_R14 4 -#define _JB_R15 5 -#define _JB_RSP 6 -#define _JB_PC 7 -#define _JB_SIGFLAG 8 -#define _JB_SIGMASK 9 - #define _JBLEN 11 /* size, in longs, of a jmp_buf */ diff --git a/libc/arch-x86_64/x86_64.mk b/libc/arch-x86_64/x86_64.mk index 00a3763..ae01d2a 100644 --- a/libc/arch-x86_64/x86_64.mk +++ b/libc/arch-x86_64/x86_64.mk @@ -33,10 +33,8 @@ libc_bionic_src_files_x86_64 += \ arch-x86_64/bionic/__bionic_clone.S \ arch-x86_64/bionic/_exit_with_stack_teardown.S \ arch-x86_64/bionic/__restore_rt.S \ - arch-x86_64/bionic/_setjmp.S \ arch-x86_64/bionic/setjmp.S \ arch-x86_64/bionic/__set_tls.c \ - arch-x86_64/bionic/sigsetjmp.S \ arch-x86_64/bionic/syscall.S \ arch-x86_64/bionic/vfork.S \ |