x86/asm/entry/64/compat: Fold the IA32_ARG_FIXUP macro into its callers
Use of a small macro - one with conditional expansion - does more harm than good. It obfuscates code, with minimal code reuse. For example, because of obfuscation it's not obvious that in 'ia32_sysenter_target', we can optimize loading of r9 - currently it is loaded with a detour through ebp. This patch folds the IA32_ARG_FIXUP macro into its callers. No code changes. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> Signed-off-by: Andy Lutomirski <luto@amacapital.net> Cc: Alexei Starovoitov <ast@plumgrid.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Will Drewry <wad@chromium.org> Link: http://lkml.kernel.org/r/4da092094cd78734384ac31e0d4ec1d8f69145a2.1424989793.git.luto@amacapital.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
committed by
Ingo Molnar
parent
ebfc453e27
commit
14f6e9532d
+18
-14
@@ -30,17 +30,6 @@
|
|||||||
|
|
||||||
.section .entry.text, "ax"
|
.section .entry.text, "ax"
|
||||||
|
|
||||||
.macro IA32_ARG_FIXUP noebp=0
|
|
||||||
movl %edi,%r8d
|
|
||||||
.if \noebp
|
|
||||||
.else
|
|
||||||
movl %ebp,%r9d
|
|
||||||
.endif
|
|
||||||
xchg %ecx,%esi
|
|
||||||
movl %ebx,%edi
|
|
||||||
movl %edx,%edx /* zero extension */
|
|
||||||
.endm
|
|
||||||
|
|
||||||
/* clobbers %rax */
|
/* clobbers %rax */
|
||||||
.macro CLEAR_RREGS _r9=rax
|
.macro CLEAR_RREGS _r9=rax
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
@@ -178,7 +167,12 @@ sysenter_flags_fixed:
|
|||||||
cmpq $(IA32_NR_syscalls-1),%rax
|
cmpq $(IA32_NR_syscalls-1),%rax
|
||||||
ja ia32_badsys
|
ja ia32_badsys
|
||||||
sysenter_do_call:
|
sysenter_do_call:
|
||||||
IA32_ARG_FIXUP
|
/* 32bit syscall -> 64bit C ABI argument conversion */
|
||||||
|
movl %edi,%r8d /* arg5 */
|
||||||
|
movl %ebp,%r9d /* arg6 */
|
||||||
|
xchg %ecx,%esi /* rsi:arg2, rcx:arg4 */
|
||||||
|
movl %ebx,%edi /* arg1 */
|
||||||
|
movl %edx,%edx /* arg3 (zero extension) */
|
||||||
sysenter_dispatch:
|
sysenter_dispatch:
|
||||||
call *ia32_sys_call_table(,%rax,8)
|
call *ia32_sys_call_table(,%rax,8)
|
||||||
movq %rax,RAX(%rsp)
|
movq %rax,RAX(%rsp)
|
||||||
@@ -360,7 +354,12 @@ ENTRY(ia32_cstar_target)
|
|||||||
cmpq $IA32_NR_syscalls-1,%rax
|
cmpq $IA32_NR_syscalls-1,%rax
|
||||||
ja ia32_badsys
|
ja ia32_badsys
|
||||||
cstar_do_call:
|
cstar_do_call:
|
||||||
IA32_ARG_FIXUP 1
|
/* 32bit syscall -> 64bit C ABI argument conversion */
|
||||||
|
movl %edi,%r8d /* arg5 */
|
||||||
|
/* r9 already loaded */ /* arg6 */
|
||||||
|
xchg %ecx,%esi /* rsi:arg2, rcx:arg4 */
|
||||||
|
movl %ebx,%edi /* arg1 */
|
||||||
|
movl %edx,%edx /* arg3 (zero extension) */
|
||||||
cstar_dispatch:
|
cstar_dispatch:
|
||||||
call *ia32_sys_call_table(,%rax,8)
|
call *ia32_sys_call_table(,%rax,8)
|
||||||
movq %rax,RAX(%rsp)
|
movq %rax,RAX(%rsp)
|
||||||
@@ -477,7 +476,12 @@ ENTRY(ia32_syscall)
|
|||||||
cmpq $(IA32_NR_syscalls-1),%rax
|
cmpq $(IA32_NR_syscalls-1),%rax
|
||||||
ja ia32_badsys
|
ja ia32_badsys
|
||||||
ia32_do_call:
|
ia32_do_call:
|
||||||
IA32_ARG_FIXUP
|
/* 32bit syscall -> 64bit C ABI argument conversion */
|
||||||
|
movl %edi,%r8d /* arg5 */
|
||||||
|
movl %ebp,%r9d /* arg6 */
|
||||||
|
xchg %ecx,%esi /* rsi:arg2, rcx:arg4 */
|
||||||
|
movl %ebx,%edi /* arg1 */
|
||||||
|
movl %edx,%edx /* arg3 (zero extension) */
|
||||||
call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
|
call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
|
||||||
ia32_sysret:
|
ia32_sysret:
|
||||||
movq %rax,RAX(%rsp)
|
movq %rax,RAX(%rsp)
|
||||||
|
|||||||
Reference in New Issue
Block a user