aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-03-14 11:01:47 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-14 11:01:47 -0500
commitcbf0ec6ee001ab89471397ac84105b2e3b2fd986 (patch)
treec5962763cc47cc36b4c1ff1c4c56b96b256a4657
parentceb2ca9cb0bfd885127fa9a2c27127b3fe1c8f28 (diff)
Revert "[PATCH] x86-64: Fix up handling of non canonical user RIPs"
This reverts commit c33d4568aca9028a22857f94f5e0850012b6444b. 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>
-rw-r--r--arch/x86_64/kernel/entry.S29
1 files changed, 18 insertions, 11 deletions
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S
index 22cb6ee074b9..7c10e9009d61 100644
--- a/arch/x86_64/kernel/entry.S
+++ b/arch/x86_64/kernel/entry.S
@@ -178,12 +178,6 @@ rff_trace:
178 * Interrupts are off on entry. 178 * Interrupts are off on entry.
179 * Only called from user space. 179 * Only called from user space.
180 * 180 *
181 * EM64T CPUs have somewhat weird error reporting for non canonical RIPs in SYSRET.
182 * We can't handle any exceptions there because the exception handler would
183 * end up running on the user stack which is unsafe. To avoid problems
184 * any code that might end up with a user touched pt_regs should return
185 * using int_ret_from_syscall.
186 *
187 * XXX if we had a free scratch register we could save the RSP into the stack frame 181 * XXX if we had a free scratch register we could save the RSP into the stack frame
188 * and report it properly in ps. Unfortunately we haven't. 182 * and report it properly in ps. Unfortunately we haven't.
189 */ 183 */
@@ -260,9 +254,7 @@ sysret_signal:
260 xorl %esi,%esi # oldset -> arg2 254 xorl %esi,%esi # oldset -> arg2
261 call ptregscall_common 255 call ptregscall_common
2621: movl $_TIF_NEED_RESCHED,%edi 2561: movl $_TIF_NEED_RESCHED,%edi
263 /* Stack frame might have been changed. The IRET path does 257 jmp sysret_check
264 some additional checks to handle this */
265 jmp int_with_check
266 258
267badsys: 259badsys:
268 movq $-ENOSYS,RAX-ARGOFFSET(%rsp) 260 movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
@@ -288,8 +280,7 @@ tracesys:
288 call syscall_trace_leave 280 call syscall_trace_leave
289 RESTORE_TOP_OF_STACK %rbx 281 RESTORE_TOP_OF_STACK %rbx
290 RESTORE_REST 282 RESTORE_REST
291 /* Stack frame might have been changed. Use the more careful IRET path */ 283 jmp ret_from_sys_call
292 jmp int_ret_from_sys_call
293 CFI_ENDPROC 284 CFI_ENDPROC
294 285
295/* 286/*
@@ -417,9 +408,25 @@ ENTRY(stub_execve)
417 CFI_ADJUST_CFA_OFFSET -8 408 CFI_ADJUST_CFA_OFFSET -8
418 CFI_REGISTER rip, r11 409 CFI_REGISTER rip, r11
419 SAVE_REST 410 SAVE_REST
411 movq %r11, %r15
412 CFI_REGISTER rip, r15
420 FIXUP_TOP_OF_STACK %r11 413 FIXUP_TOP_OF_STACK %r11
421 call sys_execve 414 call sys_execve
415 GET_THREAD_INFO(%rcx)
416 bt $TIF_IA32,threadinfo_flags(%rcx)
417 CFI_REMEMBER_STATE
418 jc exec_32bit
422 RESTORE_TOP_OF_STACK %r11 419 RESTORE_TOP_OF_STACK %r11
420 movq %r15, %r11
421 CFI_REGISTER rip, r11
422 RESTORE_REST
423 pushq %r11
424 CFI_ADJUST_CFA_OFFSET 8
425 CFI_REL_OFFSET rip, 0
426 ret
427
428exec_32bit:
429 CFI_RESTORE_STATE
423 movq %rax,RAX(%rsp) 430 movq %rax,RAX(%rsp)
424 RESTORE_REST 431 RESTORE_REST
425 jmp int_ret_from_sys_call 432 jmp int_ret_from_sys_call