Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1355025
| From | tip-bot for Andy Lutomirski <tipbot@zytor.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [tip:x86/asm] x86/entry/32: Restore FLAGS on SYSEXIT |
| Date | 2016-03-10 12:10 +0100 |
| Message-ID | <rb6DF-6cT-41@gated-at.bofh.it> (permalink) |
| References | <raZ98-HP-21@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Commit-ID: c2c9b52fab0d0cf993476ed4c34f24da5a1205ae Gitweb: http://git.kernel.org/tip/c2c9b52fab0d0cf993476ed4c34f24da5a1205ae Author: Andy Lutomirski <luto@kernel.org> AuthorDate: Wed, 9 Mar 2016 19:00:27 -0800 Committer: Ingo Molnar <mingo@kernel.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@gmail.com> Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andrew Cooper <andrew.cooper3@citrix.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/3f98b207472dc9784838eb5ca2b89dcc845ce269.1457578375.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.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). */
Back to linux.kernel | Previous | Next — Previous in thread | Find similar | Unroll thread
[PATCH v2 04/12] x86/entry/32: Restore FLAGS on SYSEXIT Andy Lutomirski <luto@kernel.org> - 2016-03-10 04:10 +0100 [tip:x86/asm] x86/entry/32: Restore FLAGS on SYSEXIT tip-bot for Andy Lutomirski <tipbot@zytor.com> - 2016-03-10 12:10 +0100
csiph-web