]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86_64/kernel/entry.S
Merge branch '85xx' of git://git.kernel.org/pub/scm/linux/kernel/git/galak/powerpc
[linux-2.6-omap-h63xx.git] / arch / x86_64 / kernel / entry.S
index 9ff42041bb6b8b974a00be6c234bbaac31b3213e..7c10e9009d611173d13fddf90650a9dfe78ec7db 100644 (file)
@@ -41,6 +41,7 @@
 #include <asm/unistd.h>
 #include <asm/thread_info.h>
 #include <asm/hw_irq.h>
+#include <asm/page.h>
 
        .code64
 
@@ -313,6 +314,7 @@ int_with_check:
        movl threadinfo_flags(%rcx),%edx
        andl %edi,%edx
        jnz   int_careful
+       andl    $~TS_COMPAT,threadinfo_status(%rcx)
        jmp   retint_swapgs
 
        /* Either reschedule or signal or syscall exit tracking needed. */
@@ -497,7 +499,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
 
@@ -507,7 +511,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
@@ -548,6 +554,7 @@ iret_label:
        /* running with kernel gs */
 bad_iret:
        movq $-9999,%rdi        /* better code? */
+       sti
        jmp do_exit                     
        .previous       
        
@@ -673,7 +680,7 @@ ENTRY(spurious_interrupt)
 
        /* error code is on the stack already */
        /* handle NMI like exceptions that can happen everywhere */
-       .macro paranoidentry sym
+       .macro paranoidentry sym, ist=0
        SAVE_ALL
        cld
        movl $1,%ebx
@@ -683,10 +690,20 @@ ENTRY(spurious_interrupt)
        js    1f
        swapgs
        xorl  %ebx,%ebx
-1:     movq %rsp,%rdi
+1:
+       .if \ist
+       movq    %gs:pda_data_offset, %rbp
+       .endif
+       movq %rsp,%rdi
        movq ORIG_RAX(%rsp),%rsi
        movq $-1,ORIG_RAX(%rsp)
+       .if \ist
+       subq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
+       .endif
        call \sym
+       .if \ist
+       addq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
+       .endif
        cli
        .endm
        
@@ -754,7 +771,7 @@ error_exit:
        jnz  retint_careful
        swapgs 
        RESTORE_ARGS 0,8,0                                              
-       iretq
+       jmp iret_label
        CFI_ENDPROC
 
 error_kernelspace:
@@ -904,13 +921,13 @@ KPROBE_ENTRY(debug)
        INTR_FRAME
        pushq $0
        CFI_ADJUST_CFA_OFFSET 8         
-       paranoidentry do_debug
+       paranoidentry do_debug, DEBUG_STACK
        jmp paranoid_exit
        CFI_ENDPROC
        .previous .text
 
        /* runs on exception stack */   
-ENTRY(nmi)
+KPROBE_ENTRY(nmi)
        INTR_FRAME
        pushq $-1
        CFI_ADJUST_CFA_OFFSET 8
@@ -957,9 +974,15 @@ paranoid_schedule:
        cli
        jmp paranoid_userspace
        CFI_ENDPROC
+       .previous .text
 
 KPROBE_ENTRY(int3)
-       zeroentry do_int3       
+       INTR_FRAME
+       pushq $0
+       CFI_ADJUST_CFA_OFFSET 8
+       paranoidentry do_int3, DEBUG_STACK
+       jmp paranoid_exit
+       CFI_ENDPROC
        .previous .text
 
 ENTRY(overflow)
@@ -1021,23 +1044,18 @@ ENTRY(machine_check)
        CFI_ENDPROC
 #endif
 
-ENTRY(call_debug)
-       zeroentry do_call_debug
-
 ENTRY(call_softirq)
        CFI_STARTPROC
        movq %gs:pda_irqstackptr,%rax
-       pushq %r15
-       CFI_ADJUST_CFA_OFFSET 8
-       movq %rsp,%r15
-       CFI_DEF_CFA_REGISTER    r15
+       movq %rsp,%rdx
+       CFI_DEF_CFA_REGISTER    rdx
        incl %gs:pda_irqcount
        cmove %rax,%rsp
+       pushq %rdx
+       /*todo CFI_DEF_CFA_EXPRESSION ...*/
        call __do_softirq
-       movq %r15,%rsp
+       popq %rsp
        CFI_DEF_CFA_REGISTER    rsp
        decl %gs:pda_irqcount
-       popq %r15
-       CFI_ADJUST_CFA_OFFSET -8
        ret
        CFI_ENDPROC