]> git.saurik.com Git - apple/libc.git/blame - sys/sigtramp.c
Libc-320.tar.gz
[apple/libc.git] / sys / sigtramp.c
CommitLineData
e9ce8d39
A
1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
734aad71 6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
e9ce8d39 7 *
734aad71
A
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
e9ce8d39
A
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
734aad71
A
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
e9ce8d39
A
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25/*
26 * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
27 */
28#import "sigcatch.h"
29#import <signal.h>
30#import <sys/signal.h>
5b2abdfb 31#import <ucontext.h>
e9ce8d39
A
32
33/*
34 * sigvec registers _sigtramp as the handler for any signal requiring
35 * user-mode intervention. All _sigtramp does is find the real handler,
36 * calls it, then sigreturn's.
37 *
38 * Note that the kernel saves/restores all of our register state.
39 */
40#if defined(__DYNAMIC__)
41int __in_sigtramp = 0;
42#endif
43
9385eb3d
A
44/* These defn should match the kernel one */
45#define UC_TRAD 1
46#ifdef __ppc__
47#define UC_TRAD64 20
48#define UC_TRAD64_VEC 25
49#define UC_FLAVOR 30
50#define UC_FLAVOR_VEC 35
51#define UC_FLAVOR64 40
52#define UC_FLAVOR64_VEC 45
53#define UC_DUAL 50
54#define UC_DUAL_VEC 55
55
56 /* The following are valid mcontext sizes */
57#define UC_FLAVOR_SIZE ((PPC_THREAD_STATE_COUNT + PPC_EXCEPTION_STATE_COUNT + PPC_FLOAT_STATE_COUNT) * sizeof(int))
58
59#define UC_FLAVOR_VEC_SIZE ((PPC_THREAD_STATE_COUNT + PPC_EXCEPTION_STATE_COUNT + PPC_FLOAT_STATE_COUNT + PPC_VECTOR_STATE_COUNT) * sizeof(int))
60
61#define UC_FLAVOR64_SIZE ((PPC_THREAD_STATE64_COUNT + PPC_EXCEPTION_STATE64_COUNT + PPC_FLOAT_STATE_COUNT) * sizeof(int))
62
63#define UC_FLAVOR64_VEC_SIZE ((PPC_THREAD_STATE64_COUNT + PPC_EXCEPTION_STATE64_COUNT + PPC_FLOAT_STATE_COUNT + PPC_VECTOR_STATE_COUNT) * sizeof(int))
64#endif
65
66#ifdef __ppc__
67/* This routine will be replaced by an assembly soon */
68static int
69restore64_state(mcontext_t mctx, mcontext64_t mctx64)
70{
71 if (mctx->ss.srr0 != (unsigned int)mctx64->ss.srr0)
72 return(0);
73 if (mctx->ss.srr1 != (unsigned int)mctx64->ss.srr1)
74 return(0);
75 if (mctx->ss.r0 != (unsigned int)mctx64->ss.r0)
76 return(0);
77 if (mctx->ss.r1 != (unsigned int)mctx->ss.r1)
78 return(0);
79 if (mctx->ss.r2 != (unsigned int)mctx->ss.r2)
80 return(0);
81 if (mctx->ss.r3 != (unsigned int)mctx->ss.r3)
82 return(0);
83 if (mctx->ss.r4 != (unsigned int)mctx->ss.r4)
84 return(0);
85 if (mctx->ss.r5 != (unsigned int)mctx->ss.r5)
86 return(0);
87 if (mctx->ss.r6 != (unsigned int)mctx->ss.r6)
88 return(0);
89 if (mctx->ss.r7 != (unsigned int)mctx->ss.r7)
90 return(0);
91 if (mctx->ss.r8 != (unsigned int)mctx->ss.r8)
92 return(0);
93 if (mctx->ss.r9 != (unsigned int)mctx->ss.r9)
94 return(0);
95 if (mctx->ss.r10 != (unsigned int)mctx->ss.r10)
96 return(0);
97 if (mctx->ss.r11 != (unsigned int)mctx->ss.r11)
98 return(0);
99 if (mctx->ss.r12 != (unsigned int)mctx->ss.r12)
100 return(0);
101 if (mctx->ss.r13 != (unsigned int)mctx->ss.r13)
102 return(0);
103 if (mctx->ss.r14 != (unsigned int)mctx->ss.r14)
104 return(0);
105 if (mctx->ss.r15 != (unsigned int)mctx->ss.r15)
106 return(0);
107 if (mctx->ss.r16 != (unsigned int)mctx->ss.r16)
108 return(0);
109 if (mctx->ss.r17 != (unsigned int)mctx->ss.r17)
110 return(0);
111 if (mctx->ss.r18 != (unsigned int)mctx->ss.r18)
112 return(0);
113 if (mctx->ss.r19 != (unsigned int)mctx->ss.r19)
114 return(0);
115 if (mctx->ss.r20 != (unsigned int)mctx->ss.r20)
116 return(0);
117 if (mctx->ss.r21 != (unsigned int)mctx->ss.r21)
118 return(0);
119 if (mctx->ss.r22 != (unsigned int)mctx64->ss.r22)
120 return(0);
121 if (mctx->ss.r23 != (unsigned int)mctx64->ss.r23)
122 return(0);
123 if (mctx->ss.r24 != (unsigned int)mctx64->ss.r24)
124 return(0);
125 if (mctx->ss.r25 != (unsigned int)mctx64->ss.r25)
126 return(0);
127 if (mctx->ss.r26 != (unsigned int)mctx64->ss.r26)
128 return(0);
129 if (mctx->ss.r27 != (unsigned int)mctx64->ss.r27)
130 return(0);
131 if (mctx->ss.r28 != (unsigned int)mctx64->ss.r28)
132 return(0);
133 if (mctx->ss.r29 != (unsigned int)mctx64->ss.r29)
134 return(0);
135 if (mctx->ss.r30 != (unsigned int)mctx64->ss.r30)
136 return(0);
137 if (mctx->ss.r31 != (unsigned int)mctx64->ss.r31)
138 return(0);
139
140 if (mctx->ss.cr != mctx64->ss.cr)
141 return(0);
142 if (mctx->ss.xer != (unsigned int)mctx64->ss.xer)
143 return(0);
144 if (mctx->ss.lr != (unsigned int)mctx64->ss.lr)
145 return(0);
146 if (mctx->ss.ctr != (unsigned int)mctx64->ss.ctr)
147 return(0);
148
149 return(1);
150
151}
152
153#endif
154
e9ce8d39
A
155void
156_sigtramp(
5b2abdfb
A
157 union __sigaction_u __sigaction_u,
158 int sigstyle,
159 int sig,
160 siginfo_t *sinfo,
161 struct ucontext *uctx
e9ce8d39 162) {
9385eb3d
A
163#ifdef __ppc__
164 int ctxstyle = UC_FLAVOR;
165#endif
166 mcontext_t mctx;
167 mcontext64_t mctx64;
e9ce8d39 168
e9ce8d39
A
169#if defined(__DYNAMIC__)
170 __in_sigtramp++;
171#endif
9385eb3d
A
172#ifndef __ppc__
173 if (sigstyle == UC_TRAD)
5b2abdfb 174 sa_handler(sig);
9385eb3d
A
175#else /* __ppc__ */
176 if ((sigstyle == UC_TRAD) || (sigstyle == UC_TRAD64) || (sigstyle == UC_TRAD64_VEC))
177 sa_handler(sig);
178
5b2abdfb
A
179 else
180 sa_sigaction(sig, sinfo, uctx);
e3cf15b6 181
9385eb3d
A
182 if ((sigstyle == UC_DUAL) || (sigstyle == UC_DUAL_VEC)) {
183 mctx = uctx->uc_mcontext;
184 mctx64 = (mcontext64_t)((char *)(uctx->uc_mcontext) + sizeof(struct mcontext));
185 /* restore 64bit state ? */
186 if (restore64_state(mctx, mctx64)) {
187 uctx->uc_mcontext = (void *)mctx64;
188 if (sigstyle == UC_DUAL) {
189 uctx->uc_mcsize = UC_FLAVOR64_SIZE;
190 ctxstyle = UC_FLAVOR64;
191 } else {
192 uctx->uc_mcsize = UC_FLAVOR64_VEC_SIZE;
193 ctxstyle = UC_FLAVOR64_VEC;
194 }
195 } else {
196 if (sigstyle == UC_DUAL)
197 ctxstyle = UC_FLAVOR;
198 else
199 ctxstyle = UC_FLAVOR_VEC;
200 }
201 } else
202 ctxstyle = sigstyle;
203#endif /* __ppc__ */
204
e9ce8d39
A
205#if defined(__DYNAMIC__)
206 __in_sigtramp--;
207#endif
9385eb3d
A
208#ifdef __ppc__
209 {
210 /* sigreturn(uctx, ctxstyle); */
211 /* syscall (SYS_SIGRETURN, uctx, ctxstyle); */
212 syscall (184, uctx, ctxstyle);
213 }
214#else
215 sigreturn(uctx);
216#endif /* __ppc__ */
e9ce8d39 217}
9385eb3d 218