[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200226095319.GT18400@hirez.programming.kicks-ass.net>
Date: Wed, 26 Feb 2020 10:53:19 +0100
From: Peter Zijlstra <peterz@...radead.org>
To: Thomas Gleixner <tglx@...utronix.de>
Cc: LKML <linux-kernel@...r.kernel.org>, x86@...nel.org,
Steven Rostedt <rostedt@...dmis.org>,
Brian Gerst <brgerst@...il.com>,
Juergen Gross <jgross@...e.com>,
Paolo Bonzini <pbonzini@...hat.com>,
Arnd Bergmann <arnd@...db.de>
Subject: Re: [patch 00/15] x86/entry: Consolidation - Part V
On Tue, Feb 25, 2020 at 11:47:19PM +0100, Thomas Gleixner wrote:
> git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git entry-v1-part5
How about the completely untested something below on top to avoid that
silly indirect call on 32bit idtentry.
---
arch/x86/entry/entry_32.S | 37 ++++++++++++++++++-------------------
1 file changed, 18 insertions(+), 19 deletions(-)
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index cf94e724743d..c92cd8412ab2 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -723,19 +723,19 @@
.endm
#ifdef CONFIG_X86_INVD_BUG
-.macro idtentry_push_func vector cfunc
+.macro idtentry_call_func vector cfunc
.if \vector == X86_TRAP_XF
/* AMD 486 bug: invd from userspace calls exception 19 instead of #GP */
- ALTERNATIVE "pushl $exc_general_protection", \
- "pushl $exc_simd_coprocessor_error", \
+ ALTERNATIVE "call exc_general_protection", \
+ "call exc_simd_coprocessor_error", \
X86_FEATURE_XMM
.else
- pushl $\cfunc
+ call \cfunc
.endif
.endm
#else
-.macro idtentry_push_func vector cfunc
- pushl $\cfunc
+.macro idtentry_call_func vector cfunc
+ call \cfunc
.endm
#endif
@@ -755,10 +755,9 @@ SYM_CODE_START(\asmsym)
pushl $0 /* Clear the error code */
.endif
- /* Push the C-function address into the GS slot */
- idtentry_push_func \vector \cfunc
- /* Invoke the common exception entry */
- jmp common_exception
+ call common_idtentry
+ idtentry_call_func \vector \cfunc
+ jmp ret_from_exception
SYM_CODE_END(\asmsym)
.endm
@@ -1125,7 +1124,6 @@ SYM_FUNC_START(entry_INT80_32)
.section .fixup, "ax"
SYM_CODE_START(asm_exc_iret_error)
pushl $0 # no error code
- pushl $exc_iret_error
#ifdef CONFIG_DEBUG_ENTRY
/*
@@ -1139,7 +1137,9 @@ SYM_CODE_START(asm_exc_iret_error)
popl %eax
#endif
- jmp common_exception
+ call common_idtentry
+ call exc_iret_error
+ jmp ret_from_exception
SYM_CODE_END(asm_exc_iret_error)
.previous
_ASM_EXTABLE(.Lirq_return, asm_exc_iret_error)
@@ -1332,15 +1332,15 @@ SYM_FUNC_START(xen_failsafe_callback)
SYM_FUNC_END(xen_failsafe_callback)
#endif /* CONFIG_XEN_PV */
-SYM_CODE_START_LOCAL_NOALIGN(common_exception)
- /* the function address is in %gs's slot on the stack */
+SYM_CODE_START_LOCAL_NOALIGN(common_idtentry)
+ /* the return address is in the %gs stack slot */
SAVE_ALL switch_stacks=1 skip_gs=1 unwind_espfix=1
ENCODE_FRAME_POINTER
/* fixup %gs */
GS_TO_REG %ecx
- movl PT_GS(%esp), %edi # get the function address
- REG_TO_PTGS %ecx
+ pushl PT_GS(%esp) # push return address
+ REG_TO_OTGS %ecx
SET_KERNEL_GS %ecx
/* fixup orig %eax */
@@ -1348,9 +1348,8 @@ SYM_CODE_START_LOCAL_NOALIGN(common_exception)
movl $-1, PT_ORIG_EAX(%esp) # no syscall to restart
movl %esp, %eax # pt_regs pointer
- CALL_NOSPEC %edi
- jmp ret_from_exception
-SYM_CODE_END(common_exception)
+ ret
+SYM_CODE_END(common_idtentry)
#ifdef CONFIG_DOUBLEFAULT
SYM_CODE_START(asm_exc_double_fault)
Powered by blists - more mailing lists