Skip to content

Commit

Permalink
Revert "[PATCH] x86-64: Fix up handling of non canonical user RIPs"
Browse files Browse the repository at this point in the history
This reverts commit c33d456.

Andrew Clayton and Hugh Dickins report that it's broken for them and
causes strange page table and slab corruption, and spontaneous reboots.

Let's get it right next time.

Cc: Andrew Clayton <andrew@rootshell.co.uk>
Cc: Hugh Dickins <hugh@veritas.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Linus Torvalds committed Mar 14, 2006
1 parent ceb2ca9 commit cbf0ec6
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions arch/x86_64/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -178,12 +178,6 @@ rff_trace:
* Interrupts are off on entry.
* Only called from user space.
*
* EM64T CPUs have somewhat weird error reporting for non canonical RIPs in SYSRET.
* We can't handle any exceptions there because the exception handler would
* end up running on the user stack which is unsafe. To avoid problems
* any code that might end up with a user touched pt_regs should return
* using int_ret_from_syscall.
*
* XXX if we had a free scratch register we could save the RSP into the stack frame
* and report it properly in ps. Unfortunately we haven't.
*/
Expand Down Expand Up @@ -260,9 +254,7 @@ sysret_signal:
xorl %esi,%esi # oldset -> arg2
call ptregscall_common
1: movl $_TIF_NEED_RESCHED,%edi
/* Stack frame might have been changed. The IRET path does
some additional checks to handle this */
jmp int_with_check
jmp sysret_check

badsys:
movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
Expand All @@ -288,8 +280,7 @@ tracesys:
call syscall_trace_leave
RESTORE_TOP_OF_STACK %rbx
RESTORE_REST
/* Stack frame might have been changed. Use the more careful IRET path */
jmp int_ret_from_sys_call
jmp ret_from_sys_call
CFI_ENDPROC

/*
Expand Down Expand Up @@ -417,9 +408,25 @@ ENTRY(stub_execve)
CFI_ADJUST_CFA_OFFSET -8
CFI_REGISTER rip, r11
SAVE_REST
movq %r11, %r15
CFI_REGISTER rip, r15
FIXUP_TOP_OF_STACK %r11
call sys_execve
GET_THREAD_INFO(%rcx)
bt $TIF_IA32,threadinfo_flags(%rcx)
CFI_REMEMBER_STATE
jc exec_32bit
RESTORE_TOP_OF_STACK %r11
movq %r15, %r11
CFI_REGISTER rip, r11
RESTORE_REST
pushq %r11
CFI_ADJUST_CFA_OFFSET 8
CFI_REL_OFFSET rip, 0
ret

exec_32bit:
CFI_RESTORE_STATE
movq %rax,RAX(%rsp)
RESTORE_REST
jmp int_ret_from_sys_call
Expand Down

0 comments on commit cbf0ec6

Please sign in to comment.