FRV: Prevent syscall exit tracing and notify_resume at end of kernel exceptions

This change “FRV: Prevent syscall exit tracing and notify_resume at end of kernel exceptions” (commit 137c3c4) in Linux kernel is authored by David Howells <dhowells [at] redhat.com> on Tue May 1 19:44:14 2012 +0100.

Description of "FRV: Prevent syscall exit tracing and notify_resume at end of kernel exceptions"

The change “FRV: Prevent syscall exit tracing and notify_resume at end of kernel exceptions” introduces changes as follows.

FRV: Prevent syscall exit tracing and notify_resume at end of kernel exceptions

Move the test for kernel mode processing from do_signal() into entry.S to also
prevent system call exit tracing and userspace resumption notification handling
happening when returning from kernel exceptions.

Reported-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Linux kernel releases containing commit 137c3c4

The Linux kernel releases containing this commit are as follows.

Linux kernel code changes from "FRV: Prevent syscall exit tracing and notify_resume at end of kernel exceptions"

There are 14 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/frv/kernel/entry.S  |  4 +++-
 arch/frv/kernel/signal.c | 10 ----------
 2 files changed, 3 insertions(+), 11 deletions(-)
 
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S
index 5ba23f715ea5..ff3092c18ca2 100644
--- a/arch/frv/kernel/entry.S
+++ b/arch/frv/kernel/entry.S
@@ -1163,7 +1163,9 @@ __syscall_trace_entry:
 	# perform syscall exit tracing
 __syscall_exit_work:
 	LEDS		0x6340
-	andicc		gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
+	andicc		gr22,#PSR_PS,gr0,icc1	; don't handle on return to kernel mode
+	andicc.p	gr4,#_TIF_SYSCALL_TRACE,gr0,icc0
+	bne		icc1,#0,__entry_return_direct
 	beq		icc0,#1,__entry_work_pending
 
 	movsg		psr,gr23
diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c
index 4e134c7eceea..f3b9064c548c 100644
--- a/arch/frv/kernel/signal.c
+++ b/arch/frv/kernel/signal.c
@@ -474,18 +474,8 @@ static void do_signal(void)
 {
 	struct k_sigaction ka;
 	siginfo_t info;
-	sigset_t *oldset;
 	int signr;
 
-	/*
-	 * We want the common case to go fast, which
-	 * is why we may in certain cases get here from
-	 * kernel mode. Just return without doing anything
-	 * if so.
-	 */
-	if (!user_mode(__frame))
-		return;
-
 	signr = get_signal_to_deliver(&info, &ka, __frame, NULL);
 	if (signr > 0) {
 		handle_signal(signr, &info, &ka);

The commit for this change in Linux stable tree is 137c3c4 (patch).

Last modified: 2020/02/10