Skip to contentSkip to conversation

Fixes for .cfi directives for x86_64 kgdb

PATCH New Jim Houston 4 participants 7 messages Mar 17, 2004 – Mar 23, 2004

lore
Share & tools
lore
#0 lore raw

Hi Andi, Andrew, Amit,

The attached patch fixes the .cfi directives for the common_interrupt path for opteron. It seems that the existing .cfi directives in this path only work by accident.

I spent yesterday decoding a stack by hand and looking at the dwarf unwind data using "readelf -wF". I found that the existing .cfi directives describe registers sharing the same stack addresses (not a good thing).

This patch makes the unwind data make sense and makes gdb/kgdb more likely to produce a useful stack traces.

Jim Houston - Concurrent Computer Corp.

--

arch/x86_64/kernel/entry.S +3 -3
diff -urN -X dontdiff linux-2.6.4-rc2-mm1.orig/arch/x86_64/kernel/entry.S linux-2.6.4-rc2-mm1/arch/x86_64/kernel/entry.S
@@ -402,9 +402,9 @@
 /* 0(%rsp): interrupt number */ 
 	.macro interrupt func
 	CFI_STARTPROC	simple
-	CFI_DEF_CFA	rsp,(SS-ORIG_RAX)
-	CFI_OFFSET	rsp,(RSP-SS)
-	CFI_OFFSET	rip,(RIP-SS)
+	CFI_DEF_CFA	rsp,(SS-RDI)
+	CFI_REL_OFFSET	rsp,(RSP-ORIG_RAX)
+	CFI_REL_OFFSET	rip,(RIP-ORIG_RAX)
 	cld
 #ifdef CONFIG_DEBUG_INFO
 	SAVE_ALL	
include/asm-x86_64/calling.h +15 -15
diff -urN -X dontdiff linux-2.6.4-rc2-mm1.orig/include/asm-x86_64/calling.h linux-2.6.4-rc2-mm1/include/asm-x86_64/calling.h
@@ -35,26 +35,26 @@
 	subq  $9*8+\addskip,%rsp
 	CFI_ADJUST_CFA_OFFSET	9*8+\addskip
 	movq  %rdi,8*8(%rsp) 
-	CFI_OFFSET	rdi,8*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rdi,8*8
 	movq  %rsi,7*8(%rsp) 
-	CFI_OFFSET	rsi,7*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rsi,7*8
 	movq  %rdx,6*8(%rsp)
-	CFI_OFFSET	rdx,6*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rdx,6*8
 	.if \norcx
 	.else
 	movq  %rcx,5*8(%rsp)
-	CFI_OFFSET	rcx,5*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rcx,5*8
 	.endif
 	movq  %rax,4*8(%rsp) 
-	CFI_OFFSET	rax,4*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rax,4*8
 	movq  %r8,3*8(%rsp) 
-	CFI_OFFSET	r8,3*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r8,3*8
 	movq  %r9,2*8(%rsp) 
-	CFI_OFFSET	r9,2*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r9,2*8
 	movq  %r10,1*8(%rsp) 
-	CFI_OFFSET	r10,1*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r10,1*8
 	movq  %r11,(%rsp) 
-	CFI_OFFSET	r11,-(9*8+\addskip)
+	CFI_REL_OFFSET	r11,
 	.endm
 
 #define ARG_SKIP 9*8
@@ -100,17 +100,17 @@
 	subq $REST_SKIP,%rsp
 	CFI_ADJUST_CFA_OFFSET	REST_SKIP
 	movq %rbx,5*8(%rsp) 
-	CFI_OFFSET	rbx,5*8-(REST_SKIP)
+	CFI_REL_OFFSET	rbx,5*8
 	movq %rbp,4*8(%rsp) 
-	CFI_OFFSET	rbp,4*8-(REST_SKIP)
+	CFI_REL_OFFSET	rbp,4*8
 	movq %r12,3*8(%rsp) 
-	CFI_OFFSET	r12,3*8-(REST_SKIP)
+	CFI_REL_OFFSET	r12,3*8
 	movq %r13,2*8(%rsp) 
-	CFI_OFFSET	r13,2*8-(REST_SKIP)
+	CFI_REL_OFFSET	r13,2*8
 	movq %r14,1*8(%rsp) 
-	CFI_OFFSET	r14,1*8-(REST_SKIP)
+	CFI_REL_OFFSET	r14,1*8
 	movq %r15,(%rsp) 
-	CFI_OFFSET	r15,0*8-(REST_SKIP)
+	CFI_REL_OFFSET	r15,0*8
 	.endm		
 
 	.macro RESTORE_REST
#1 lore raw
Quoted 7 lines · On 17 Mar 2004 16:37:15 -0500 Jim Houston <[email protected]> wrote:

Hi Andi, Andrew, Amit,

The attached patch fixes the .cfi directives for the common_interrupt path for opteron. It seems that the existing .cfi directives in this path only work by accident.

Quoted 7 lines

I spent yesterday decoding a stack by hand and looking at the dwarf unwind data using "readelf -wF". I found that the existing .cfi directives describe registers sharing the same stack addresses (not a good thing).

This patch makes the unwind data make sense and makes gdb/kgdb more likely to produce a useful stack traces.

Thanks. I applied it. The calling.h part gave rejects, but I applied it by hand. It would be nice if you could check in the final kernel if I didn't make a mistake.

-Andi

#2 lore raw

On Wed, 2004-03-17 at 18:53, Andi Kleen wrote:
On 17 Mar 2004 16:37:15 -0500

Quoted 5 lines
Quoted 4 lines · Jim Houston

The attached patch fixes the .cfi directives for the common_interrupt path for opteron. It seems that the existing .cfi directives in this path only work by accident.

Quoted 7 lines
Quoted 2 lines

This patch makes the unwind data make sense and makes gdb/kgdb more likely to produce a useful stack traces.

Thanks. I applied it. The calling.h part gave rejects, but I applied it by hand. It would be nice if you could check in the final kernel if I didn't make a mistake.

Hi Andi, Andrew, Amit,

The attached patch is updated to work with linux-2.6.5-rc1.

Jim Houston - Concurrent Computer Corp.

--

arch/x86_64/kernel/entry.S +3 -3
diff -urN linux-2.6.5-rc1-mm2.orig/arch/x86_64/kernel/entry.S linux-2.6.5-rc1-mm2/arch/x86_64/kernel/entry.S
@@ -403,9 +403,9 @@
 /* 0(%rsp): interrupt number */ 
 	.macro interrupt func
 	CFI_STARTPROC	simple
-	CFI_DEF_CFA	rsp,(SS-ORIG_RAX)
-	CFI_OFFSET	rsp,(RSP-SS)
-	CFI_OFFSET	rip,(RIP-SS)
+	CFI_DEF_CFA	rsp,(SS-RDI)
+	CFI_REL_OFFSET	rsp,(RSP-ORIG_RAX)
+	CFI_REL_OFFSET	rip,(RIP-ORIG_RAX)
 	cld
 #ifdef CONFIG_DEBUG_INFO
 	SAVE_ALL	
include/asm-x86_64/calling.h +15 -15
diff -urN linux-2.6.5-rc1-mm2.orig/include/asm-x86_64/calling.h linux-2.6.5-rc1-mm2/include/asm-x86_64/calling.h
@@ -35,28 +35,28 @@
 	subq  $9*8+\addskip,%rsp
 	CFI_ADJUST_CFA_OFFSET	9*8+\addskip
 	movq  %rdi,8*8(%rsp) 
-	CFI_OFFSET	rdi,8*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rdi,8*8
 	movq  %rsi,7*8(%rsp) 
-	CFI_OFFSET	rsi,7*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rsi,7*8
 	movq  %rdx,6*8(%rsp)
-	CFI_OFFSET	rdx,6*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rdx,6*8
 	.if \norcx
 	.else
 	movq  %rcx,5*8(%rsp)
-	CFI_OFFSET	rcx,5*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rcx,5*8
 	.endif
 	movq  %rax,4*8(%rsp) 
-	CFI_OFFSET	rax,4*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rax,4*8
 	.if \nor891011
 	.else
 	movq  %r8,3*8(%rsp) 
-	CFI_OFFSET	r8,3*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r8,3*8
 	movq  %r9,2*8(%rsp) 
-	CFI_OFFSET	r9,2*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r9,2*8
 	movq  %r10,1*8(%rsp) 
-	CFI_OFFSET	r10,1*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r10,1*8
 	movq  %r11,(%rsp) 
-	CFI_OFFSET	r11,-(9*8+\addskip)
+	CFI_REL_OFFSET	r11,
 	.endif
 	.endm
 
@@ -109,17 +109,17 @@
 	subq $REST_SKIP,%rsp
 	CFI_ADJUST_CFA_OFFSET	REST_SKIP
 	movq %rbx,5*8(%rsp) 
-	CFI_OFFSET	rbx,5*8-(REST_SKIP)
+	CFI_REL_OFFSET	rbx,5*8
 	movq %rbp,4*8(%rsp) 
-	CFI_OFFSET	rbp,4*8-(REST_SKIP)
+	CFI_REL_OFFSET	rbp,4*8
 	movq %r12,3*8(%rsp) 
-	CFI_OFFSET	r12,3*8-(REST_SKIP)
+	CFI_REL_OFFSET	r12,3*8
 	movq %r13,2*8(%rsp) 
-	CFI_OFFSET	r13,2*8-(REST_SKIP)
+	CFI_REL_OFFSET	r13,2*8
 	movq %r14,1*8(%rsp) 
-	CFI_OFFSET	r14,1*8-(REST_SKIP)
+	CFI_REL_OFFSET	r14,1*8
 	movq %r15,(%rsp) 
-	CFI_OFFSET	r15,0*8-(REST_SKIP)
+	CFI_REL_OFFSET	r15,0*8
 	.endm		
 
 	.macro RESTORE_REST
#3 lore raw

Thanks. Checked into kgdb.sourceforge.net cvs tree -Amit

Quoted 108 lines · Jim Houston

On Wed, 2004-03-17 at 18:53, Andi Kleen wrote:
On 17 Mar 2004 16:37:15 -0500

Quoted 11 lines
Quoted 6 lines · Jim Houston

The attached patch fixes the .cfi directives for the common_interrupt path for opteron. It seems that the existing .cfi directives in this path only work by accident.

This patch makes the unwind data make sense and makes gdb/kgdb more likely to produce a useful stack traces.

Thanks. I applied it. The calling.h part gave rejects, but I applied it by hand. It would be nice if you could check in the final kernel if I didn't make a mistake.

Hi Andi, Andrew, Amit,

The attached patch is updated to work with linux-2.6.5-rc1.

Jim Houston - Concurrent Computer Corp.

--

diff -urN linux-2.6.5-rc1-mm2.orig/arch/x86_64/kernel/entry.S linux-2.6.5-rc1-mm2/arch/x86_64/kernel/entry.S ---
linux-2.6.5-rc1-mm2.orig/arch/x86_64/kernel/entry.S 2004-03-18
09:37:13.830453136 -0500 +++
linux-2.6.5-rc1-mm2/arch/x86_64/kernel/entry.S 2004-03-18
09:37:29.237110968 -0500 @@ -403,9 +403,9 @@
/* 0(%rsp): interrupt number */

arch/x86_64/kernel/entry.S +3 -3
 	.macro interrupt func
 	CFI_STARTPROC	simple
-	CFI_DEF_CFA	rsp,(SS-ORIG_RAX)
-	CFI_OFFSET	rsp,(RSP-SS)
-	CFI_OFFSET	rip,(RIP-SS)
+	CFI_DEF_CFA	rsp,(SS-RDI)
+	CFI_REL_OFFSET	rsp,(RSP-ORIG_RAX)
+	CFI_REL_OFFSET	rip,(RIP-ORIG_RAX)
 	cld
 #ifdef CONFIG_DEBUG_INFO
 	SAVE_ALL

diff -urN linux-2.6.5-rc1-mm2.orig/include/asm-x86_64/calling.h linux-2.6.5-rc1-mm2/include/asm-x86_64/calling.h ---
linux-2.6.5-rc1-mm2.orig/include/asm-x86_64/calling.h 2004-03-18
09:36:21.635387992 -0500 +++
linux-2.6.5-rc1-mm2/include/asm-x86_64/calling.h 2004-03-18
09:36:05.978768160 -0500 @@ -35,28 +35,28 @@

include/asm-x86_64/calling.h +15 -15
 	subq  $9*8+\addskip,%rsp
 	CFI_ADJUST_CFA_OFFSET	9*8+\addskip
 	movq  %rdi,8*8(%rsp)
-	CFI_OFFSET	rdi,8*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rdi,8*8
 	movq  %rsi,7*8(%rsp)
-	CFI_OFFSET	rsi,7*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rsi,7*8
 	movq  %rdx,6*8(%rsp)
-	CFI_OFFSET	rdx,6*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rdx,6*8
 	.if \norcx
 	.else
 	movq  %rcx,5*8(%rsp)
-	CFI_OFFSET	rcx,5*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rcx,5*8
 	.endif
 	movq  %rax,4*8(%rsp)
-	CFI_OFFSET	rax,4*8-(9*8+\addskip)
+	CFI_REL_OFFSET	rax,4*8
 	.if \nor891011
 	.else
 	movq  %r8,3*8(%rsp)
-	CFI_OFFSET	r8,3*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r8,3*8
 	movq  %r9,2*8(%rsp)
-	CFI_OFFSET	r9,2*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r9,2*8
 	movq  %r10,1*8(%rsp)
-	CFI_OFFSET	r10,1*8-(9*8+\addskip)
+	CFI_REL_OFFSET	r10,1*8
 	movq  %r11,(%rsp)
-	CFI_OFFSET	r11,-(9*8+\addskip)
+	CFI_REL_OFFSET	r11,
 	.endif
 	.endm
@@ -109,17 +109,17 @@
 	subq $REST_SKIP,%rsp
 	CFI_ADJUST_CFA_OFFSET	REST_SKIP
 	movq %rbx,5*8(%rsp)
-	CFI_OFFSET	rbx,5*8-(REST_SKIP)
+	CFI_REL_OFFSET	rbx,5*8
 	movq %rbp,4*8(%rsp)
-	CFI_OFFSET	rbp,4*8-(REST_SKIP)
+	CFI_REL_OFFSET	rbp,4*8
 	movq %r12,3*8(%rsp)
-	CFI_OFFSET	r12,3*8-(REST_SKIP)
+	CFI_REL_OFFSET	r12,3*8
 	movq %r13,2*8(%rsp)
-	CFI_OFFSET	r13,2*8-(REST_SKIP)
+	CFI_REL_OFFSET	r13,2*8
 	movq %r14,1*8(%rsp)
-	CFI_OFFSET	r14,1*8-(REST_SKIP)
+	CFI_REL_OFFSET	r14,1*8
 	movq %r15,(%rsp)
-	CFI_OFFSET	r15,0*8-(REST_SKIP)
+	CFI_REL_OFFSET	r15,0*8
 	.endm
 
 	.macro RESTORE_REST
#4 lore raw
Quoted 1 line · On Fri, 19 Mar 2004 18:47:43 +0530 "Amit S. Kale" <[email protected]>…

Thanks. Checked into kgdb.sourceforge.net cvs tree

It's not very useful because that tree still has the broken "interrupt threads" support.

-Andi

#5 lore raw
Quoted 7 lines · Andi Kleen

On Fri, 19 Mar 2004 18:47:43 +0530

Quoted 1 line · Amit S. Kale

Thanks. Checked into kgdb.sourceforge.net cvs tree

It's not very useful because that tree still has the broken "interrupt threads" support.

Does it show interrupt threads or not?
-Amit

#6 lore raw

PATCH 1/1 Call frame debug info for 2.6 kernel

In reply to Jim Houston

This patch adds call frame debug record generation for entry.S frames. If used with KGDB and gdb 6.0 it allows correct "back trace" (bt) through interrupt, system call and trap frames. Frames that point to user space are tied off, those that point to the kernel unwind to the kernel. It also ties off the initial frame in head.S and the idle process stacks for cpus other than cpu0 (which actually goes back to head.S). The patch adds one (1) instruction to the executable kernel (a few lines to the debug space, however).

The patch requires a gdb that handles CFI expressions, although it takes pains to work around a bug in gdb 6.0's expression analizer (the work around is also compatable with a correctly working expression analizer as can be found in the CVS version of gdb). AFAIK gdb 6.0 is the first gdb to handle CFI expressions so you must use it to make this patch useful.

Use of earlier gdb's with this patch will not be affected (either for good or bad).

Signature · 3 lines
George Anzinger   [email protected]
High-res-timers:  http://sourceforge.net/projects/high-res-timers/
Preemption patch: http://www.kernel.org/pub/linux/kernel/people/rml