[PATCH] x86_64: reliable stack trace support (x86-64 IRQ stack
authorJan Beulich <jbeulich@novell.com>
Mon, 26 Jun 2006 11:57:35 +0000 (13:57 +0200)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 26 Jun 2006 17:48:17 +0000 (10:48 -0700)
Change the switching to/from the IRQ stack so that unwind annotations can
be added for it without requiring CFA expressions.

AK: I cleaned it up a bit, making it unconditional and removing the
obsolete DEBUG_INFO full frame code.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/kernel/entry.S

index 6c68bee..4f407ef 100644 (file)
@@ -473,29 +473,18 @@ END(stub_rt_sigreturn)
 /* 0(%rsp): interrupt number */ 
        .macro interrupt func
        cld
-#ifdef CONFIG_DEBUG_INFO
-       SAVE_ALL        
-       movq %rsp,%rdi
-       /*
-        * Setup a stack frame pointer.  This allows gdb to trace
-        * back to the original stack.
-        */
-       movq %rsp,%rbp
-       CFI_DEF_CFA_REGISTER    rbp
-#else          
        SAVE_ARGS
        leaq -ARGOFFSET(%rsp),%rdi      # arg1 for handler
-#endif 
+       pushq %rbp
+       CFI_ADJUST_CFA_OFFSET   8
+       CFI_REL_OFFSET          rbp, 0
+       movq %rsp,%rbp
+       CFI_DEF_CFA_REGISTER    rbp
        testl $3,CS(%rdi)
        je 1f
        swapgs  
 1:     incl    %gs:pda_irqcount        # RED-PEN should check preempt count
-       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
+       cmoveq %gs:pda_irqstackptr,%rsp
        call \func
        .endm
 
@@ -504,17 +493,11 @@ ENTRY(common_interrupt)
        interrupt do_IRQ
        /* 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
-       movq RBP(%rdi),%rbp
+       leaveq
        CFI_DEF_CFA_REGISTER    rsp
-#endif
-       leaq ARGOFFSET(%rdi),%rsp /*todo This needs CFI annotation! */
+       CFI_ADJUST_CFA_OFFSET   -8
 exit_intr:
        GET_THREAD_INFO(%rcx)
        testl $3,CS-ARGOFFSET(%rsp)