* [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes
@ 2015-10-16 22:42 Andy Lutomirski
2015-10-16 22:42 ` [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on Andy Lutomirski
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Andy Lutomirski @ 2015-10-16 22:42 UTC (permalink / raw)
To: x86, linux-kernel
Cc: Brian Gerst, Denys Vlasenko, Borislav Petkov, Andy Lutomirski
Fixes a (correct) warning and an oops. Oddly, both seem to only
cause problems on some configurations. The second one presumably
only survived my testing because I didn't test a threaded program.
The first patch is a bit ugly. If that's a problem, suggestions
are welcome.
Changes from v1: No longer breaks 64-bit builds.
Andy Lutomirski (2):
x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on
x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT
arch/x86/entry/common.c | 15 ++++++++++++---
arch/x86/entry/entry_32.S | 12 ++++++------
arch/x86/entry/entry_64_compat.S | 2 +-
3 files changed, 19 insertions(+), 10 deletions(-)
--
2.4.3
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on 2015-10-16 22:42 [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Andy Lutomirski @ 2015-10-16 22:42 ` Andy Lutomirski 2015-10-17 2:54 ` Brian Gerst 2015-10-18 10:15 ` [tip:x86/asm] x86/entry/32: Fix entry_INT80_32() " tip-bot for Andy Lutomirski 2015-10-16 22:42 ` [PATCH v2 2/2] x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT Andy Lutomirski 2015-10-17 11:43 ` [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Borislav Petkov 2 siblings, 2 replies; 9+ messages in thread From: Andy Lutomirski @ 2015-10-16 22:42 UTC (permalink / raw) To: x86, linux-kernel Cc: Brian Gerst, Denys Vlasenko, Borislav Petkov, Andy Lutomirski When I rewrote entry_INT80_32, I thought that int80 was an interrupt gate. It's a trap gate. *facepalm* Thanks to Brian Gerst for pointing out that it's better to change the entry code than to change the gate type. Suggested-by: Brian Gerst <brgerst@gmail.com> Reported-by: Borislav Petkov <bp@suse.de> Fixes: 150ac78d63af ("x86/entry/32: Switch INT80 to the new C syscall path") Signed-off-by: Andy Lutomirski <luto@kernel.org> --- arch/x86/entry/common.c | 15 ++++++++++++--- arch/x86/entry/entry_32.S | 8 ++++---- arch/x86/entry/entry_64_compat.S | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index b53e04d301a3..09afb3b6acbb 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -351,7 +351,14 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs) * in workloads that use it, and it's usually called from * do_fast_syscall_32, so forcibly inline it to improve performance. */ -static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) +#ifdef CONFIG_X86_32 +/* 32-bit kernels use a trap gate for int80, and the asm code calls here. */ +__visible +#else +/* 64-bit kernels use do_syscall_32_irqs_off instead. */ +static +#endif +__always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) { struct thread_info *ti = pt_regs_to_thread_info(regs); unsigned int nr = (unsigned int)regs->orig_ax; @@ -386,12 +393,14 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) syscall_return_slowpath(regs); } -/* Handles int $0x80 */ -__visible void do_int80_syscall_32(struct pt_regs *regs) +#ifdef CONFIG_X86_64 +/* Handles int $0x80 on 64-bit kernels */ +__visible void do_syscall_32_irqs_off(struct pt_regs *regs) { local_irq_enable(); do_syscall_32_irqs_on(regs); } +#endif /* Returns 0 to return using IRET or 1 to return using SYSEXIT/SYSRETL. */ __visible long do_fast_syscall_32(struct pt_regs *regs) diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index 07a041b91af1..ba0dad937be9 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -346,13 +346,13 @@ ENTRY(entry_INT80_32) SAVE_ALL pt_regs_ax=$-ENOSYS /* save rest */ /* - * User mode is traced as though IRQs are on, and the interrupt gate - * turned them off. + * User mode is traced as though IRQs are on. Unlike the 64-bit + * case, int80 is a trap gate on 32-bit kernels, so interrupts + * are already on (unless user code is messing around with iopl). */ - TRACE_IRQS_OFF movl %esp, %eax - call do_int80_syscall_32 + call do_syscall_32_irqs_on .Lsyscall_32_done: restore_all: diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S index 78becafe60d1..dd160e4e2ef5 100644 --- a/arch/x86/entry/entry_64_compat.S +++ b/arch/x86/entry/entry_64_compat.S @@ -303,7 +303,7 @@ ENTRY(entry_INT80_compat) TRACE_IRQS_OFF movq %rsp, %rdi - call do_int80_syscall_32 + call do_syscall_32_irqs_off .Lsyscall_32_done: /* Go back to user mode. */ -- 2.4.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on 2015-10-16 22:42 ` [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on Andy Lutomirski @ 2015-10-17 2:54 ` Brian Gerst 2015-10-17 4:05 ` Andy Lutomirski 2015-10-18 10:15 ` [tip:x86/asm] x86/entry/32: Fix entry_INT80_32() " tip-bot for Andy Lutomirski 1 sibling, 1 reply; 9+ messages in thread From: Brian Gerst @ 2015-10-17 2:54 UTC (permalink / raw) To: Andy Lutomirski Cc: the arch/x86 maintainers, Linux Kernel Mailing List, Denys Vlasenko, Borislav Petkov On Fri, Oct 16, 2015 at 6:42 PM, Andy Lutomirski <luto@kernel.org> wrote: > When I rewrote entry_INT80_32, I thought that int80 was an interrupt > gate. It's a trap gate. *facepalm* > > Thanks to Brian Gerst for pointing out that it's better to change > the entry code than to change the gate type. > > Suggested-by: Brian Gerst <brgerst@gmail.com> > Reported-by: Borislav Petkov <bp@suse.de> > Fixes: 150ac78d63af ("x86/entry/32: Switch INT80 to the new C syscall path") > Signed-off-by: Andy Lutomirski <luto@kernel.org> > --- > arch/x86/entry/common.c | 15 ++++++++++++--- > arch/x86/entry/entry_32.S | 8 ++++---- > arch/x86/entry/entry_64_compat.S | 2 +- > 3 files changed, 17 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c > index b53e04d301a3..09afb3b6acbb 100644 > --- a/arch/x86/entry/common.c > +++ b/arch/x86/entry/common.c > @@ -351,7 +351,14 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs) > * in workloads that use it, and it's usually called from > * do_fast_syscall_32, so forcibly inline it to improve performance. > */ > -static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) > +#ifdef CONFIG_X86_32 > +/* 32-bit kernels use a trap gate for int80, and the asm code calls here. */ > +__visible > +#else > +/* 64-bit kernels use do_syscall_32_irqs_off instead. */ > +static > +#endif > +__always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) > { > struct thread_info *ti = pt_regs_to_thread_info(regs); > unsigned int nr = (unsigned int)regs->orig_ax; > @@ -386,12 +393,14 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) > syscall_return_slowpath(regs); > } > > -/* Handles int $0x80 */ > -__visible void do_int80_syscall_32(struct pt_regs *regs) > +#ifdef CONFIG_X86_64 > +/* Handles int $0x80 on 64-bit kernels */ > +__visible void do_syscall_32_irqs_off(struct pt_regs *regs) > { > local_irq_enable(); > do_syscall_32_irqs_on(regs); > } > +#endif This would be more readable if the STI were moved down into the asm for 64-bit. In fact, we should be re-enabling interrupts as early as possible once the full kernel environment is set up (on the process stack, NT clear, and after SWAPGS). What was your reasoning for moving it later? -- Brian Gerst ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on 2015-10-17 2:54 ` Brian Gerst @ 2015-10-17 4:05 ` Andy Lutomirski 0 siblings, 0 replies; 9+ messages in thread From: Andy Lutomirski @ 2015-10-17 4:05 UTC (permalink / raw) To: Brian Gerst Cc: Borislav Petkov, linux-kernel@vger.kernel.org, Denys Vlasenko, the arch/x86 maintainers On Oct 16, 2015 7:54 PM, "Brian Gerst" <brgerst@gmail.com> wrote: > > On Fri, Oct 16, 2015 at 6:42 PM, Andy Lutomirski <luto@kernel.org> wrote: > > When I rewrote entry_INT80_32, I thought that int80 was an interrupt > > gate. It's a trap gate. *facepalm* > > > > Thanks to Brian Gerst for pointing out that it's better to change > > the entry code than to change the gate type. > > > > Suggested-by: Brian Gerst <brgerst@gmail.com> > > Reported-by: Borislav Petkov <bp@suse.de> > > Fixes: 150ac78d63af ("x86/entry/32: Switch INT80 to the new C syscall path") > > Signed-off-by: Andy Lutomirski <luto@kernel.org> > > --- > > arch/x86/entry/common.c | 15 ++++++++++++--- > > arch/x86/entry/entry_32.S | 8 ++++---- > > arch/x86/entry/entry_64_compat.S | 2 +- > > 3 files changed, 17 insertions(+), 8 deletions(-) > > > > diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c > > index b53e04d301a3..09afb3b6acbb 100644 > > --- a/arch/x86/entry/common.c > > +++ b/arch/x86/entry/common.c > > @@ -351,7 +351,14 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs) > > * in workloads that use it, and it's usually called from > > * do_fast_syscall_32, so forcibly inline it to improve performance. > > */ > > -static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) > > +#ifdef CONFIG_X86_32 > > +/* 32-bit kernels use a trap gate for int80, and the asm code calls here. */ > > +__visible > > +#else > > +/* 64-bit kernels use do_syscall_32_irqs_off instead. */ > > +static > > +#endif > > +__always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) > > { > > struct thread_info *ti = pt_regs_to_thread_info(regs); > > unsigned int nr = (unsigned int)regs->orig_ax; > > @@ -386,12 +393,14 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) > > syscall_return_slowpath(regs); > > } > > > > -/* Handles int $0x80 */ > > -__visible void do_int80_syscall_32(struct pt_regs *regs) > > +#ifdef CONFIG_X86_64 > > +/* Handles int $0x80 on 64-bit kernels */ > > +__visible void do_syscall_32_irqs_off(struct pt_regs *regs) > > { > > local_irq_enable(); > > do_syscall_32_irqs_on(regs); > > } > > +#endif > > This would be more readable if the STI were moved down into the asm > for 64-bit. In fact, we should be re-enabling interrupts as early as > possible once the full kernel environment is set up (on the process > stack, NT clear, and after SWAPGS). What was your reasoning for > moving it later? On x86_64, we have to use an interrupt gate because of swapgs, and for context tracking, once I clean up the SYSCALL64 entry, I want to make it all the way to user_exit with IRQs off. There are nice optimizations that become possible once user_exit is always called with IRQs off, and there's another cleanup we can do when IRQs are no longer possible in kernel mode with IRQs on. For x86_32, we don't actually support context tracking, but we could. So maybe we should suck up the ~3 cycles for int80 users and just use an interrupt gate everywhere. --Andy ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip:x86/asm] x86/entry/32: Fix entry_INT80_32() to expect interrupts to be on 2015-10-16 22:42 ` [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on Andy Lutomirski 2015-10-17 2:54 ` Brian Gerst @ 2015-10-18 10:15 ` tip-bot for Andy Lutomirski 2015-10-19 4:48 ` Andy Lutomirski 1 sibling, 1 reply; 9+ messages in thread From: tip-bot for Andy Lutomirski @ 2015-10-18 10:15 UTC (permalink / raw) To: linux-tip-commits Cc: brgerst, dvlasenk, peterz, bp, luto, linux-kernel, mingo, luto, hpa, tglx, torvalds, bp Commit-ID: 657c1eea0019e80685a84cbb1919794243a187c9 Gitweb: http://git.kernel.org/tip/657c1eea0019e80685a84cbb1919794243a187c9 Author: Andy Lutomirski <luto@kernel.org> AuthorDate: Fri, 16 Oct 2015 15:42:54 -0700 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Sun, 18 Oct 2015 12:11:16 +0200 x86/entry/32: Fix entry_INT80_32() to expect interrupts to be on When I rewrote entry_INT80_32, I thought that int80 was an interrupt gate. It's a trap gate. *facepalm* Thanks to Brian Gerst for pointing out that it's better to change the entry code than to change the gate type. Suggested-by: Brian Gerst <brgerst@gmail.com> Reported-and-tested-by: Borislav Petkov <bp@suse.de> Signed-off-by: Andy Lutomirski <luto@kernel.org> 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: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Fixes: 150ac78d63af ("x86/entry/32: Switch INT80 to the new C syscall path") Link: http://lkml.kernel.org/r/dc09d9b574a5c1dcca996847875c73f8341ce0ad.1445035014.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/entry/common.c | 15 ++++++++++++--- arch/x86/entry/entry_32.S | 8 ++++---- arch/x86/entry/entry_64_compat.S | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index b53e04d..a89fdbc 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -351,7 +351,14 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs) * in workloads that use it, and it's usually called from * do_fast_syscall_32, so forcibly inline it to improve performance. */ -static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) +#ifdef CONFIG_X86_32 +/* 32-bit kernels use a trap gate for INT80, and the asm code calls here. */ +__visible +#else +/* 64-bit kernels use do_syscall_32_irqs_off() instead. */ +static +#endif +__always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) { struct thread_info *ti = pt_regs_to_thread_info(regs); unsigned int nr = (unsigned int)regs->orig_ax; @@ -386,12 +393,14 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs) syscall_return_slowpath(regs); } -/* Handles int $0x80 */ -__visible void do_int80_syscall_32(struct pt_regs *regs) +#ifdef CONFIG_X86_64 +/* Handles INT80 on 64-bit kernels */ +__visible void do_syscall_32_irqs_off(struct pt_regs *regs) { local_irq_enable(); do_syscall_32_irqs_on(regs); } +#endif /* Returns 0 to return using IRET or 1 to return using SYSEXIT/SYSRETL. */ __visible long do_fast_syscall_32(struct pt_regs *regs) diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index c1c7c63..4f97f49 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -345,13 +345,13 @@ ENTRY(entry_INT80_32) SAVE_ALL pt_regs_ax=$-ENOSYS /* save rest */ /* - * User mode is traced as though IRQs are on, and the interrupt gate - * turned them off. + * User mode is traced as though IRQs are on. Unlike the 64-bit + * case, INT80 is a trap gate on 32-bit kernels, so interrupts + * are already on (unless user code is messing around with iopl). */ - TRACE_IRQS_OFF movl %esp, %eax - call do_int80_syscall_32 + call do_syscall_32_irqs_on .Lsyscall_32_done: restore_all: diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S index 92b0b27..c320183 100644 --- a/arch/x86/entry/entry_64_compat.S +++ b/arch/x86/entry/entry_64_compat.S @@ -303,7 +303,7 @@ ENTRY(entry_INT80_compat) TRACE_IRQS_OFF movq %rsp, %rdi - call do_int80_syscall_32 + call do_syscall_32_irqs_off .Lsyscall_32_done: /* Go back to user mode. */ ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [tip:x86/asm] x86/entry/32: Fix entry_INT80_32() to expect interrupts to be on 2015-10-18 10:15 ` [tip:x86/asm] x86/entry/32: Fix entry_INT80_32() " tip-bot for Andy Lutomirski @ 2015-10-19 4:48 ` Andy Lutomirski 0 siblings, 0 replies; 9+ messages in thread From: Andy Lutomirski @ 2015-10-19 4:48 UTC (permalink / raw) To: H. Peter Anvin, linux-kernel@vger.kernel.org, Brian Gerst, Thomas Gleixner, Borislav Petkov, Peter Zijlstra, Ingo Molnar, Borislav Petkov, Linus Torvalds, Denys Vlasenko Cc: linux-tip-commits@vger.kernel.org On Oct 18, 2015 3:16 AM, "tip-bot for Andy Lutomirski" <tipbot@zytor.com> wrote: > > Commit-ID: 657c1eea0019e80685a84cbb1919794243a187c9 > Gitweb: http://git.kernel.org/tip/657c1eea0019e80685a84cbb1919794243a187c9 > Author: Andy Lutomirski <luto@kernel.org> > AuthorDate: Fri, 16 Oct 2015 15:42:54 -0700 > Committer: Ingo Molnar <mingo@kernel.org> > CommitDate: Sun, 18 Oct 2015 12:11:16 +0200 > > x86/entry/32: Fix entry_INT80_32() to expect interrupts to be on FWIW, I may want to revert this down the road, but it's fine for now. --Andy ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/2] x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT 2015-10-16 22:42 [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Andy Lutomirski 2015-10-16 22:42 ` [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on Andy Lutomirski @ 2015-10-16 22:42 ` Andy Lutomirski 2015-10-18 10:16 ` [tip:x86/asm] " tip-bot for Andy Lutomirski 2015-10-17 11:43 ` [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Borislav Petkov 2 siblings, 1 reply; 9+ messages in thread From: Andy Lutomirski @ 2015-10-16 22:42 UTC (permalink / raw) To: x86, linux-kernel Cc: Brian Gerst, Denys Vlasenko, Borislav Petkov, Andy Lutomirski We either need to restore them before popping and thus changing ESP, or we need to adjust the offsets. The former is simpler. Fixes: 5f310f739b4c x86/entry/32: ("Re-implement SYSENTER using the new C path") Signed-off-by: Andy Lutomirski <luto@kernel.org> --- arch/x86/entry/entry_32.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index ba0dad937be9..e3ede42d30e2 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -315,6 +315,8 @@ sysenter_past_esp: TRACE_IRQS_ON /* User mode traces as IRQs on. */ movl PT_EIP(%esp), %edx /* pt_regs->ip */ movl PT_OLDESP(%esp), %ecx /* pt_regs->sp */ +1: mov PT_FS(%esp), %fs + PTGS_TO_GS popl %ebx /* pt_regs->bx */ popl %eax /* skip pt_regs->cx */ popl %eax /* skip pt_regs->dx */ @@ -322,8 +324,6 @@ sysenter_past_esp: popl %edi /* pt_regs->di */ popl %ebp /* pt_regs->bp */ popl %eax /* pt_regs->ax */ -1: mov PT_FS(%esp), %fs - PTGS_TO_GS /* * Return back to the vDSO, which will pop ecx and edx. -- 2.4.3 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:x86/asm] x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT 2015-10-16 22:42 ` [PATCH v2 2/2] x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT Andy Lutomirski @ 2015-10-18 10:16 ` tip-bot for Andy Lutomirski 0 siblings, 0 replies; 9+ messages in thread From: tip-bot for Andy Lutomirski @ 2015-10-18 10:16 UTC (permalink / raw) To: linux-tip-commits Cc: torvalds, luto, dvlasenk, brgerst, bp, hpa, mingo, luto, peterz, linux-kernel, bp, tglx Commit-ID: 3bd29515d1cad26fa85a1a9b442de8816c1f5c54 Gitweb: http://git.kernel.org/tip/3bd29515d1cad26fa85a1a9b442de8816c1f5c54 Author: Andy Lutomirski <luto@kernel.org> AuthorDate: Fri, 16 Oct 2015 15:42:55 -0700 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Sun, 18 Oct 2015 12:11:16 +0200 x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT We either need to restore them before popping and thus changing ESP, or we need to adjust the offsets. The former is simpler. Reported-and-tested-by: Borislav Petkov <bp@suse.de> Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Fixes: 5f310f739b4c x86/entry/32: ("Re-implement SYSENTER using the new C path") Link: http://lkml.kernel.org/r/461e5c7d8fa3821529893a4893ac9c4bc37f9e17.1445035014.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/entry/entry_32.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index 4f97f49..3eb572e 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -315,14 +315,14 @@ sysenter_past_esp: TRACE_IRQS_ON /* User mode traces as IRQs on. */ movl PT_EIP(%esp), %edx /* pt_regs->ip */ movl PT_OLDESP(%esp), %ecx /* pt_regs->sp */ +1: mov PT_FS(%esp), %fs + PTGS_TO_GS popl %ebx /* pt_regs->bx */ addl $2*4, %esp /* skip pt_regs->cx and pt_regs->dx */ popl %esi /* pt_regs->si */ popl %edi /* pt_regs->di */ popl %ebp /* pt_regs->bp */ popl %eax /* pt_regs->ax */ -1: mov PT_FS(%esp), %fs - PTGS_TO_GS /* * Return back to the vDSO, which will pop ecx and edx. ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes 2015-10-16 22:42 [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Andy Lutomirski 2015-10-16 22:42 ` [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on Andy Lutomirski 2015-10-16 22:42 ` [PATCH v2 2/2] x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT Andy Lutomirski @ 2015-10-17 11:43 ` Borislav Petkov 2 siblings, 0 replies; 9+ messages in thread From: Borislav Petkov @ 2015-10-17 11:43 UTC (permalink / raw) To: Andy Lutomirski; +Cc: x86, linux-kernel, Brian Gerst, Denys Vlasenko On Fri, Oct 16, 2015 at 03:42:53PM -0700, Andy Lutomirski wrote: > Fixes a (correct) warning and an oops. Oddly, both seem to only > cause problems on some configurations. The second one presumably > only survived my testing because I didn't test a threaded program. > > The first patch is a bit ugly. If that's a problem, suggestions > are welcome. > > Changes from v1: No longer breaks 64-bit builds. > > Andy Lutomirski (2): > x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on > x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT > > arch/x86/entry/common.c | 15 ++++++++++++--- > arch/x86/entry/entry_32.S | 12 ++++++------ > arch/x86/entry/entry_64_compat.S | 2 +- > 3 files changed, 19 insertions(+), 10 deletions(-) Looks good. Reported-and-tested-by: Borislav Petkov <bp@suse.de> -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-10-19 4:48 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-10-16 22:42 [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Andy Lutomirski 2015-10-16 22:42 ` [PATCH v2 1/2] x86/entry/32: Fix entry_INT80_32 to expect interrupts to be on Andy Lutomirski 2015-10-17 2:54 ` Brian Gerst 2015-10-17 4:05 ` Andy Lutomirski 2015-10-18 10:15 ` [tip:x86/asm] x86/entry/32: Fix entry_INT80_32() " tip-bot for Andy Lutomirski 2015-10-19 4:48 ` Andy Lutomirski 2015-10-16 22:42 ` [PATCH v2 2/2] x86/entry/32: Fix FS and GS restore in opportunistic SYSEXIT Andy Lutomirski 2015-10-18 10:16 ` [tip:x86/asm] " tip-bot for Andy Lutomirski 2015-10-17 11:43 ` [PATCH v2 0/2] x86/entry: 32-bit facepalm fixes Borislav Petkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox