Fixes for .cfi directives for x86_64 kgdb
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
@@ -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
@@ -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
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_interruptpath 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
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_interruptpath 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.hpart 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
@@ -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
@@ -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
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 -0500Quoted 11 lines
Quoted 6 lines · Jim Houston
The attached patch fixes the .cfi directives for the
common_interruptpath 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.hpart 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.Slinux-2.6.5-rc1-mm2/arch/x86_64/kernel/entry.S---linux-2.6.5-rc1-mm2.orig/arch/x86_64/kernel/entry.S2004-03-18
09:37:13.830453136 -0500 +++linux-2.6.5-rc1-mm2/arch/x86_64/kernel/entry.S2004-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_ALLdiff -urN
linux-2.6.5-rc1-mm2.orig/include/asm-x86_64/calling.hlinux-2.6.5-rc1-mm2/include/asm-x86_64/calling.h---linux-2.6.5-rc1-mm2.orig/include/asm-x86_64/calling.h2004-03-18
09:36:21.635387992 -0500 +++linux-2.6.5-rc1-mm2/include/asm-x86_64/calling.h2004-03-18
09:36:05.978768160 -0500 @@ -35,28 +35,28 @@include/asm-x86_64/calling.h +15
-15subq $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
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
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
PATCH 1/1 Call frame debug info for 2.6 kernel
In reply to Jim HoustonThis 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