diff options
Diffstat (limited to 'arch/x86/ia32/ia32_signal.c')
-rw-r--r-- | arch/x86/ia32/ia32_signal.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index b0460cd7de5a..cf1a471a18a2 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -309,7 +309,7 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, | |||
309 | /* | 309 | /* |
310 | * Determine which stack to use.. | 310 | * Determine which stack to use.. |
311 | */ | 311 | */ |
312 | static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | 312 | static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, |
313 | size_t frame_size, | 313 | size_t frame_size, |
314 | void __user **fpstate) | 314 | void __user **fpstate) |
315 | { | 315 | { |
@@ -319,16 +319,13 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
319 | sp = regs->sp; | 319 | sp = regs->sp; |
320 | 320 | ||
321 | /* This is the X/Open sanctioned signal stack switching. */ | 321 | /* This is the X/Open sanctioned signal stack switching. */ |
322 | if (ka->sa.sa_flags & SA_ONSTACK) { | 322 | if (ksig->ka.sa.sa_flags & SA_ONSTACK) |
323 | if (sas_ss_flags(sp) == 0) | 323 | sp = sigsp(sp, ksig); |
324 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
325 | } | ||
326 | |||
327 | /* This is the legacy signal stack switching. */ | 324 | /* This is the legacy signal stack switching. */ |
328 | else if ((regs->ss & 0xffff) != __USER32_DS && | 325 | else if ((regs->ss & 0xffff) != __USER32_DS && |
329 | !(ka->sa.sa_flags & SA_RESTORER) && | 326 | !(ksig->ka.sa.sa_flags & SA_RESTORER) && |
330 | ka->sa.sa_restorer) | 327 | ksig->ka.sa.sa_restorer) |
331 | sp = (unsigned long) ka->sa.sa_restorer; | 328 | sp = (unsigned long) ksig->ka.sa.sa_restorer; |
332 | 329 | ||
333 | if (used_math()) { | 330 | if (used_math()) { |
334 | unsigned long fx_aligned, math_size; | 331 | unsigned long fx_aligned, math_size; |
@@ -347,7 +344,7 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
347 | return (void __user *) sp; | 344 | return (void __user *) sp; |
348 | } | 345 | } |
349 | 346 | ||
350 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | 347 | int ia32_setup_frame(int sig, struct ksignal *ksig, |
351 | compat_sigset_t *set, struct pt_regs *regs) | 348 | compat_sigset_t *set, struct pt_regs *regs) |
352 | { | 349 | { |
353 | struct sigframe_ia32 __user *frame; | 350 | struct sigframe_ia32 __user *frame; |
@@ -366,7 +363,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
366 | 0x80cd, /* int $0x80 */ | 363 | 0x80cd, /* int $0x80 */ |
367 | }; | 364 | }; |
368 | 365 | ||
369 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 366 | frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate); |
370 | 367 | ||
371 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 368 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
372 | return -EFAULT; | 369 | return -EFAULT; |
@@ -383,8 +380,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
383 | return -EFAULT; | 380 | return -EFAULT; |
384 | } | 381 | } |
385 | 382 | ||
386 | if (ka->sa.sa_flags & SA_RESTORER) { | 383 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
387 | restorer = ka->sa.sa_restorer; | 384 | restorer = ksig->ka.sa.sa_restorer; |
388 | } else { | 385 | } else { |
389 | /* Return stub is in 32bit vsyscall page */ | 386 | /* Return stub is in 32bit vsyscall page */ |
390 | if (current->mm->context.vdso) | 387 | if (current->mm->context.vdso) |
@@ -409,7 +406,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
409 | 406 | ||
410 | /* Set up registers for signal handler */ | 407 | /* Set up registers for signal handler */ |
411 | regs->sp = (unsigned long) frame; | 408 | regs->sp = (unsigned long) frame; |
412 | regs->ip = (unsigned long) ka->sa.sa_handler; | 409 | regs->ip = (unsigned long) ksig->ka.sa.sa_handler; |
413 | 410 | ||
414 | /* Make -mregparm=3 work */ | 411 | /* Make -mregparm=3 work */ |
415 | regs->ax = sig; | 412 | regs->ax = sig; |
@@ -425,7 +422,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
425 | return 0; | 422 | return 0; |
426 | } | 423 | } |
427 | 424 | ||
428 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 425 | int ia32_setup_rt_frame(int sig, struct ksignal *ksig, |
429 | compat_sigset_t *set, struct pt_regs *regs) | 426 | compat_sigset_t *set, struct pt_regs *regs) |
430 | { | 427 | { |
431 | struct rt_sigframe_ia32 __user *frame; | 428 | struct rt_sigframe_ia32 __user *frame; |
@@ -446,7 +443,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
446 | 0, | 443 | 0, |
447 | }; | 444 | }; |
448 | 445 | ||
449 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 446 | frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate); |
450 | 447 | ||
451 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 448 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
452 | return -EFAULT; | 449 | return -EFAULT; |
@@ -464,8 +461,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
464 | put_user_ex(0, &frame->uc.uc_link); | 461 | put_user_ex(0, &frame->uc.uc_link); |
465 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); | 462 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
466 | 463 | ||
467 | if (ka->sa.sa_flags & SA_RESTORER) | 464 | if (ksig->ka.sa.sa_flags & SA_RESTORER) |
468 | restorer = ka->sa.sa_restorer; | 465 | restorer = ksig->ka.sa.sa_restorer; |
469 | else | 466 | else |
470 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, | 467 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, |
471 | rt_sigreturn); | 468 | rt_sigreturn); |
@@ -478,7 +475,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
478 | put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode); | 475 | put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode); |
479 | } put_user_catch(err); | 476 | } put_user_catch(err); |
480 | 477 | ||
481 | err |= copy_siginfo_to_user32(&frame->info, info); | 478 | err |= copy_siginfo_to_user32(&frame->info, &ksig->info); |
482 | err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | 479 | err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate, |
483 | regs, set->sig[0]); | 480 | regs, set->sig[0]); |
484 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 481 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
@@ -488,7 +485,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
488 | 485 | ||
489 | /* Set up registers for signal handler */ | 486 | /* Set up registers for signal handler */ |
490 | regs->sp = (unsigned long) frame; | 487 | regs->sp = (unsigned long) frame; |
491 | regs->ip = (unsigned long) ka->sa.sa_handler; | 488 | regs->ip = (unsigned long) ksig->ka.sa.sa_handler; |
492 | 489 | ||
493 | /* Make -mregparm=3 work */ | 490 | /* Make -mregparm=3 work */ |
494 | regs->ax = sig; | 491 | regs->ax = sig; |