diff options
Diffstat (limited to 'arch/powerpc/kernel/signal_32.c')
-rw-r--r-- | arch/powerpc/kernel/signal_32.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 1bc5a1755ed4..b171001698ff 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -981,9 +981,8 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from) | |||
981 | * Set up a signal frame for a "real-time" signal handler | 981 | * Set up a signal frame for a "real-time" signal handler |
982 | * (one which gets siginfo). | 982 | * (one which gets siginfo). |
983 | */ | 983 | */ |
984 | int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | 984 | int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, |
985 | siginfo_t *info, sigset_t *oldset, | 985 | struct pt_regs *regs) |
986 | struct pt_regs *regs) | ||
987 | { | 986 | { |
988 | struct rt_sigframe __user *rt_sf; | 987 | struct rt_sigframe __user *rt_sf; |
989 | struct mcontext __user *frame; | 988 | struct mcontext __user *frame; |
@@ -995,13 +994,13 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
995 | 994 | ||
996 | /* Set up Signal Frame */ | 995 | /* Set up Signal Frame */ |
997 | /* Put a Real Time Context onto stack */ | 996 | /* Put a Real Time Context onto stack */ |
998 | rt_sf = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1); | 997 | rt_sf = get_sigframe(ksig, get_tm_stackpointer(regs), sizeof(*rt_sf), 1); |
999 | addr = rt_sf; | 998 | addr = rt_sf; |
1000 | if (unlikely(rt_sf == NULL)) | 999 | if (unlikely(rt_sf == NULL)) |
1001 | goto badframe; | 1000 | goto badframe; |
1002 | 1001 | ||
1003 | /* Put the siginfo & fill in most of the ucontext */ | 1002 | /* Put the siginfo & fill in most of the ucontext */ |
1004 | if (copy_siginfo_to_user(&rt_sf->info, info) | 1003 | if (copy_siginfo_to_user(&rt_sf->info, &ksig->info) |
1005 | || __put_user(0, &rt_sf->uc.uc_flags) | 1004 | || __put_user(0, &rt_sf->uc.uc_flags) |
1006 | || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1]) | 1005 | || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1]) |
1007 | || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext), | 1006 | || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext), |
@@ -1051,15 +1050,15 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1051 | 1050 | ||
1052 | /* Fill registers for signal handler */ | 1051 | /* Fill registers for signal handler */ |
1053 | regs->gpr[1] = newsp; | 1052 | regs->gpr[1] = newsp; |
1054 | regs->gpr[3] = sig; | 1053 | regs->gpr[3] = ksig->sig; |
1055 | regs->gpr[4] = (unsigned long) &rt_sf->info; | 1054 | regs->gpr[4] = (unsigned long) &rt_sf->info; |
1056 | regs->gpr[5] = (unsigned long) &rt_sf->uc; | 1055 | regs->gpr[5] = (unsigned long) &rt_sf->uc; |
1057 | regs->gpr[6] = (unsigned long) rt_sf; | 1056 | regs->gpr[6] = (unsigned long) rt_sf; |
1058 | regs->nip = (unsigned long) ka->sa.sa_handler; | 1057 | regs->nip = (unsigned long) ksig->ka.sa.sa_handler; |
1059 | /* enter the signal handler in native-endian mode */ | 1058 | /* enter the signal handler in native-endian mode */ |
1060 | regs->msr &= ~MSR_LE; | 1059 | regs->msr &= ~MSR_LE; |
1061 | regs->msr |= (MSR_KERNEL & MSR_LE); | 1060 | regs->msr |= (MSR_KERNEL & MSR_LE); |
1062 | return 1; | 1061 | return 0; |
1063 | 1062 | ||
1064 | badframe: | 1063 | badframe: |
1065 | if (show_unhandled_signals) | 1064 | if (show_unhandled_signals) |
@@ -1069,8 +1068,7 @@ badframe: | |||
1069 | current->comm, current->pid, | 1068 | current->comm, current->pid, |
1070 | addr, regs->nip, regs->link); | 1069 | addr, regs->nip, regs->link); |
1071 | 1070 | ||
1072 | force_sigsegv(sig, current); | 1071 | return 1; |
1073 | return 0; | ||
1074 | } | 1072 | } |
1075 | 1073 | ||
1076 | static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig) | 1074 | static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig) |
@@ -1409,8 +1407,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx, | |||
1409 | /* | 1407 | /* |
1410 | * OK, we're invoking a handler | 1408 | * OK, we're invoking a handler |
1411 | */ | 1409 | */ |
1412 | int handle_signal32(unsigned long sig, struct k_sigaction *ka, | 1410 | int handle_signal32(struct ksignal *ksig, sigset_t *oldset, struct pt_regs *regs) |
1413 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | ||
1414 | { | 1411 | { |
1415 | struct sigcontext __user *sc; | 1412 | struct sigcontext __user *sc; |
1416 | struct sigframe __user *frame; | 1413 | struct sigframe __user *frame; |
@@ -1420,7 +1417,7 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1420 | unsigned long tramp; | 1417 | unsigned long tramp; |
1421 | 1418 | ||
1422 | /* Set up Signal Frame */ | 1419 | /* Set up Signal Frame */ |
1423 | frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 1); | 1420 | frame = get_sigframe(ksig, get_tm_stackpointer(regs), sizeof(*frame), 1); |
1424 | if (unlikely(frame == NULL)) | 1421 | if (unlikely(frame == NULL)) |
1425 | goto badframe; | 1422 | goto badframe; |
1426 | sc = (struct sigcontext __user *) &frame->sctx; | 1423 | sc = (struct sigcontext __user *) &frame->sctx; |
@@ -1428,7 +1425,7 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1428 | #if _NSIG != 64 | 1425 | #if _NSIG != 64 |
1429 | #error "Please adjust handle_signal()" | 1426 | #error "Please adjust handle_signal()" |
1430 | #endif | 1427 | #endif |
1431 | if (__put_user(to_user_ptr(ka->sa.sa_handler), &sc->handler) | 1428 | if (__put_user(to_user_ptr(ksig->ka.sa.sa_handler), &sc->handler) |
1432 | || __put_user(oldset->sig[0], &sc->oldmask) | 1429 | || __put_user(oldset->sig[0], &sc->oldmask) |
1433 | #ifdef CONFIG_PPC64 | 1430 | #ifdef CONFIG_PPC64 |
1434 | || __put_user((oldset->sig[0] >> 32), &sc->_unused[3]) | 1431 | || __put_user((oldset->sig[0] >> 32), &sc->_unused[3]) |
@@ -1436,7 +1433,7 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1436 | || __put_user(oldset->sig[1], &sc->_unused[3]) | 1433 | || __put_user(oldset->sig[1], &sc->_unused[3]) |
1437 | #endif | 1434 | #endif |
1438 | || __put_user(to_user_ptr(&frame->mctx), &sc->regs) | 1435 | || __put_user(to_user_ptr(&frame->mctx), &sc->regs) |
1439 | || __put_user(sig, &sc->signal)) | 1436 | || __put_user(ksig->sig, &sc->signal)) |
1440 | goto badframe; | 1437 | goto badframe; |
1441 | 1438 | ||
1442 | if (vdso32_sigtramp && current->mm->context.vdso_base) { | 1439 | if (vdso32_sigtramp && current->mm->context.vdso_base) { |
@@ -1471,12 +1468,12 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1471 | goto badframe; | 1468 | goto badframe; |
1472 | 1469 | ||
1473 | regs->gpr[1] = newsp; | 1470 | regs->gpr[1] = newsp; |
1474 | regs->gpr[3] = sig; | 1471 | regs->gpr[3] = ksig->sig; |
1475 | regs->gpr[4] = (unsigned long) sc; | 1472 | regs->gpr[4] = (unsigned long) sc; |
1476 | regs->nip = (unsigned long) ka->sa.sa_handler; | 1473 | regs->nip = (unsigned long) (unsigned long)ksig->ka.sa.sa_handler; |
1477 | /* enter the signal handler in big-endian mode */ | 1474 | /* enter the signal handler in big-endian mode */ |
1478 | regs->msr &= ~MSR_LE; | 1475 | regs->msr &= ~MSR_LE; |
1479 | return 1; | 1476 | return 0; |
1480 | 1477 | ||
1481 | badframe: | 1478 | badframe: |
1482 | if (show_unhandled_signals) | 1479 | if (show_unhandled_signals) |
@@ -1486,8 +1483,7 @@ badframe: | |||
1486 | current->comm, current->pid, | 1483 | current->comm, current->pid, |
1487 | frame, regs->nip, regs->link); | 1484 | frame, regs->nip, regs->link); |
1488 | 1485 | ||
1489 | force_sigsegv(sig, current); | 1486 | return 1; |
1490 | return 0; | ||
1491 | } | 1487 | } |
1492 | 1488 | ||
1493 | /* | 1489 | /* |