Misc x86 cleanups
Subsystems (2)
cover Misc x86 cleanups
Here are a few cleanups from the recent x86 entry code rewrite.
[PATCH 1/3] x86: Don't save/restore EFLAGS on task switch [PATCH 2/3] x86-32: Remove GET_THREAD_INFO from entry code [PATCH 3/3] x86-32: Remove asmlinkage_protect
arch/x86/entry/entry_32.S | 7 ------- arch/x86/entry/entry_64.S | 3 --- arch/x86/include/asm/linkage.h | 34 ---------------------------------- arch/x86/include/asm/switch_to.h | 4 +--- 4 files changed, 1 insertion(+), 47 deletions(-)
PATCH 1/3 x86: Don't save/restore EFLAGS on task switch
Now that NT is filtered by the SYSENTER entry code, it is safe to skip saving and restoring flags on task switch. Also remove a leftover reset of flags on 64-bit fork.
--- arch/x86/entry/entry_32.S | 4 ---- arch/x86/entry/entry_64.S | 3 --- arch/x86/include/asm/switch_to.h | 4 +--- 3 files changed, 1 insertion(+), 10 deletions(-)
arch/x86/entry/entry_32.S +0 -4
@@ -209,8 +209,6 @@ ENTRY(ret_from_fork) call schedule_tail GET_THREAD_INFO(%ebp) popl %eax - pushl $0x0202 # Reset kernel eflags - popfl /* When we fork, we trace the syscall return in the child, too. */ movl %esp, %eax
@@ -223,8 +221,6 @@ ENTRY(ret_from_kernel_thread) call schedule_tail GET_THREAD_INFO(%ebp) popl %eax - pushl $0x0202 # Reset kernel eflags - popfl movl PT_EBP(%esp), %eax call *PT_EBX(%esp) movl $0, PT_EAX(%esp)
arch/x86/entry/entry_64.S +0 -3
@@ -372,9 +372,6 @@ END(ptregs_\func) ENTRY(ret_from_fork) LOCK ; btr $TIF_FORK, TI_flags(%r8) - pushq $0x0002 - popfq /* reset kernel eflags */ - call schedule_tail /* rdi: 'prev' task parameter */ testb $3, CS(%rsp) /* from kernel_thread? */
arch/x86/include/asm/switch_to.h +1 -3
@@ -39,8 +39,7 @@ do { \*/ \unsigned long ebx, ecx, edx, esi, edi; \ \ - asmvolatile ("pushfl\n\t" /* save flags */ \ -"pushl %%ebp\n\t" /* save EBP */ \ + asmvolatile ("pushl %%ebp\n\t" /* save EBP */ \"movl %%esp,%[prev_sp]\n\t" /* save ESP */ \"movl %[next_sp],%%esp\n\t" /* restore ESP */ \ "movl $1f,%[prev_ip]\n\t" /* save EIP */ \
@@ -49,7 +48,6 @@ do { \"jmp __switch_to\n" /* regparm call */ \"1:\t" \"popl %%ebp\n\t" /* restore EBP */ \ -"popfl\n" /* restore flags */ \ \/* output parameters */ \ : [prev_sp] "=m" (prev->thread.sp), \
Signature · 1 line
2.5.5
Re: [PATCH 1/3] x86: Don't save/restore EFLAGS on task switch
Quoted 3 lines · Brian Gerst
Now that NT is filtered by the SYSENTER entry code, it is safe to skip saving and restoring flags on task switch. Also remove a leftover reset of flags on 64-bit fork.
tip-bot for Brian Gerst
merge bot[tip:x86/asm] x86/entry, sched/x86: Don't save/restore EFLAGS on task switch
In reply to Brian Gerstx86/entry, sched/x86: Don't save/restore EFLAGS on task switch
Commit-ID: 092c74e420952c7cb68141731f2b562245b51eeb Gitweb: http://git.kernel.org/tip/092c74e420952c7cb68141731f2b562245b51eeb Author: Brian Gerst <[email protected]> AuthorDate: Wed, 4 May 2016 22:44:36 -0400 Committer: Ingo Molnar <[email protected]> CommitDate: Thu, 5 May 2016 08:37:30 +0200
x86/entry, sched/x86: Don't save/restore EFLAGS on task switch
Now that NT is filtered by the SYSENTER entry code, it is safe to skip saving and restoring flags on task switch. Also remove a leftover reset of flags on 64-bit fork.
--- arch/x86/entry/entry_32.S | 4 ---- arch/x86/entry/entry_64.S | 3 --- arch/x86/include/asm/switch_to.h | 4 +--- 3 files changed, 1 insertion(+), 10 deletions(-)
arch/x86/entry/entry_32.S +0 -4
@@ -209,8 +209,6 @@ ENTRY(ret_from_fork) call schedule_tail GET_THREAD_INFO(%ebp) popl %eax - pushl $0x0202 # Reset kernel eflags - popfl /* When we fork, we trace the syscall return in the child, too. */ movl %esp, %eax
@@ -223,8 +221,6 @@ ENTRY(ret_from_kernel_thread) call schedule_tail GET_THREAD_INFO(%ebp) popl %eax - pushl $0x0202 # Reset kernel eflags - popfl movl PT_EBP(%esp), %eax call *PT_EBX(%esp) movl $0, PT_EAX(%esp)
arch/x86/entry/entry_64.S +0 -3
@@ -372,9 +372,6 @@ END(ptregs_\func) ENTRY(ret_from_fork) LOCK ; btr $TIF_FORK, TI_flags(%r8) - pushq $0x0002 - popfq /* reset kernel eflags */ - call schedule_tail /* rdi: 'prev' task parameter */ testb $3, CS(%rsp) /* from kernel_thread? */
arch/x86/include/asm/switch_to.h +1 -3
@@ -39,8 +39,7 @@ do { \*/ \unsigned long ebx, ecx, edx, esi, edi; \ \ - asmvolatile ("pushfl\n\t" /* save flags */ \ -"pushl %%ebp\n\t" /* save EBP */ \ + asmvolatile ("pushl %%ebp\n\t" /* save EBP */ \"movl %%esp,%[prev_sp]\n\t" /* save ESP */ \"movl %[next_sp],%%esp\n\t" /* restore ESP */ \ "movl $1f,%[prev_ip]\n\t" /* save EIP */ \
@@ -49,7 +48,6 @@ do { \"jmp __switch_to\n" /* regparm call */ \"1:\t" \"popl %%ebp\n\t" /* restore EBP */ \ -"popfl\n" /* restore flags */ \ \/* output parameters */ \ : [prev_sp] "=m" (prev->thread.sp), \
PATCH 2/3 x86-32: Remove GET_THREAD_INFO from entry code
In reply to Brian GerstThe entry code used to cache the thread_info pointer in the EBP register, but all the code that used it has been moved to C. Remove the unused code to get the pointer.
--- arch/x86/entry/entry_32.S | 3 --- 1 file changed, 3 deletions(-)
arch/x86/entry/entry_32.S +0 -3
@@ -207,7 +207,6 @@ ENTRY(ret_from_fork) pushl %eax call schedule_tail - GET_THREAD_INFO(%ebp) popl %eax /* When we fork, we trace the syscall return in the child, too. */
@@ -219,7 +218,6 @@ END(ret_from_fork) ENTRY(ret_from_kernel_thread) pushl %eax call schedule_tail - GET_THREAD_INFO(%ebp) popl %eax movl PT_EBP(%esp), %eax call *PT_EBX(%esp)
@@ -247,7 +245,6 @@ ENDPROC(ret_from_kernel_thread) ret_from_exception: preempt_stop(CLBR_ANY) ret_from_intr: - GET_THREAD_INFO(%ebp) #ifdef CONFIG_VM86 movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS movb PT_CS(%esp), %al
Signature · 1 line
2.5.5
Re: [PATCH 2/3] x86-32: Remove GET_THREAD_INFO from entry code
Quoted 3 lines · Brian Gerst
The entry code used to cache the
thread_infopointer in the EBP register, but all the code that used it has been moved to C. Remove the unused code to get the pointer.
tip-bot for Brian Gerst
merge bot[tip:x86/asm] x86/entry/32: Remove GET_THREAD_INFO() from entry code
In reply to Brian Gerstx86/entry/32: Remove GET_THREAD_INFO() from entry code
Commit-ID: 1e17880371f85d3d866962e04ba3567c0654a125 Gitweb: http://git.kernel.org/tip/1e17880371f85d3d866962e04ba3567c0654a125 Author: Brian Gerst <[email protected]> AuthorDate: Wed, 4 May 2016 22:44:37 -0400 Committer: Ingo Molnar <[email protected]> CommitDate: Thu, 5 May 2016 08:37:30 +0200
x86/entry/32: Remove GET_THREAD_INFO() from entry code
The entry code used to cache the thread_info pointer in the EBP register, but all the code that used it has been moved to C. Remove the unused code to get the pointer.
--- arch/x86/entry/entry_32.S | 3 --- 1 file changed, 3 deletions(-)
arch/x86/entry/entry_32.S +0 -3
@@ -207,7 +207,6 @@ ENTRY(ret_from_fork) pushl %eax call schedule_tail - GET_THREAD_INFO(%ebp) popl %eax /* When we fork, we trace the syscall return in the child, too. */
@@ -219,7 +218,6 @@ END(ret_from_fork) ENTRY(ret_from_kernel_thread) pushl %eax call schedule_tail - GET_THREAD_INFO(%ebp) popl %eax movl PT_EBP(%esp), %eax call *PT_EBX(%esp)
@@ -247,7 +245,6 @@ ENDPROC(ret_from_kernel_thread) ret_from_exception: preempt_stop(CLBR_ANY) ret_from_intr: - GET_THREAD_INFO(%ebp) #ifdef CONFIG_VM86 movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS movb PT_CS(%esp), %al
PATCH 3/3 x86-32: Remove asmlinkage_protect
In reply to Brian GerstNow that syscalls are called from C code, which copies the args to new stack slots instead of overlaying pt_regs, asmlinkage_protect is no longer needed.
--- arch/x86/include/asm/linkage.h | 34 ---------------------------------- 1 file changed, 34 deletions(-)
arch/x86/include/asm/linkage.h +0 -34
@@ -8,40 +8,6 @@#ifdef CONFIG_X86_32 #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) - -/* -* Make sure the compiler doesn't do anything stupid with the -* arguments on the stack - they are owned by the *caller*, not -* the callee. This just fools gcc into not spilling into them, -* and keeps it from doing tailcall recursion and/or using the -* stack slots for temporaries, since they are live and "used" -* all the way to the end of the function. -* -* NOTE! On x86-64, all the arguments are in registers, so this -* only matters on a 32-bit kernel. -*/ -#define asmlinkage_protect(n, ret, args...) \ - __asmlinkage_protect##n(ret, ##args) -#define __asmlinkage_protect_n(ret, args...) \ - __asm__ __volatile__ ("" : "=r" (ret) : "0" (ret), ##args) -#define __asmlinkage_protect0 (ret) \ - __asmlinkage_protect_n(ret) -#define __asmlinkage_protect1 (ret, arg1) \ - __asmlinkage_protect_n(ret, "m" (arg1)) -#define __asmlinkage_protect2 (ret, arg1, arg2) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2)) -#define __asmlinkage_protect3 (ret, arg1, arg2, arg3) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3)) -#define __asmlinkage_protect4 (ret, arg1, arg2, arg3, arg4) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4)) -#define __asmlinkage_protect5 (ret, arg1, arg2, arg3, arg4, arg5) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4), "m" (arg5)) -#define __asmlinkage_protect6 (ret, arg1, arg2, arg3, arg4, arg5, arg6) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4), "m" (arg5), "m" (arg6)) -#endif /* CONFIG_X86_32 */ #ifdef __ASSEMBLY__
Signature · 1 line
2.5.5
Re: [PATCH 3/3] x86-32: Remove asmlinkage_protect
Quoted 2 lines · Brian Gerst
Now that syscalls are called from C code, which copies the args to new stack slots instead of overlaying
pt_regs,asmlinkage_protectis no longer needed.
asmlinkage_protect was pretty gross...
--Andy
tip-bot for Brian Gerst
merge bot[tip:x86/asm] x86/entry/32: Remove asmlinkage_protect()
In reply to Brian Gerstx86/entry/32: Remove asmlinkage_protect()
Commit-ID: 0676b4e0a1940a6b7ae3156bd212ca9032a29c30 Gitweb: http://git.kernel.org/tip/0676b4e0a1940a6b7ae3156bd212ca9032a29c30 Author: Brian Gerst <[email protected]> AuthorDate: Wed, 4 May 2016 22:44:38 -0400 Committer: Ingo Molnar <[email protected]> CommitDate: Thu, 5 May 2016 08:37:31 +0200
x86/entry/32: Remove asmlinkage_protect()
Now that syscalls are called from C code, which copies the args to new stack slots instead of overlaying pt_regs, asmlinkage_protect() is no longer needed.
--- arch/x86/include/asm/linkage.h | 34 ---------------------------------- 1 file changed, 34 deletions(-)
arch/x86/include/asm/linkage.h +0 -34
@@ -8,40 +8,6 @@#ifdef CONFIG_X86_32 #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) - -/* -* Make sure the compiler doesn't do anything stupid with the -* arguments on the stack - they are owned by the *caller*, not -* the callee. This just fools gcc into not spilling into them, -* and keeps it from doing tailcall recursion and/or using the -* stack slots for temporaries, since they are live and "used" -* all the way to the end of the function. -* -* NOTE! On x86-64, all the arguments are in registers, so this -* only matters on a 32-bit kernel. -*/ -#define asmlinkage_protect(n, ret, args...) \ - __asmlinkage_protect##n(ret, ##args) -#define __asmlinkage_protect_n(ret, args...) \ - __asm__ __volatile__ ("" : "=r" (ret) : "0" (ret), ##args) -#define __asmlinkage_protect0 (ret) \ - __asmlinkage_protect_n(ret) -#define __asmlinkage_protect1 (ret, arg1) \ - __asmlinkage_protect_n(ret, "m" (arg1)) -#define __asmlinkage_protect2 (ret, arg1, arg2) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2)) -#define __asmlinkage_protect3 (ret, arg1, arg2, arg3) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3)) -#define __asmlinkage_protect4 (ret, arg1, arg2, arg3, arg4) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4)) -#define __asmlinkage_protect5 (ret, arg1, arg2, arg3, arg4, arg5) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4), "m" (arg5)) -#define __asmlinkage_protect6 (ret, arg1, arg2, arg3, arg4, arg5, arg6) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4), "m" (arg5), "m" (arg6)) -#endif /* CONFIG_X86_32 */ #ifdef __ASSEMBLY__