diff options
Diffstat (limited to 'arch/s390/kernel')
-rw-r--r-- | arch/s390/kernel/compat_signal.c | 79 | ||||
-rw-r--r-- | arch/s390/kernel/entry.h | 4 | ||||
-rw-r--r-- | arch/s390/kernel/signal.c | 78 |
3 files changed, 69 insertions, 92 deletions
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index f204d6920368..598b0b42668b 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -320,38 +320,39 @@ static inline int map_signal(int sig) | |||
320 | return sig; | 320 | return sig; |
321 | } | 321 | } |
322 | 322 | ||
323 | static int setup_frame32(int sig, struct k_sigaction *ka, | 323 | static int setup_frame32(struct ksignal *ksig, sigset_t *set, |
324 | sigset_t *set, struct pt_regs * regs) | 324 | struct pt_regs *regs) |
325 | { | 325 | { |
326 | sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32)); | 326 | int sig = ksig->sig; |
327 | sigframe32 __user *frame = get_sigframe(&ksig->ka, regs, sizeof(sigframe32)); | ||
327 | 328 | ||
328 | if (frame == (void __user *) -1UL) | 329 | if (frame == (void __user *) -1UL) |
329 | goto give_sigsegv; | 330 | return -EFAULT; |
330 | 331 | ||
331 | if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32)) | 332 | if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32)) |
332 | goto give_sigsegv; | 333 | return -EFAULT; |
333 | 334 | ||
334 | if (save_sigregs32(regs, &frame->sregs)) | 335 | if (save_sigregs32(regs, &frame->sregs)) |
335 | goto give_sigsegv; | 336 | return -EFAULT; |
336 | if (save_sigregs_gprs_high(regs, frame->gprs_high)) | 337 | if (save_sigregs_gprs_high(regs, frame->gprs_high)) |
337 | goto give_sigsegv; | 338 | return -EFAULT; |
338 | if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs)) | 339 | if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs)) |
339 | goto give_sigsegv; | 340 | return -EFAULT; |
340 | 341 | ||
341 | /* Set up to return from userspace. If provided, use a stub | 342 | /* Set up to return from userspace. If provided, use a stub |
342 | already in userspace. */ | 343 | already in userspace. */ |
343 | if (ka->sa.sa_flags & SA_RESTORER) { | 344 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
344 | regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE; | 345 | regs->gprs[14] = (__u64 __force) ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE; |
345 | } else { | 346 | } else { |
346 | regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE; | 347 | regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE; |
347 | if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, | 348 | if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, |
348 | (u16 __force __user *)(frame->retcode))) | 349 | (u16 __force __user *)(frame->retcode))) |
349 | goto give_sigsegv; | 350 | return -EFAULT; |
350 | } | 351 | } |
351 | 352 | ||
352 | /* Set up backchain. */ | 353 | /* Set up backchain. */ |
353 | if (__put_user(regs->gprs[15], (unsigned int __user *) frame)) | 354 | if (__put_user(regs->gprs[15], (unsigned int __user *) frame)) |
354 | goto give_sigsegv; | 355 | return -EFAULT; |
355 | 356 | ||
356 | /* Set up registers for signal handler */ | 357 | /* Set up registers for signal handler */ |
357 | regs->gprs[15] = (__force __u64) frame; | 358 | regs->gprs[15] = (__force __u64) frame; |
@@ -359,7 +360,7 @@ static int setup_frame32(int sig, struct k_sigaction *ka, | |||
359 | regs->psw.mask = PSW_MASK_BA | | 360 | regs->psw.mask = PSW_MASK_BA | |
360 | (PSW_USER_BITS & PSW_MASK_ASC) | | 361 | (PSW_USER_BITS & PSW_MASK_ASC) | |
361 | (regs->psw.mask & ~PSW_MASK_ASC); | 362 | (regs->psw.mask & ~PSW_MASK_ASC); |
362 | regs->psw.addr = (__force __u64) ka->sa.sa_handler; | 363 | regs->psw.addr = (__force __u64) ksig->ka.sa.sa_handler; |
363 | 364 | ||
364 | regs->gprs[2] = map_signal(sig); | 365 | regs->gprs[2] = map_signal(sig); |
365 | regs->gprs[3] = (__force __u64) &frame->sc; | 366 | regs->gprs[3] = (__force __u64) &frame->sc; |
@@ -376,25 +377,21 @@ static int setup_frame32(int sig, struct k_sigaction *ka, | |||
376 | 377 | ||
377 | /* Place signal number on stack to allow backtrace from handler. */ | 378 | /* Place signal number on stack to allow backtrace from handler. */ |
378 | if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo)) | 379 | if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo)) |
379 | goto give_sigsegv; | 380 | return -EFAULT; |
380 | return 0; | 381 | return 0; |
381 | |||
382 | give_sigsegv: | ||
383 | force_sigsegv(sig, current); | ||
384 | return -EFAULT; | ||
385 | } | 382 | } |
386 | 383 | ||
387 | static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info, | 384 | static int setup_rt_frame32(struct ksignal *ksig, sigset_t *set, |
388 | sigset_t *set, struct pt_regs * regs) | 385 | struct pt_regs *regs) |
389 | { | 386 | { |
390 | int err = 0; | 387 | int err = 0; |
391 | rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32)); | 388 | rt_sigframe32 __user *frame = get_sigframe(&ksig->ka, regs, sizeof(rt_sigframe32)); |
392 | 389 | ||
393 | if (frame == (void __user *) -1UL) | 390 | if (frame == (void __user *) -1UL) |
394 | goto give_sigsegv; | 391 | return -EFAULT; |
395 | 392 | ||
396 | if (copy_siginfo_to_user32(&frame->info, info)) | 393 | if (copy_siginfo_to_user32(&frame->info, &ksig->info)) |
397 | goto give_sigsegv; | 394 | return -EFAULT; |
398 | 395 | ||
399 | /* Create the ucontext. */ | 396 | /* Create the ucontext. */ |
400 | err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags); | 397 | err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags); |
@@ -404,22 +401,22 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
404 | err |= save_sigregs_gprs_high(regs, frame->gprs_high); | 401 | err |= save_sigregs_gprs_high(regs, frame->gprs_high); |
405 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 402 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
406 | if (err) | 403 | if (err) |
407 | goto give_sigsegv; | 404 | return -EFAULT; |
408 | 405 | ||
409 | /* Set up to return from userspace. If provided, use a stub | 406 | /* Set up to return from userspace. If provided, use a stub |
410 | already in userspace. */ | 407 | already in userspace. */ |
411 | if (ka->sa.sa_flags & SA_RESTORER) { | 408 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
412 | regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE; | 409 | regs->gprs[14] = (__u64 __force) ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE; |
413 | } else { | 410 | } else { |
414 | regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE; | 411 | regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE; |
415 | if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, | 412 | if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, |
416 | (u16 __force __user *)(frame->retcode))) | 413 | (u16 __force __user *)(frame->retcode))) |
417 | goto give_sigsegv; | 414 | return -EFAULT; |
418 | } | 415 | } |
419 | 416 | ||
420 | /* Set up backchain. */ | 417 | /* Set up backchain. */ |
421 | if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame)) | 418 | if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame)) |
422 | goto give_sigsegv; | 419 | return -EFAULT; |
423 | 420 | ||
424 | /* Set up registers for signal handler */ | 421 | /* Set up registers for signal handler */ |
425 | regs->gprs[15] = (__force __u64) frame; | 422 | regs->gprs[15] = (__force __u64) frame; |
@@ -427,36 +424,30 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
427 | regs->psw.mask = PSW_MASK_BA | | 424 | regs->psw.mask = PSW_MASK_BA | |
428 | (PSW_USER_BITS & PSW_MASK_ASC) | | 425 | (PSW_USER_BITS & PSW_MASK_ASC) | |
429 | (regs->psw.mask & ~PSW_MASK_ASC); | 426 | (regs->psw.mask & ~PSW_MASK_ASC); |
430 | regs->psw.addr = (__u64 __force) ka->sa.sa_handler; | 427 | regs->psw.addr = (__u64 __force) ksig->ka.sa.sa_handler; |
431 | 428 | ||
432 | regs->gprs[2] = map_signal(sig); | 429 | regs->gprs[2] = map_signal(ksig->sig); |
433 | regs->gprs[3] = (__force __u64) &frame->info; | 430 | regs->gprs[3] = (__force __u64) &frame->info; |
434 | regs->gprs[4] = (__force __u64) &frame->uc; | 431 | regs->gprs[4] = (__force __u64) &frame->uc; |
435 | regs->gprs[5] = task_thread_info(current)->last_break; | 432 | regs->gprs[5] = task_thread_info(current)->last_break; |
436 | return 0; | 433 | return 0; |
437 | |||
438 | give_sigsegv: | ||
439 | force_sigsegv(sig, current); | ||
440 | return -EFAULT; | ||
441 | } | 434 | } |
442 | 435 | ||
443 | /* | 436 | /* |
444 | * OK, we're invoking a handler | 437 | * OK, we're invoking a handler |
445 | */ | 438 | */ |
446 | 439 | ||
447 | void handle_signal32(unsigned long sig, struct k_sigaction *ka, | 440 | void handle_signal32(struct ksignal *ksig, sigset_t *oldset, |
448 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | 441 | struct pt_regs *regs) |
449 | { | 442 | { |
450 | int ret; | 443 | int ret; |
451 | 444 | ||
452 | /* Set up the stack frame */ | 445 | /* Set up the stack frame */ |
453 | if (ka->sa.sa_flags & SA_SIGINFO) | 446 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
454 | ret = setup_rt_frame32(sig, ka, info, oldset, regs); | 447 | ret = setup_rt_frame32(ksig, oldset, regs); |
455 | else | 448 | else |
456 | ret = setup_frame32(sig, ka, oldset, regs); | 449 | ret = setup_frame32(ksig, oldset, regs); |
457 | if (ret) | 450 | |
458 | return; | 451 | signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP)); |
459 | signal_delivered(sig, info, ka, regs, | ||
460 | test_thread_flag(TIF_SINGLE_STEP)); | ||
461 | } | 452 | } |
462 | 453 | ||
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index 6ac78192455f..1aad48398d06 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
@@ -48,8 +48,8 @@ void do_per_trap(struct pt_regs *regs); | |||
48 | void syscall_trace(struct pt_regs *regs, int entryexit); | 48 | void syscall_trace(struct pt_regs *regs, int entryexit); |
49 | void kernel_stack_overflow(struct pt_regs * regs); | 49 | void kernel_stack_overflow(struct pt_regs * regs); |
50 | void do_signal(struct pt_regs *regs); | 50 | void do_signal(struct pt_regs *regs); |
51 | void handle_signal32(unsigned long sig, struct k_sigaction *ka, | 51 | void handle_signal32(struct ksignal *ksig, sigset_t *oldset, |
52 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs); | 52 | struct pt_regs *regs); |
53 | void do_notify_resume(struct pt_regs *regs); | 53 | void do_notify_resume(struct pt_regs *regs); |
54 | 54 | ||
55 | void __init init_IRQ(void); | 55 | void __init init_IRQ(void); |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 42b49f9e19bf..469c4c6d9182 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -200,15 +200,15 @@ static int setup_frame(int sig, struct k_sigaction *ka, | |||
200 | frame = get_sigframe(ka, regs, sizeof(sigframe)); | 200 | frame = get_sigframe(ka, regs, sizeof(sigframe)); |
201 | 201 | ||
202 | if (frame == (void __user *) -1UL) | 202 | if (frame == (void __user *) -1UL) |
203 | goto give_sigsegv; | 203 | return -EFAULT; |
204 | 204 | ||
205 | if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE)) | 205 | if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE)) |
206 | goto give_sigsegv; | 206 | return -EFAULT; |
207 | 207 | ||
208 | if (save_sigregs(regs, &frame->sregs)) | 208 | if (save_sigregs(regs, &frame->sregs)) |
209 | goto give_sigsegv; | 209 | return -EFAULT; |
210 | if (__put_user(&frame->sregs, &frame->sc.sregs)) | 210 | if (__put_user(&frame->sregs, &frame->sc.sregs)) |
211 | goto give_sigsegv; | 211 | return -EFAULT; |
212 | 212 | ||
213 | /* Set up to return from userspace. If provided, use a stub | 213 | /* Set up to return from userspace. If provided, use a stub |
214 | already in userspace. */ | 214 | already in userspace. */ |
@@ -220,12 +220,12 @@ static int setup_frame(int sig, struct k_sigaction *ka, | |||
220 | frame->retcode | PSW_ADDR_AMODE; | 220 | frame->retcode | PSW_ADDR_AMODE; |
221 | if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, | 221 | if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, |
222 | (u16 __user *)(frame->retcode))) | 222 | (u16 __user *)(frame->retcode))) |
223 | goto give_sigsegv; | 223 | return -EFAULT; |
224 | } | 224 | } |
225 | 225 | ||
226 | /* Set up backchain. */ | 226 | /* Set up backchain. */ |
227 | if (__put_user(regs->gprs[15], (addr_t __user *) frame)) | 227 | if (__put_user(regs->gprs[15], (addr_t __user *) frame)) |
228 | goto give_sigsegv; | 228 | return -EFAULT; |
229 | 229 | ||
230 | /* Set up registers for signal handler */ | 230 | /* Set up registers for signal handler */ |
231 | regs->gprs[15] = (unsigned long) frame; | 231 | regs->gprs[15] = (unsigned long) frame; |
@@ -250,27 +250,23 @@ static int setup_frame(int sig, struct k_sigaction *ka, | |||
250 | 250 | ||
251 | /* Place signal number on stack to allow backtrace from handler. */ | 251 | /* Place signal number on stack to allow backtrace from handler. */ |
252 | if (__put_user(regs->gprs[2], (int __user *) &frame->signo)) | 252 | if (__put_user(regs->gprs[2], (int __user *) &frame->signo)) |
253 | goto give_sigsegv; | 253 | return -EFAULT; |
254 | return 0; | 254 | return 0; |
255 | |||
256 | give_sigsegv: | ||
257 | force_sigsegv(sig, current); | ||
258 | return -EFAULT; | ||
259 | } | 255 | } |
260 | 256 | ||
261 | static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 257 | static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, |
262 | sigset_t *set, struct pt_regs * regs) | 258 | struct pt_regs *regs) |
263 | { | 259 | { |
264 | int err = 0; | 260 | int err = 0; |
265 | rt_sigframe __user *frame; | 261 | rt_sigframe __user *frame; |
266 | 262 | ||
267 | frame = get_sigframe(ka, regs, sizeof(rt_sigframe)); | 263 | frame = get_sigframe(&ksig->ka, regs, sizeof(rt_sigframe)); |
268 | 264 | ||
269 | if (frame == (void __user *) -1UL) | 265 | if (frame == (void __user *) -1UL) |
270 | goto give_sigsegv; | 266 | return -EFAULT; |
271 | 267 | ||
272 | if (copy_siginfo_to_user(&frame->info, info)) | 268 | if (copy_siginfo_to_user(&frame->info, &ksig->info)) |
273 | goto give_sigsegv; | 269 | return -EFAULT; |
274 | 270 | ||
275 | /* Create the ucontext. */ | 271 | /* Create the ucontext. */ |
276 | err |= __put_user(0, &frame->uc.uc_flags); | 272 | err |= __put_user(0, &frame->uc.uc_flags); |
@@ -279,24 +275,24 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
279 | err |= save_sigregs(regs, &frame->uc.uc_mcontext); | 275 | err |= save_sigregs(regs, &frame->uc.uc_mcontext); |
280 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 276 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
281 | if (err) | 277 | if (err) |
282 | goto give_sigsegv; | 278 | return -EFAULT; |
283 | 279 | ||
284 | /* Set up to return from userspace. If provided, use a stub | 280 | /* Set up to return from userspace. If provided, use a stub |
285 | already in userspace. */ | 281 | already in userspace. */ |
286 | if (ka->sa.sa_flags & SA_RESTORER) { | 282 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
287 | regs->gprs[14] = (unsigned long) | 283 | regs->gprs[14] = (unsigned long) |
288 | ka->sa.sa_restorer | PSW_ADDR_AMODE; | 284 | ksig->ka.sa.sa_restorer | PSW_ADDR_AMODE; |
289 | } else { | 285 | } else { |
290 | regs->gprs[14] = (unsigned long) | 286 | regs->gprs[14] = (unsigned long) |
291 | frame->retcode | PSW_ADDR_AMODE; | 287 | frame->retcode | PSW_ADDR_AMODE; |
292 | if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, | 288 | if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, |
293 | (u16 __user *)(frame->retcode))) | 289 | (u16 __user *)(frame->retcode))) |
294 | goto give_sigsegv; | 290 | return -EFAULT; |
295 | } | 291 | } |
296 | 292 | ||
297 | /* Set up backchain. */ | 293 | /* Set up backchain. */ |
298 | if (__put_user(regs->gprs[15], (addr_t __user *) frame)) | 294 | if (__put_user(regs->gprs[15], (addr_t __user *) frame)) |
299 | goto give_sigsegv; | 295 | return -EFAULT; |
300 | 296 | ||
301 | /* Set up registers for signal handler */ | 297 | /* Set up registers for signal handler */ |
302 | regs->gprs[15] = (unsigned long) frame; | 298 | regs->gprs[15] = (unsigned long) frame; |
@@ -304,34 +300,27 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
304 | regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | | 300 | regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | |
305 | (PSW_USER_BITS & PSW_MASK_ASC) | | 301 | (PSW_USER_BITS & PSW_MASK_ASC) | |
306 | (regs->psw.mask & ~PSW_MASK_ASC); | 302 | (regs->psw.mask & ~PSW_MASK_ASC); |
307 | regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; | 303 | regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler | PSW_ADDR_AMODE; |
308 | 304 | ||
309 | regs->gprs[2] = map_signal(sig); | 305 | regs->gprs[2] = map_signal(ksig->sig); |
310 | regs->gprs[3] = (unsigned long) &frame->info; | 306 | regs->gprs[3] = (unsigned long) &frame->info; |
311 | regs->gprs[4] = (unsigned long) &frame->uc; | 307 | regs->gprs[4] = (unsigned long) &frame->uc; |
312 | regs->gprs[5] = task_thread_info(current)->last_break; | 308 | regs->gprs[5] = task_thread_info(current)->last_break; |
313 | return 0; | 309 | return 0; |
314 | |||
315 | give_sigsegv: | ||
316 | force_sigsegv(sig, current); | ||
317 | return -EFAULT; | ||
318 | } | 310 | } |
319 | 311 | ||
320 | static void handle_signal(unsigned long sig, struct k_sigaction *ka, | 312 | static void handle_signal(struct ksignal *ksig, sigset_t *oldset, |
321 | siginfo_t *info, sigset_t *oldset, | 313 | struct pt_regs *regs) |
322 | struct pt_regs *regs) | ||
323 | { | 314 | { |
324 | int ret; | 315 | int ret; |
325 | 316 | ||
326 | /* Set up the stack frame */ | 317 | /* Set up the stack frame */ |
327 | if (ka->sa.sa_flags & SA_SIGINFO) | 318 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
328 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 319 | ret = setup_rt_frame(ksig, oldset, regs); |
329 | else | 320 | else |
330 | ret = setup_frame(sig, ka, oldset, regs); | 321 | ret = setup_frame(ksig->sig, &ksig->ka, oldset, regs); |
331 | if (ret) | 322 | |
332 | return; | 323 | signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP)); |
333 | signal_delivered(sig, info, ka, regs, | ||
334 | test_thread_flag(TIF_SINGLE_STEP)); | ||
335 | } | 324 | } |
336 | 325 | ||
337 | /* | 326 | /* |
@@ -345,9 +334,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka, | |||
345 | */ | 334 | */ |
346 | void do_signal(struct pt_regs *regs) | 335 | void do_signal(struct pt_regs *regs) |
347 | { | 336 | { |
348 | siginfo_t info; | 337 | struct ksignal ksig; |
349 | int signr; | ||
350 | struct k_sigaction ka; | ||
351 | sigset_t *oldset = sigmask_to_save(); | 338 | sigset_t *oldset = sigmask_to_save(); |
352 | 339 | ||
353 | /* | 340 | /* |
@@ -357,9 +344,8 @@ void do_signal(struct pt_regs *regs) | |||
357 | */ | 344 | */ |
358 | current_thread_info()->system_call = | 345 | current_thread_info()->system_call = |
359 | test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0; | 346 | test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0; |
360 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
361 | 347 | ||
362 | if (signr > 0) { | 348 | if (get_signal(&ksig)) { |
363 | /* Whee! Actually deliver the signal. */ | 349 | /* Whee! Actually deliver the signal. */ |
364 | if (current_thread_info()->system_call) { | 350 | if (current_thread_info()->system_call) { |
365 | regs->int_code = current_thread_info()->system_call; | 351 | regs->int_code = current_thread_info()->system_call; |
@@ -370,7 +356,7 @@ void do_signal(struct pt_regs *regs) | |||
370 | regs->gprs[2] = -EINTR; | 356 | regs->gprs[2] = -EINTR; |
371 | break; | 357 | break; |
372 | case -ERESTARTSYS: | 358 | case -ERESTARTSYS: |
373 | if (!(ka.sa.sa_flags & SA_RESTART)) { | 359 | if (!(ksig.ka.sa.sa_flags & SA_RESTART)) { |
374 | regs->gprs[2] = -EINTR; | 360 | regs->gprs[2] = -EINTR; |
375 | break; | 361 | break; |
376 | } | 362 | } |
@@ -387,9 +373,9 @@ void do_signal(struct pt_regs *regs) | |||
387 | clear_pt_regs_flag(regs, PIF_SYSCALL); | 373 | clear_pt_regs_flag(regs, PIF_SYSCALL); |
388 | 374 | ||
389 | if (is_compat_task()) | 375 | if (is_compat_task()) |
390 | handle_signal32(signr, &ka, &info, oldset, regs); | 376 | handle_signal32(&ksig, oldset, regs); |
391 | else | 377 | else |
392 | handle_signal(signr, &ka, &info, oldset, regs); | 378 | handle_signal(&ksig, oldset, regs); |
393 | return; | 379 | return; |
394 | } | 380 | } |
395 | 381 | ||