Commit c0c3322e authored by Denys Vlasenko's avatar Denys Vlasenko Committed by Thomas Gleixner

x86/asm/entry/32: Revert 'Do not use R9 in SYSCALL32' commit

This change reverts most of commit 53e9accf 'Do not use R9 in
SYSCALL32'. I don't yet understand how, but code in that commit
sometimes fails to preserve EBP.

See https://bugzilla.kernel.org/show_bug.cgi?id=101061
"Problems while executing 32-bit code on AMD64"
Reported-and-tested-by: default avatarKrzysztof A. Sobiecki <sobkas@gmail.com>
Signed-off-by: default avatarDenys Vlasenko <dvlasenk@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Will Drewry <wad@chromium.org>
Cc: Kees Cook <keescook@chromium.org>
CC: x86@kernel.org
Link: http://lkml.kernel.org/r/1437740203-11552-1-git-send-email-dvlasenk@redhat.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 8a0a5da6
...@@ -205,7 +205,6 @@ sysexit_from_sys_call: ...@@ -205,7 +205,6 @@ sysexit_from_sys_call:
movl RDX(%rsp), %edx /* arg3 */ movl RDX(%rsp), %edx /* arg3 */
movl RSI(%rsp), %ecx /* arg4 */ movl RSI(%rsp), %ecx /* arg4 */
movl RDI(%rsp), %r8d /* arg5 */ movl RDI(%rsp), %r8d /* arg5 */
movl %ebp, %r9d /* arg6 */
.endm .endm
.macro auditsys_exit exit .macro auditsys_exit exit
...@@ -236,6 +235,7 @@ sysexit_from_sys_call: ...@@ -236,6 +235,7 @@ sysexit_from_sys_call:
sysenter_auditsys: sysenter_auditsys:
auditsys_entry_common auditsys_entry_common
movl %ebp, %r9d /* reload 6th syscall arg */
jmp sysenter_dispatch jmp sysenter_dispatch
sysexit_audit: sysexit_audit:
...@@ -336,7 +336,7 @@ ENTRY(entry_SYSCALL_compat) ...@@ -336,7 +336,7 @@ ENTRY(entry_SYSCALL_compat)
* 32-bit zero extended: * 32-bit zero extended:
*/ */
ASM_STAC ASM_STAC
1: movl (%r8), %ebp 1: movl (%r8), %r9d
_ASM_EXTABLE(1b, ia32_badarg) _ASM_EXTABLE(1b, ia32_badarg)
ASM_CLAC ASM_CLAC
orl $TS_COMPAT, ASM_THREAD_INFO(TI_status, %rsp, SIZEOF_PTREGS) orl $TS_COMPAT, ASM_THREAD_INFO(TI_status, %rsp, SIZEOF_PTREGS)
...@@ -346,7 +346,7 @@ ENTRY(entry_SYSCALL_compat) ...@@ -346,7 +346,7 @@ ENTRY(entry_SYSCALL_compat)
cstar_do_call: cstar_do_call:
/* 32-bit syscall -> 64-bit C ABI argument conversion */ /* 32-bit syscall -> 64-bit C ABI argument conversion */
movl %edi, %r8d /* arg5 */ movl %edi, %r8d /* arg5 */
movl %ebp, %r9d /* arg6 */ /* r9 already loaded */ /* arg6 */
xchg %ecx, %esi /* rsi:arg2, rcx:arg4 */ xchg %ecx, %esi /* rsi:arg2, rcx:arg4 */
movl %ebx, %edi /* arg1 */ movl %ebx, %edi /* arg1 */
movl %edx, %edx /* arg3 (zero extension) */ movl %edx, %edx /* arg3 (zero extension) */
...@@ -358,7 +358,6 @@ cstar_dispatch: ...@@ -358,7 +358,6 @@ cstar_dispatch:
call *ia32_sys_call_table(, %rax, 8) call *ia32_sys_call_table(, %rax, 8)
movq %rax, RAX(%rsp) movq %rax, RAX(%rsp)
1: 1:
movl RCX(%rsp), %ebp
DISABLE_INTERRUPTS(CLBR_NONE) DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF TRACE_IRQS_OFF
testl $_TIF_ALLWORK_MASK, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) testl $_TIF_ALLWORK_MASK, ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
...@@ -392,7 +391,9 @@ sysretl_from_sys_call: ...@@ -392,7 +391,9 @@ sysretl_from_sys_call:
#ifdef CONFIG_AUDITSYSCALL #ifdef CONFIG_AUDITSYSCALL
cstar_auditsys: cstar_auditsys:
movl %r9d, R9(%rsp) /* register to be clobbered by call */
auditsys_entry_common auditsys_entry_common
movl R9(%rsp), %r9d /* reload 6th syscall arg */
jmp cstar_dispatch jmp cstar_dispatch
sysretl_audit: sysretl_audit:
...@@ -404,14 +405,16 @@ cstar_tracesys: ...@@ -404,14 +405,16 @@ cstar_tracesys:
testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS)
jz cstar_auditsys jz cstar_auditsys
#endif #endif
xchgl %r9d, %ebp
SAVE_EXTRA_REGS SAVE_EXTRA_REGS
xorl %eax, %eax /* Do not leak kernel information */ xorl %eax, %eax /* Do not leak kernel information */
movq %rax, R11(%rsp) movq %rax, R11(%rsp)
movq %rax, R10(%rsp) movq %rax, R10(%rsp)
movq %rax, R9(%rsp) movq %r9, R9(%rsp)
movq %rax, R8(%rsp) movq %rax, R8(%rsp)
movq %rsp, %rdi /* &pt_regs -> arg1 */ movq %rsp, %rdi /* &pt_regs -> arg1 */
call syscall_trace_enter call syscall_trace_enter
movl R9(%rsp), %r9d
/* Reload arg registers from stack. (see sysenter_tracesys) */ /* Reload arg registers from stack. (see sysenter_tracesys) */
movl RCX(%rsp), %ecx movl RCX(%rsp), %ecx
...@@ -421,6 +424,7 @@ cstar_tracesys: ...@@ -421,6 +424,7 @@ cstar_tracesys:
movl %eax, %eax /* zero extension */ movl %eax, %eax /* zero extension */
RESTORE_EXTRA_REGS RESTORE_EXTRA_REGS
xchgl %ebp, %r9d
jmp cstar_do_call jmp cstar_do_call
END(entry_SYSCALL_compat) END(entry_SYSCALL_compat)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment