aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/signal_64.c
diff options
context:
space:
mode:
authorHiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>2008-11-24 21:21:37 -0500
committerIngo Molnar <mingo@elte.hu>2008-11-25 23:11:51 -0500
commit2601657d223d82053d4e1fe1063091401e6b860a (patch)
tree04302bbebc28b0fc63a9e488dfcaeefff62a814f /arch/x86/kernel/signal_64.c
parent2456d738ef051f85170bf018faef63f83fa84eb5 (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.c148
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
54asmlinkage 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 */
67asmlinkage long
68sys_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 */
88static int 63static int
89restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, 64restore_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
141static 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(&current->sighand->siglock);
155 current->blocked = set;
156 recalc_sigpending();
157 spin_unlock_irq(&current->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
167badframe:
168 signal_fault(regs, frame, "rt_sigreturn");
169 return 0;
170}
171
172#ifdef CONFIG_X86_32
173asmlinkage 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 */
180asmlinkage 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 */
189static int 116static int
190setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, 117setup_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
178asmlinkage 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 */
191asmlinkage long
192sys_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 */
202static 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(&current->sighand->siglock);
216 current->blocked = set;
217 recalc_sigpending();
218 spin_unlock_irq(&current->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
228badframe:
229 signal_fault(regs, frame, "rt_sigreturn");
230 return 0;
231}
232
233#ifdef CONFIG_X86_32
234asmlinkage 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 */
241asmlinkage 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 */
254static void __user * 254static void __user *
255get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size) 255get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size)
256{ 256{