Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1de9c3f6 authored by Jan Beulich's avatar Jan Beulich Committed by Linus Torvalds
Browse files

[PATCH] x86_64: reliable stack trace support (x86-64 IRQ stack



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: default avatarJan Beulich <jbeulich@novell.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b538ed27
Loading
Loading
Loading
Loading
+8 −25
Original line number Diff line number Diff line
@@ -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)