]> git.saurik.com Git - apple/libplatform.git/blob - src/setjmp/i386/_sigtramp.s
libplatform-161.50.1.tar.gz
[apple/libplatform.git] / src / setjmp / i386 / _sigtramp.s
1 /*
2 * Copyright (c) 2007, 2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 #include <sys/syscall.h>
25
26 #if defined(__DYNAMIC__)
27 #if IGNORE_RDAR_13625839
28 .private_extern ___in_sigtramp
29 #endif
30 .globl ___in_sigtramp
31 .data
32 .align 2
33 ___in_sigtramp:
34 .space 4
35 #endif
36
37 #define UC_TRAD 1
38 #define UC_FLAVOR 30
39
40 /* Structure fields for ucontext and mcontext. */
41 #define UCONTEXT_UC_MCONTEXT 28
42
43 #define MCONTEXT_ES_EXCEPTION 0
44 #define MCONTEXT_SS_EAX 12
45 #define MCONTEXT_SS_EBX 16
46 #define MCONTEXT_SS_ECX 20
47 #define MCONTEXT_SS_EDX 24
48 #define MCONTEXT_SS_EDI 28
49 #define MCONTEXT_SS_ESI 32
50 #define MCONTEXT_SS_EBP 36
51 #define MCONTEXT_SS_ESP 40
52 #define MCONTEXT_SS_EFLAGS 48
53 #define MCONTEXT_SS_EIP 52
54
55 /* register use:
56 %ebp frame pointer
57 %ebx Address of "L00000000001$pb"
58 %esi uctx
59
60 void
61 _sigtramp(
62 union __sigaction_u __sigaction_u,
63 int sigstyle,
64 int sig,
65 siginfo_t *sinfo,
66 ucontext_t *uctx
67 )
68 */
69
70 .globl __sigtramp
71 .text
72 .align 4,0x90
73 __sigtramp:
74 Lstart:
75 /* Although this routine does not need any stack frame, various parts
76 of the OS can't analyse the stack without them. */
77 pushl %ebp
78 movl %esp, %ebp
79 subl $24, %esp
80 movl 8(%ebp), %ecx # get '__sigaction_u'
81 #if defined(__DYNAMIC__)
82 call 0f
83 "L00000000001$pb":
84 0:
85 popl %ebx
86 incl ___in_sigtramp-"L00000000001$pb"(%ebx)
87 #endif
88 movl 16(%ebp), %edx # get 'sig'
89 movl 20(%ebp), %eax # get 'sinfo'
90 movl 24(%ebp), %esi # get 'uctx'
91 /* Call the signal handler.
92 Some variants are not supposed to get the last two parameters,
93 but the test to prevent this is more expensive than just passing
94 them. */
95 movl %esi, 8(%esp)
96 movl %eax, 4(%esp)
97 movl %edx, (%esp)
98 call *%ecx
99 #if defined(__DYNAMIC__)
100 decl ___in_sigtramp-"L00000000001$pb"(%ebx)
101 #endif
102 movl %esi, 4(%esp)
103 movl $ UC_FLAVOR, 8(%esp)
104 movl $ SYS_sigreturn, %eax
105 int $0x80
106 Lend:
107
108 /* DWARF unwind table #defines. */
109 #define DW_CFA_advance_loc_4 0x44
110 #define DW_CFA_def_cfa 0x0c
111 #define DW_CFA_def_cfa_expression 0x0F
112 #define DW_CFA_expression 0x10
113 #define DW_CFA_val_expression 0x16
114 #define DW_CFA_offset(column) 0x80+(column)
115
116 /* DWARF expression #defines. */
117 #define DW_OP_deref 0x06
118 #define DW_OP_const1u 0x08
119 #define DW_OP_dup 0x12
120 #define DW_OP_drop 0x13
121 #define DW_OP_over 0x14
122 #define DW_OP_pick 0x15
123 #define DW_OP_swap 0x16
124 #define DW_OP_rot 0x17
125 #define DW_OP_abs 0x19
126 #define DW_OP_and 0x1a
127 #define DW_OP_div 0x1b
128 #define DW_OP_minus 0x1c
129 #define DW_OP_mod 0x1d
130 #define DW_OP_mul 0x1e
131 #define DW_OP_neg 0x1f
132 #define DW_OP_not 0x20
133 #define DW_OP_or 0x21
134 #define DW_OP_plus 0x22
135 #define DW_OP_plus_uconst 0x23
136 #define DW_OP_shl 0x24
137 #define DW_OP_shr 0x25
138 #define DW_OP_shra 0x26
139 #define DW_OP_xor 0x27
140 #define DW_OP_skip 0x2f
141 #define DW_OP_bra 0x28
142 #define DW_OP_eq 0x29
143 #define DW_OP_ge 0x2A
144 #define DW_OP_gt 0x2B
145 #define DW_OP_le 0x2C
146 #define DW_OP_lt 0x2D
147 #define DW_OP_ne 0x2E
148 #define DW_OP_lit(n) 0x30+(n)
149 #define DW_OP_breg(n) 0x70+(n)
150 #define DW_OP_deref_size 0x94
151
152 /* The location expression we'll use. */
153
154 #define loc_expr_for_reg(regno, offs) \
155 .byte DW_CFA_expression, regno, 5 /* block length */, \
156 DW_OP_breg(6), UCONTEXT_UC_MCONTEXT, DW_OP_deref, \
157 DW_OP_plus_uconst, offs
158
159 /* Unwind tables. */
160 .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
161 EH_frame1:
162 .set L$set$0,LECIE1-LSCIE1
163 .long L$set$0 # Length of Common Information Entry
164 LSCIE1:
165 .long 0 # CIE Identifier Tag
166 .byte 0x1 # CIE Version
167 .ascii "zRS\0" # CIE Augmentation
168 .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor
169 .byte 0x7c # sleb128 -4; CIE Data Alignment Factor
170 .byte 0x8 # CIE RA Column
171 .byte 0x1 # uleb128 0x1; Augmentation size
172 .byte 0x10 # FDE Encoding (pcrel)
173 .byte DW_CFA_def_cfa
174 .byte 0x5 # uleb128 0x5
175 .byte 0x4 # uleb128 0x4
176 .byte DW_CFA_offset(8)
177 .byte 0x1 # uleb128 0x1
178 .byte DW_CFA_offset(8) // double DW_CFA_offset (eip, -4) tells linker to not make compact unwind
179 .byte 0x1 # uleb128 0x1
180 .align 2
181 LECIE1:
182 .globl _sigtramp.eh
183 _sigtramp.eh:
184 LSFDE1:
185 .set L$set$1,LEFDE1-LASFDE1
186 .long L$set$1 # FDE Length
187 LASFDE1:
188 .long LASFDE1-EH_frame1 # FDE CIE offset
189 .long Lstart-. # FDE initial location
190 .set L$set$2,Lend-Lstart
191 .long L$set$2 # FDE address range
192 .byte 0x0 # uleb128 0x0; Augmentation size
193
194 /* Now for the expressions, which all compute
195 uctx->uc_mcontext->register
196 for each register.
197
198 Describe even the registers that are not call-saved because they
199 might be being used in the prologue to save other registers.
200 Only integer registers are described at present. */
201
202 loc_expr_for_reg (0, MCONTEXT_SS_EAX)
203 loc_expr_for_reg (1, MCONTEXT_SS_ECX)
204 loc_expr_for_reg (2, MCONTEXT_SS_EDX)
205 loc_expr_for_reg (3, MCONTEXT_SS_EBX)
206 loc_expr_for_reg (4, MCONTEXT_SS_EBP) # note that GCC switches
207 loc_expr_for_reg (5, MCONTEXT_SS_ESP) # DWARF registers 4 & 5
208 loc_expr_for_reg (6, MCONTEXT_SS_ESI)
209 loc_expr_for_reg (7, MCONTEXT_SS_EDI)
210 loc_expr_for_reg (9, MCONTEXT_SS_EFLAGS)
211
212 /* The Intel architecture classifies exceptions into three categories,
213 'faults' which put the address of the faulting instruction
214 in EIP, 'traps' which put the following instruction in EIP,
215 and 'aborts' which don't typically report the instruction
216 causing the exception.
217
218 The traps are #BP and #OF. */
219
220 .byte DW_CFA_val_expression, 8
221 .set L$set$3,Lpc_end-Lpc_start
222 .byte L$set$3
223 Lpc_start:
224 /* Push the mcontext address twice. */
225 .byte DW_OP_breg(6), UCONTEXT_UC_MCONTEXT, DW_OP_deref, DW_OP_dup
226 /* Find the value of EIP. */
227 .byte DW_OP_plus_uconst, MCONTEXT_SS_EIP, DW_OP_deref, DW_OP_swap
228 /* Determine the exception type. */
229 .byte DW_OP_plus_uconst, MCONTEXT_ES_EXCEPTION, DW_OP_deref
230 /* Check whether it is #BP (3) or #OF (4). */
231 .byte DW_OP_dup, DW_OP_lit(3), DW_OP_ne
232 .byte DW_OP_swap, DW_OP_lit(4), DW_OP_ne, DW_OP_and
233 /* If it is, then add 1 to the instruction address, so as to point
234 within or past the faulting instruction. */
235 .byte DW_OP_plus
236 Lpc_end:
237
238 /* The CFA will have been saved as the value of ESP (it is not
239 ESP+4). */
240 .byte DW_CFA_def_cfa_expression
241 .set L$set$4,Lcfa_end-Lcfa_start
242 .byte L$set$4
243 Lcfa_start:
244 .byte DW_OP_breg(6), UCONTEXT_UC_MCONTEXT, DW_OP_deref
245 .byte DW_OP_plus_uconst, MCONTEXT_SS_ESP, DW_OP_deref
246 Lcfa_end:
247
248 .align 2
249 LEFDE1:
250
251 .subsections_via_symbols