summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2011-12-27 11:27:30 +0100
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2011-12-27 11:27:14 +0100
commit207a05499bf11216ac96f76b38be728f4ee49304 (patch)
tree89cf68c8cb41dcb29cd94e0624d33938063ad9c9
parent[S390] sysctl: get rid of dead declaration (diff)
downloadlinux-207a05499bf11216ac96f76b38be728f4ee49304.tar.xz
linux-207a05499bf11216ac96f76b38be728f4ee49304.zip
[S390] return address of compat signals
A 31-bit kernel always sets the high order bit in the return address for a signal handler. git commit d4e81b35b882d96f "[S390] allow all addressing modes" makes sure that the high order bit is set in the signal return address for standard signals of a 31-bit compat process but fails to do the same for real-time signals. To make things consistent the bit needs to be set by setup_rt_frame32 as well. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/kernel/compat_signal.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c
index 60c268b16f91..6fe78c2f95d9 100644
--- a/arch/s390/kernel/compat_signal.c
+++ b/arch/s390/kernel/compat_signal.c
@@ -548,9 +548,9 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
/* Set up to return from userspace. If provided, use a stub
already in userspace. */
if (ka->sa.sa_flags & SA_RESTORER) {
- regs->gprs[14] = (__u64) ka->sa.sa_restorer;
+ regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
} else {
- regs->gprs[14] = (__u64) frame->retcode;
+ regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE;
err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
(u16 __force __user *)(frame->retcode));
}