mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 1/4] x86_64: remove bogus optimization in sysret_signal
@ 2008-07-07  6:56 Roland McGrath
  2008-07-07  6:57 ` [PATCH 2/4] x86_64 syscall audit fast-path Roland McGrath
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Roland McGrath @ 2008-07-07  6:56 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner
  Cc: Linus Torvalds, Andrew Morton, Alexander Viro, Eric Paris, linux-kernel

This short-circuit path in sysret_signal looks wrong to me.
AFAICT, in practice the branch is never taken--and if it were,
it would go wrong.  To wit, try loading a module whose init
function does set_thread_flag(TIF_IRET), and see insmod crash
(presumably with a wrong user stack pointer).

This is because the FIXUP_TOP_OF_STACK work hasn't been done yet
when we jump around the call to ptregscall_common and get to
int_with_check--where it expects the user RSP,SS,CS and EFLAGS to
have been stored by FIXUP_TOP_OF_STACK.

I don't think it's normally possible to get to sysret_signal with no
_TIF_DO_NOTIFY_MASK bits set anyway, so these two instructions are
already superfluous.  If it ever did happen, it is harmless to call
do_notify_resume with nothing for it to do.

Signed-off-by: Roland McGrath <roland@redhat.com>
---
 arch/x86/kernel/entry_64.S |    6 +-----
 1 files changed, 1 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index 556a8df..f9c859d 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -296,16 +296,12 @@ sysret_careful:
 sysret_signal:
 	TRACE_IRQS_ON
 	ENABLE_INTERRUPTS(CLBR_NONE)
-	testl $_TIF_DO_NOTIFY_MASK,%edx
-	jz    1f
-
-	/* Really a signal */
 	/* edx:	work flags (arg3) */
 	leaq do_notify_resume(%rip),%rax
 	leaq -ARGOFFSET(%rsp),%rdi # &pt_regs -> arg1
 	xorl %esi,%esi # oldset -> arg2
 	call ptregscall_common
-1:	movl $_TIF_NEED_RESCHED,%edi
+	movl $_TIF_NEED_RESCHED,%edi
 	/* Use IRET because user could have changed frame. This
 	   works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
 	DISABLE_INTERRUPTS(CLBR_NONE)

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2008-07-24  1:05 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-07-07  6:56 [PATCH 1/4] x86_64: remove bogus optimization in sysret_signal Roland McGrath
2008-07-07  6:57 ` [PATCH 2/4] x86_64 syscall audit fast-path Roland McGrath
2008-07-07  6:57 ` [PATCH 3/4] x86_64 ia32 " Roland McGrath
2008-07-07 16:34   ` Linus Torvalds
2008-07-07 16:39     ` Linus Torvalds
2008-07-08  0:02       ` Roland McGrath
2008-07-08  0:37         ` Linus Torvalds
2008-07-18 11:36         ` Ingo Molnar
2008-07-21 23:54           ` Roland McGrath
2008-07-24  0:22             ` Linus Torvalds
2008-07-24  0:40               ` Linus Torvalds
2008-07-24  1:04               ` Roland McGrath
2008-07-07  6:58 ` [PATCH 4/4] i386 " Roland McGrath

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome