setjmp.S revision 8dbf02d76a245c102e11442305dd5393c4051dbb
1/*
2 * Copyright (c) 2001 Wasabi Systems, Inc.
3 * All rights reserved.
4 *
5 * Written by Frank van der Linden for Wasabi Systems, Inc.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *      This product includes software developed for the NetBSD Project by
18 *      Wasabi Systems, Inc.
19 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
20 *    or promote products derived from this software without specific prior
21 *    written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
27 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#include <private/bionic_asm.h>
37
38// These are only the callee-saved registers. Code calling setjmp
39// will expect the rest to be clobbered anyway.
40
41#define _JB_RBX 0
42#define _JB_RBP 1
43#define _JB_R12 2
44#define _JB_R13 3
45#define _JB_R14 4
46#define _JB_R15 5
47#define _JB_RSP 6
48#define _JB_PC 7
49#define _JB_SIGFLAG 8
50#define _JB_SIGMASK 9
51#define _JB_SIGMASK_RT 10 // sigprocmask will write here too.
52
53#define MANGLE_REGISTERS 1
54.macro m_mangle_registers reg
55#if MANGLE_REGISTERS
56  xorq \reg,%rbx
57  xorq \reg,%rbp
58  xorq \reg,%r12
59  xorq \reg,%r13
60  xorq \reg,%r14
61  xorq \reg,%r15
62  xorq \reg,%rsp
63  xorq \reg,%r11
64#endif
65.endm
66
67.macro m_unmangle_registers reg
68  m_mangle_registers \reg
69.endm
70
71
72ENTRY(setjmp)
73  movl $1,%esi
74  jmp PIC_PLT(sigsetjmp)
75END(setjmp)
76
77ENTRY(_setjmp)
78  movl $0,%esi
79  jmp PIC_PLT(sigsetjmp)
80END(_setjmp)
81
82// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
83ENTRY(sigsetjmp)
84  pushq %rdi
85  movq %rsi,%rdi
86  call PIC_PLT(__bionic_setjmp_cookie_get)
87  popq %rdi
88
89  // Record setjmp cookie and whether or not we're saving the signal mask.
90  movq %rax,(_JB_SIGFLAG * 8)(%rdi)
91  pushq %rax
92
93  // Do we need to save the signal mask?
94  testq $1,%rax
95  jz 2f
96
97  // Save current signal mask.
98  pushq %rdi // Push 'env'.
99  // The 'how' argument is ignored if new_mask is NULL.
100  xorq %rsi,%rsi // NULL.
101  leaq (_JB_SIGMASK * 8)(%rdi),%rdx // old_mask.
102  call PIC_PLT(sigprocmask)
103  popq %rdi // Pop 'env'.
104
1052:
106  // Save the callee-save registers.
107  popq %rax
108  andq $-2,%rax
109  movq (%rsp),%r11
110  m_mangle_registers %rax
111  movq %rbx,(_JB_RBX * 8)(%rdi)
112  movq %rbp,(_JB_RBP * 8)(%rdi)
113  movq %r12,(_JB_R12 * 8)(%rdi)
114  movq %r13,(_JB_R13 * 8)(%rdi)
115  movq %r14,(_JB_R14 * 8)(%rdi)
116  movq %r15,(_JB_R15 * 8)(%rdi)
117  movq %rsp,(_JB_RSP * 8)(%rdi)
118  movq %r11,(_JB_PC  * 8)(%rdi)
119  m_unmangle_registers %rax
120
121  xorl %eax,%eax
122  ret
123END(sigsetjmp)
124
125// void siglongjmp(sigjmp_buf env, int value);
126ENTRY(siglongjmp)
127  movq %rdi,%r12
128  pushq %rsi // Push 'value'.
129
130  // Do we need to restore the signal mask?
131  movq (_JB_SIGFLAG * 8)(%rdi), %rdi
132  pushq %rdi // Push cookie
133  testq $1, %rdi
134  jz 2f
135
136  // Restore the signal mask.
137  movq $2,%rdi // SIG_SETMASK.
138  leaq (_JB_SIGMASK * 8)(%r12),%rsi // new_mask.
139  xorq %rdx,%rdx // NULL.
140  call PIC_PLT(sigprocmask)
141
1422:
143  // Fetch the setjmp cookie and clear the signal flag bit.
144  popq %rcx
145  andq $-2, %rcx
146
147  popq %rax // Pop 'value'.
148
149  // Restore the callee-save registers.
150  movq (_JB_RBX * 8)(%r12),%rbx
151  movq (_JB_RBP * 8)(%r12),%rbp
152  movq (_JB_R13 * 8)(%r12),%r13
153  movq (_JB_R14 * 8)(%r12),%r14
154  movq (_JB_R15 * 8)(%r12),%r15
155  movq (_JB_RSP * 8)(%r12),%rsp
156  movq (_JB_PC  * 8)(%r12),%r11
157  movq (_JB_R12 * 8)(%r12),%r12
158  m_unmangle_registers %rcx
159
160  // Check the cookie.
161  pushq %rax
162  pushq %r11
163  movq %rcx, %rdi
164  call PIC_PLT(__bionic_setjmp_cookie_check)
165  popq %r11
166  popq %rax
167
168  // Return 1 if value is 0.
169  testl %eax,%eax
170  jnz 1f
171  incl %eax
1721:
173  movq %r11,0(%rsp)
174  ret
175END(siglongjmp)
176
177ALIAS_SYMBOL(longjmp, siglongjmp)
178ALIAS_SYMBOL(_longjmp, siglongjmp)
179