Pull Kconfig into release branch
[pandora-kernel.git] / arch / x86_64 / kernel / entry.S
index dbdba56..586b34c 100644 (file)
@@ -180,6 +180,10 @@ rff_trace:
  *
  * 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.
+ *
+ * When user can change the frames always force IRET. That is because
+ * it deals with uncanonical addresses better. SYSRET has trouble
+ * with them due to bugs in both AMD and Intel CPUs.
  */                                    
 
 ENTRY(system_call)
@@ -254,7 +258,10 @@ sysret_signal:
        xorl %esi,%esi # oldset -> arg2
        call ptregscall_common
 1:     movl $_TIF_NEED_RESCHED,%edi
-       jmp sysret_check
+       /* Use IRET because user could have changed frame. This
+          works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
+       cli
+       jmp int_with_check
        
 badsys:
        movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
@@ -274,13 +281,9 @@ tracesys:
        ja  1f
        movq %r10,%rcx  /* fixup for C */
        call *sys_call_table(,%rax,8)
-       movq %rax,RAX-ARGOFFSET(%rsp)
-1:     SAVE_REST
-       movq %rsp,%rdi
-       call syscall_trace_leave
-       RESTORE_TOP_OF_STACK %rbx
-       RESTORE_REST
-       jmp ret_from_sys_call
+1:     movq %rax,RAX-ARGOFFSET(%rsp)
+       /* Use IRET because user could have changed frame */
+       jmp int_ret_from_sys_call
        CFI_ENDPROC
                
 /* 
@@ -408,25 +411,9 @@ 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
@@ -499,7 +486,9 @@ ENTRY(stub_rt_sigreturn)
        movq %gs:pda_irqstackptr,%rax
        cmoveq %rax,%rsp /*todo This needs CFI annotation! */
        pushq %rdi                      # save old stack        
+#ifndef CONFIG_DEBUG_INFO
        CFI_ADJUST_CFA_OFFSET   8
+#endif
        call \func
        .endm
 
@@ -509,7 +498,9 @@ ENTRY(common_interrupt)
        /* 0(%rsp): oldrsp-ARGOFFSET */
 ret_from_intr:
        popq  %rdi
+#ifndef CONFIG_DEBUG_INFO
        CFI_ADJUST_CFA_OFFSET   -8
+#endif
        cli     
        decl %gs:pda_irqcount
 #ifdef CONFIG_DEBUG_INFO
@@ -549,7 +540,8 @@ iret_label:
        /* force a signal here? this matches i386 behaviour */
        /* running with kernel gs */
 bad_iret:
-       movq $-9999,%rdi        /* better code? */
+       movq $11,%rdi   /* SIGSEGV */
+       sti
        jmp do_exit                     
        .previous       
        
@@ -922,7 +914,7 @@ KPROBE_ENTRY(debug)
        .previous .text
 
        /* runs on exception stack */   
-ENTRY(nmi)
+KPROBE_ENTRY(nmi)
        INTR_FRAME
        pushq $-1
        CFI_ADJUST_CFA_OFFSET 8
@@ -969,6 +961,7 @@ paranoid_schedule:
        cli
        jmp paranoid_userspace
        CFI_ENDPROC
+       .previous .text
 
 KPROBE_ENTRY(int3)
        INTR_FRAME