diff options
author | Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com> | 2008-11-24 21:21:37 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-25 23:11:51 -0500 |
commit | 2601657d223d82053d4e1fe1063091401e6b860a (patch) | |
tree | 04302bbebc28b0fc63a9e488dfcaeefff62a814f /arch/x86/kernel/signal_64.c | |
parent | 2456d738ef051f85170bf018faef63f83fa84eb5 (diff) |
x86: signal: move {setup|restore}_sigcontext()
Impact: cleanup
Move {setup|restore}_sigcontext() declaration onto head of file.
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/signal_64.c')
-rw-r--r-- | arch/x86/kernel/signal_64.c | 148 |
1 files changed, 74 insertions, 74 deletions
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index 32718f5e4f61..771c8fcc8b0d 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
@@ -50,28 +50,6 @@ | |||
50 | # define FIX_EFLAGS __FIX_EFLAGS | 50 | # define FIX_EFLAGS __FIX_EFLAGS |
51 | #endif | 51 | #endif |
52 | 52 | ||
53 | #ifdef CONFIG_X86_32 | ||
54 | asmlinkage int sys_sigaltstack(unsigned long bx) | ||
55 | { | ||
56 | /* | ||
57 | * This is needed to make gcc realize it doesn't own the | ||
58 | * "struct pt_regs" | ||
59 | */ | ||
60 | struct pt_regs *regs = (struct pt_regs *)&bx; | ||
61 | const stack_t __user *uss = (const stack_t __user *)bx; | ||
62 | stack_t __user *uoss = (stack_t __user *)regs->cx; | ||
63 | |||
64 | return do_sigaltstack(uss, uoss, regs->sp); | ||
65 | } | ||
66 | #else /* !CONFIG_X86_32 */ | ||
67 | asmlinkage long | ||
68 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
69 | struct pt_regs *regs) | ||
70 | { | ||
71 | return do_sigaltstack(uss, uoss, regs->sp); | ||
72 | } | ||
73 | #endif /* CONFIG_X86_32 */ | ||
74 | |||
75 | #define COPY(x) { \ | 53 | #define COPY(x) { \ |
76 | err |= __get_user(regs->x, &sc->x); \ | 54 | err |= __get_user(regs->x, &sc->x); \ |
77 | } | 55 | } |
@@ -82,9 +60,6 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | |||
82 | regs->seg = tmp | 3; \ | 60 | regs->seg = tmp | 3; \ |
83 | } | 61 | } |
84 | 62 | ||
85 | /* | ||
86 | * Do a signal return; undo the signal stack. | ||
87 | */ | ||
88 | static int | 63 | static int |
89 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | 64 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, |
90 | unsigned long *pax) | 65 | unsigned long *pax) |
@@ -138,54 +113,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
138 | return err; | 113 | return err; |
139 | } | 114 | } |
140 | 115 | ||
141 | static long do_rt_sigreturn(struct pt_regs *regs) | ||
142 | { | ||
143 | struct rt_sigframe __user *frame; | ||
144 | unsigned long ax; | ||
145 | sigset_t set; | ||
146 | |||
147 | frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long)); | ||
148 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | ||
149 | goto badframe; | ||
150 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) | ||
151 | goto badframe; | ||
152 | |||
153 | sigdelsetmask(&set, ~_BLOCKABLE); | ||
154 | spin_lock_irq(¤t->sighand->siglock); | ||
155 | current->blocked = set; | ||
156 | recalc_sigpending(); | ||
157 | spin_unlock_irq(¤t->sighand->siglock); | ||
158 | |||
159 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | ||
160 | goto badframe; | ||
161 | |||
162 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | ||
163 | goto badframe; | ||
164 | |||
165 | return ax; | ||
166 | |||
167 | badframe: | ||
168 | signal_fault(regs, frame, "rt_sigreturn"); | ||
169 | return 0; | ||
170 | } | ||
171 | |||
172 | #ifdef CONFIG_X86_32 | ||
173 | asmlinkage int sys_rt_sigreturn(unsigned long __unused) | ||
174 | { | ||
175 | struct pt_regs *regs = (struct pt_regs *)&__unused; | ||
176 | |||
177 | return do_rt_sigreturn(regs); | ||
178 | } | ||
179 | #else /* !CONFIG_X86_32 */ | ||
180 | asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | ||
181 | { | ||
182 | return do_rt_sigreturn(regs); | ||
183 | } | ||
184 | #endif /* CONFIG_X86_32 */ | ||
185 | |||
186 | /* | ||
187 | * Set up a signal frame. | ||
188 | */ | ||
189 | static int | 116 | static int |
190 | setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, | 117 | setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, |
191 | struct pt_regs *regs, unsigned long mask) | 118 | struct pt_regs *regs, unsigned long mask) |
@@ -247,10 +174,83 @@ setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, | |||
247 | return err; | 174 | return err; |
248 | } | 175 | } |
249 | 176 | ||
177 | #ifdef CONFIG_X86_32 | ||
178 | asmlinkage int sys_sigaltstack(unsigned long bx) | ||
179 | { | ||
180 | /* | ||
181 | * This is needed to make gcc realize it doesn't own the | ||
182 | * "struct pt_regs" | ||
183 | */ | ||
184 | struct pt_regs *regs = (struct pt_regs *)&bx; | ||
185 | const stack_t __user *uss = (const stack_t __user *)bx; | ||
186 | stack_t __user *uoss = (stack_t __user *)regs->cx; | ||
187 | |||
188 | return do_sigaltstack(uss, uoss, regs->sp); | ||
189 | } | ||
190 | #else /* !CONFIG_X86_32 */ | ||
191 | asmlinkage long | ||
192 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
193 | struct pt_regs *regs) | ||
194 | { | ||
195 | return do_sigaltstack(uss, uoss, regs->sp); | ||
196 | } | ||
197 | #endif /* CONFIG_X86_32 */ | ||
198 | |||
250 | /* | 199 | /* |
251 | * Determine which stack to use.. | 200 | * Do a signal return; undo the signal stack. |
201 | */ | ||
202 | static long do_rt_sigreturn(struct pt_regs *regs) | ||
203 | { | ||
204 | struct rt_sigframe __user *frame; | ||
205 | unsigned long ax; | ||
206 | sigset_t set; | ||
207 | |||
208 | frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long)); | ||
209 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | ||
210 | goto badframe; | ||
211 | if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) | ||
212 | goto badframe; | ||
213 | |||
214 | sigdelsetmask(&set, ~_BLOCKABLE); | ||
215 | spin_lock_irq(¤t->sighand->siglock); | ||
216 | current->blocked = set; | ||
217 | recalc_sigpending(); | ||
218 | spin_unlock_irq(¤t->sighand->siglock); | ||
219 | |||
220 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | ||
221 | goto badframe; | ||
222 | |||
223 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | ||
224 | goto badframe; | ||
225 | |||
226 | return ax; | ||
227 | |||
228 | badframe: | ||
229 | signal_fault(regs, frame, "rt_sigreturn"); | ||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | #ifdef CONFIG_X86_32 | ||
234 | asmlinkage int sys_rt_sigreturn(unsigned long __unused) | ||
235 | { | ||
236 | struct pt_regs *regs = (struct pt_regs *)&__unused; | ||
237 | |||
238 | return do_rt_sigreturn(regs); | ||
239 | } | ||
240 | #else /* !CONFIG_X86_32 */ | ||
241 | asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | ||
242 | { | ||
243 | return do_rt_sigreturn(regs); | ||
244 | } | ||
245 | #endif /* CONFIG_X86_32 */ | ||
246 | |||
247 | /* | ||
248 | * Set up a signal frame. | ||
252 | */ | 249 | */ |
253 | 250 | ||
251 | /* | ||
252 | * Determine which stack to use.. | ||
253 | */ | ||
254 | static void __user * | 254 | static void __user * |
255 | get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size) | 255 | get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size) |
256 | { | 256 | { |