setjmp.S revision 686e5f6f69c5c30a09d73e42657cb502a261ad6a
14906e5653c57d49f94940f28556009a88c42a583Elliott Hughes/*
24906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * Copyright (c) 2001 Wasabi Systems, Inc.
34906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * All rights reserved.
44906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *
54906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * Written by Frank van der Linden for Wasabi Systems, Inc.
64906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *
74906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * Redistribution and use in source and binary forms, with or without
84906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * modification, are permitted provided that the following conditions
94906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * are met:
104906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * 1. Redistributions of source code must retain the above copyright
114906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *    notice, this list of conditions and the following disclaimer.
124906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
134906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *    notice, this list of conditions and the following disclaimer in the
144906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *    documentation and/or other materials provided with the distribution.
154906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * 3. All advertising materials mentioning features or use of this software
164906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *    must display the following acknowledgement:
174906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *      This product includes software developed for the NetBSD Project by
184906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *      Wasabi Systems, Inc.
194906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * 4. The name of Wasabi Systems, Inc. may not be used to endorse
204906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *    or promote products derived from this software without specific prior
214906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *    written permission.
224906e5653c57d49f94940f28556009a88c42a583Elliott Hughes *
234906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
244906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
254906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
264906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
274906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
284906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
294906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
304906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
314906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
324906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
334906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * POSSIBILITY OF SUCH DAMAGE.
344906e5653c57d49f94940f28556009a88c42a583Elliott Hughes */
354906e5653c57d49f94940f28556009a88c42a583Elliott Hughes
36851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h>
374906e5653c57d49f94940f28556009a88c42a583Elliott Hughes
38c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao
39c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// The internal structure of a jmp_buf is totally private.
40c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// Current layout (changes from release to release):
41c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao//
42c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// word   name            description
43c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 0      rbx             registers
44c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 1      rbp
45c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 2      r12
46c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 3      r13
47c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 4      r14
48c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 5      r15
49c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 6      rsp
50c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 7      pc
51c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 8      sigflag/cookie  setjmp cookie in top 31 bits, signal mask flag in low bit
52c244fcb8a3396f94976a56379cce144c4451c3d4Josh Gao// 9      sigmask         signal mask (includes rt signals as well)
53686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao// 10     checksum        checksum of the core registers, to give better error messages.
548d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
558d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_RBX 0
568d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_RBP 1
578d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_R12 2
588d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_R13 3
598d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_R14 4
608d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_R15 5
618d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_RSP 6
628d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_PC 7
638d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_SIGFLAG 8
648d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes#define _JB_SIGMASK 9
65686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao#define _JB_CHECKSUM 10
664906e5653c57d49f94940f28556009a88c42a583Elliott Hughes
672342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao#define MANGLE_REGISTERS 1
68686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao
692342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao.macro m_mangle_registers reg
702342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao#if MANGLE_REGISTERS
712342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%rbx
722342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%rbp
732342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%r12
742342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%r13
752342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%r14
762342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%r15
772342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%rsp
782342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  xorq \reg,%r11
792342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao#endif
802342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao.endm
812342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao
822342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao.macro m_unmangle_registers reg
832342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  m_mangle_registers \reg
842342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao.endm
852342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao
86686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao.macro m_calculate_checksum dst, src
87686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  movq $0, \dst
88686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  .irp i,0,1,2,3,4,5,6,7
89686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao    xorq (\i*8)(\src), \dst
90686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  .endr
91686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao.endm
922342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao
934906e5653c57d49f94940f28556009a88c42a583Elliott HughesENTRY(setjmp)
948d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movl $1,%esi
958d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  jmp PIC_PLT(sigsetjmp)
96507cfe2e10a6c4ad61b9638820ba10bfe881a18cChristopher FerrisEND(setjmp)
974906e5653c57d49f94940f28556009a88c42a583Elliott Hughes
988d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott HughesENTRY(_setjmp)
998d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movl $0,%esi
1008d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  jmp PIC_PLT(sigsetjmp)
1018d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott HughesEND(_setjmp)
1028d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1038d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
1048d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott HughesENTRY(sigsetjmp)
1052342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  pushq %rdi
1062342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  movq %rsi,%rdi
1072342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  call PIC_PLT(__bionic_setjmp_cookie_get)
1082342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  popq %rdi
1092342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao
1102342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  // Record setjmp cookie and whether or not we're saving the signal mask.
1112342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  movq %rax,(_JB_SIGFLAG * 8)(%rdi)
1122342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  pushq %rax
1138d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1148d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  // Do we need to save the signal mask?
1152342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  testq $1,%rax
1168d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  jz 2f
1178d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1181c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  // Save current signal mask.
1191c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  pushq %rdi // Push 'env'.
1201c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  // The 'how' argument is ignored if new_mask is NULL.
1211c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  xorq %rsi,%rsi // NULL.
1221c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  leaq (_JB_SIGMASK * 8)(%rdi),%rdx // old_mask.
1231c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  call PIC_PLT(sigprocmask)
1241c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  popq %rdi // Pop 'env'.
1258d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1268d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes2:
1278d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  // Save the callee-save registers.
1282342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  popq %rax
1292342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  andq $-2,%rax
1308d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (%rsp),%r11
1312342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  m_mangle_registers %rax
1328d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %rbx,(_JB_RBX * 8)(%rdi)
1338d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %rbp,(_JB_RBP * 8)(%rdi)
1348d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %r12,(_JB_R12 * 8)(%rdi)
1358d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %r13,(_JB_R13 * 8)(%rdi)
1368d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %r14,(_JB_R14 * 8)(%rdi)
1378d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %r15,(_JB_R15 * 8)(%rdi)
1388d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %rsp,(_JB_RSP * 8)(%rdi)
1398d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %r11,(_JB_PC  * 8)(%rdi)
1402342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  m_unmangle_registers %rax
1418d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
142686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  m_calculate_checksum %rax, %rdi
143686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  movq %rax, (_JB_CHECKSUM * 8)(%rdi)
144686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao
1458d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  xorl %eax,%eax
1468d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  ret
1478d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott HughesEND(sigsetjmp)
1488d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1498d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes// void siglongjmp(sigjmp_buf env, int value);
1508d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott HughesENTRY(siglongjmp)
1518d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %rdi,%r12
1528d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  pushq %rsi // Push 'value'.
1538d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
154686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  m_calculate_checksum %rax, %rdi
155686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  xorq (_JB_CHECKSUM * 8)(%rdi), %rax
156686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  jnz 3f
157686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao
1588d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  // Do we need to restore the signal mask?
1592342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  movq (_JB_SIGFLAG * 8)(%rdi), %rdi
1602342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  pushq %rdi // Push cookie
1612342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  testq $1, %rdi
1628d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  jz 2f
1638d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1648d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  // Restore the signal mask.
1651c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  movq $2,%rdi // SIG_SETMASK.
1661c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  leaq (_JB_SIGMASK * 8)(%r12),%rsi // new_mask.
1671c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  xorq %rdx,%rdx // NULL.
1681c0c0ede573e3caf86b6fc395ba933bfb7235afaElliott Hughes  call PIC_PLT(sigprocmask)
1698d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1708d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes2:
1712342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  // Fetch the setjmp cookie and clear the signal flag bit.
1722342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  popq %rcx
1732342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  andq $-2, %rcx
1742342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao
1758d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  popq %rax // Pop 'value'.
1768d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1778d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  // Restore the callee-save registers.
1788d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_RBX * 8)(%r12),%rbx
1798d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_RBP * 8)(%r12),%rbp
1808d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_R13 * 8)(%r12),%r13
1818d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_R14 * 8)(%r12),%r14
1828d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_R15 * 8)(%r12),%r15
1838d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_RSP * 8)(%r12),%rsp
1848d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_PC  * 8)(%r12),%r11
1858d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq (_JB_R12 * 8)(%r12),%r12
1862342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  m_unmangle_registers %rcx
1872342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao
1882342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  // Check the cookie.
1892342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  pushq %rax
1908dbf02d76a245c102e11442305dd5393c4051dbbJosh Gao  pushq %r11
1912342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  movq %rcx, %rdi
1922342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  call PIC_PLT(__bionic_setjmp_cookie_check)
1938dbf02d76a245c102e11442305dd5393c4051dbbJosh Gao  popq %r11
1942342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  popq %rax
1958d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
1962342e643d4c998ae314d03d207f703c1cc5159e4Josh Gao  // Return 1 if value is 0.
1978d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  testl %eax,%eax
1988d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  jnz 1f
1998d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  incl %eax
2008d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes1:
2018d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  movq %r11,0(%rsp)
2028d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes  ret
203686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao
204686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao3:
205686e5f6f69c5c30a09d73e42657cb502a261ad6aJosh Gao  call PIC_PLT(__bionic_setjmp_checksum_mismatch)
2068d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott HughesEND(siglongjmp)
2078d4c55cc741c4107f8a0fba16e5c178c9feb5d81Elliott Hughes
20824958514b92c9b9e111223e4e4c56ef1a52b6403Christopher FerrisALIAS_SYMBOL(longjmp, siglongjmp)
20924958514b92c9b9e111223e4e4c56ef1a52b6403Christopher FerrisALIAS_SYMBOL(_longjmp, siglongjmp)
210