[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <tip-c2c9b52fab0d0cf993476ed4c34f24da5a1205ae@git.kernel.org>
Date: Thu, 10 Mar 2016 03:01:54 -0800
From: tip-bot for Andy Lutomirski <tipbot@...or.com>
To: linux-tip-commits@...r.kernel.org
Cc: andrew.cooper3@...rix.com, luto@...capital.net, brgerst@...il.com,
torvalds@...ux-foundation.org, linux-kernel@...r.kernel.org,
oleg@...hat.com, luto@...nel.org, hpa@...or.com, bp@...en8.de,
mingo@...nel.org, tglx@...utronix.de, peterz@...radead.org,
dvlasenk@...hat.com
Subject: [tip:x86/asm] x86/entry/32: Restore FLAGS on SYSEXIT
Commit-ID: c2c9b52fab0d0cf993476ed4c34f24da5a1205ae
Gitweb: http://git.kernel.org/tip/c2c9b52fab0d0cf993476ed4c34f24da5a1205ae
Author: Andy Lutomirski <luto@...nel.org>
AuthorDate: Wed, 9 Mar 2016 19:00:27 -0800
Committer: Ingo Molnar <mingo@...nel.org>
CommitDate: Thu, 10 Mar 2016 09:48:12 +0100
x86/entry/32: Restore FLAGS on SYSEXIT
We weren't restoring FLAGS at all on SYSEXIT. Apparently no one cared.
With this patch applied, native kernels should always honor
task_pt_regs()->flags, which opens the door for some sys_iopl()
cleanups. I'll do those as a separate series, though, since getting
it right will involve tweaking some paravirt ops.
( The short version is that, before this patch, sys_iopl(), invoked via
SYSENTER, wasn't guaranteed to ever transfer the updated
regs->flags, so sys_iopl() had to change the hardware flags register
as well. )
Reported-by: Brian Gerst <brgerst@...il.com>
Signed-off-by: Andy Lutomirski <luto@...nel.org>
Cc: Andrew Cooper <andrew.cooper3@...rix.com>
Cc: Andy Lutomirski <luto@...capital.net>
Cc: Borislav Petkov <bp@...en8.de>
Cc: Denys Vlasenko <dvlasenk@...hat.com>
Cc: H. Peter Anvin <hpa@...or.com>
Cc: Linus Torvalds <torvalds@...ux-foundation.org>
Cc: Oleg Nesterov <oleg@...hat.com>
Cc: Peter Zijlstra <peterz@...radead.org>
Cc: Thomas Gleixner <tglx@...utronix.de>
Link: http://lkml.kernel.org/r/3f98b207472dc9784838eb5ca2b89dcc845ce269.1457578375.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@...nel.org>
---
arch/x86/entry/entry_32.S | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 8daa812..7610906 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -343,6 +343,15 @@ sysenter_past_esp:
popl %eax /* pt_regs->ax */
/*
+ * Restore all flags except IF. (We restore IF separately because
+ * STI gives a one-instruction window in which we won't be interrupted,
+ * whereas POPF does not.)
+ */
+ addl $PT_EFLAGS-PT_DS, %esp /* point esp at pt_regs->flags */
+ btr $X86_EFLAGS_IF_BIT, (%esp)
+ popfl
+
+ /*
* Return back to the vDSO, which will pop ecx and edx.
* Don't bother with DS and ES (they already contain __USER_DS).
*/
Powered by blists - more mailing lists