aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/signal.c')
-rw-r--r--arch/s390/kernel/signal.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c
index 028cc46cb82a..d82562cf0a0e 100644
--- a/arch/s390/kernel/signal.c
+++ b/arch/s390/kernel/signal.c
@@ -331,13 +331,13 @@ static int setup_frame(int sig, struct k_sigaction *ka,
331 /* Set up to return from userspace. If provided, use a stub 331 /* Set up to return from userspace. If provided, use a stub
332 already in userspace. */ 332 already in userspace. */
333 if (ka->sa.sa_flags & SA_RESTORER) { 333 if (ka->sa.sa_flags & SA_RESTORER) {
334 restorer = (unsigned long) ka->sa.sa_restorer | PSW_ADDR_AMODE; 334 restorer = (unsigned long) ka->sa.sa_restorer;
335 } else { 335 } else {
336 /* Signal frame without vector registers are short ! */ 336 /* Signal frame without vector registers are short ! */
337 __u16 __user *svc = (void __user *) frame + frame_size - 2; 337 __u16 __user *svc = (void __user *) frame + frame_size - 2;
338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc)) 338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc))
339 return -EFAULT; 339 return -EFAULT;
340 restorer = (unsigned long) svc | PSW_ADDR_AMODE; 340 restorer = (unsigned long) svc;
341 } 341 }
342 342
343 /* Set up registers for signal handler */ 343 /* Set up registers for signal handler */
@@ -347,7 +347,7 @@ static int setup_frame(int sig, struct k_sigaction *ka,
347 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | 347 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
348 (PSW_USER_BITS & PSW_MASK_ASC) | 348 (PSW_USER_BITS & PSW_MASK_ASC) |
349 (regs->psw.mask & ~PSW_MASK_ASC); 349 (regs->psw.mask & ~PSW_MASK_ASC);
350 regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; 350 regs->psw.addr = (unsigned long) ka->sa.sa_handler;
351 351
352 regs->gprs[2] = sig; 352 regs->gprs[2] = sig;
353 regs->gprs[3] = (unsigned long) &frame->sc; 353 regs->gprs[3] = (unsigned long) &frame->sc;
@@ -394,13 +394,12 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
394 /* Set up to return from userspace. If provided, use a stub 394 /* Set up to return from userspace. If provided, use a stub
395 already in userspace. */ 395 already in userspace. */
396 if (ksig->ka.sa.sa_flags & SA_RESTORER) { 396 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
397 restorer = (unsigned long) 397 restorer = (unsigned long) ksig->ka.sa.sa_restorer;
398 ksig->ka.sa.sa_restorer | PSW_ADDR_AMODE;
399 } else { 398 } else {
400 __u16 __user *svc = &frame->svc_insn; 399 __u16 __user *svc = &frame->svc_insn;
401 if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc)) 400 if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc))
402 return -EFAULT; 401 return -EFAULT;
403 restorer = (unsigned long) svc | PSW_ADDR_AMODE; 402 restorer = (unsigned long) svc;
404 } 403 }
405 404
406 /* Create siginfo on the signal stack */ 405 /* Create siginfo on the signal stack */
@@ -426,7 +425,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
426 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | 425 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
427 (PSW_USER_BITS & PSW_MASK_ASC) | 426 (PSW_USER_BITS & PSW_MASK_ASC) |
428 (regs->psw.mask & ~PSW_MASK_ASC); 427 (regs->psw.mask & ~PSW_MASK_ASC);
429 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler | PSW_ADDR_AMODE; 428 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler;
430 429
431 regs->gprs[2] = ksig->sig; 430 regs->gprs[2] = ksig->sig;
432 regs->gprs[3] = (unsigned long) &frame->info; 431 regs->gprs[3] = (unsigned long) &frame->info;