From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12521 invoked by alias); 28 Jun 2011 14:58:52 -0000 Received: (qmail 12511 invoked by uid 22791); 28 Jun 2011 14:58:51 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-vw0-f41.google.com (HELO mail-vw0-f41.google.com) (209.85.212.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 28 Jun 2011 14:58:27 +0000 Received: by vws4 with SMTP id 4so279383vws.0 for ; Tue, 28 Jun 2011 07:58:26 -0700 (PDT) MIME-Version: 1.0 Received: by 10.52.180.133 with SMTP id do5mr1586884vdc.307.1309272851408; Tue, 28 Jun 2011 07:54:11 -0700 (PDT) Received: by 10.220.32.5 with HTTP; Tue, 28 Jun 2011 07:54:11 -0700 (PDT) In-Reply-To: References: <20110627125306.GA30646@doriath.ww600.siemens.net> <20110627132735.GE16103@n2100.arm.linux.org.uk> <4E088DE1.2060809@gmail.com> <4E089AB3.1090801@codesourcery.com> <20110628103946.GC21898@n2100.arm.linux.org.uk> <20110628142045.GC7255@1n450.cable.virginmedia.net> <20110628143014.GD7255@1n450.cable.virginmedia.net> Date: Tue, 28 Jun 2011 14:58:00 -0000 Message-ID: Subject: Re: Problem with GDB when debugging IRQ handlers From: Dmitry Eremin-Solenikov To: Catalin Marinas Cc: Russell King - ARM Linux , Yao Qi , Eric Miao , linux-arm-kernel@lists.infradead.org, gdb@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2011-06/txt/msg00162.txt.bz2 On 6/28/11, Dmitry Eremin-Solenikov wrote: > On 6/28/11, Catalin Marinas wrote: >> On Tue, Jun 28, 2011 at 03:20:45PM +0100, Catalin Marinas wrote: >>> On Tue, Jun 28, 2011 at 04:06:11PM +0400, Dmitry Eremin-Solenikov wrote: >>> > On 6/28/11, Russell King - ARM Linux wrote: >>> > I did some checks. It seems, the problem isn't related to unwinder. At >>> > least >>> > it looks like kernel has all necessary unwinding subops. It looks like >>> > the >>> > problem is really related to the lack of necessary .cfi information. >>> > At >>> > least >>> > when i added .cfi_startproc/.cfi_endproc annotations to entry-armv.S >>> > code, >>> > gdb stopped decoding backtrace with the "previous frame identical to >>> > this frame" >>> > error. Unfortunately I don't have enough knowledge to add .cfi >>> > annotations to >>> > irq handlers. >>> >>> I think it may have stopped decoding because of some information it >>> reads from the stack doesn't look sane. But I wonder whether we could >>> get it looping again depending on the register values in the interrupted >>> context. >>> >>> > diff --git a/arch/arm/kernel/entry-armv.S >>> > b/arch/arm/kernel/entry-armv.S >>> > index e8d8856..d77f9d7 100644 >>> > --- a/arch/arm/kernel/entry-armv.S >>> > +++ b/arch/arm/kernel/entry-armv.S >>> > @@ -28,6 +28,7 @@ >>> > #include "entry-header.S" >>> > #include >>> > >>> > + .cfi_sections .debug_frame >>> > /* >>> > * Interrupt handling. Preserves r7, r8, r9 >>> > */ >>> > @@ -113,6 +114,7 @@ ENDPROC(__und_invalid) >>> > >>> > .macro svc_entry, stack_hole=0 >>> > UNWIND(.fnstart ) >>> > + .cfi_startproc >>> > UNWIND(.save {r0 - pc} ) >>> > sub sp, sp, #(S_FRAME_SIZE + \stack_hole - 4) >>> >>> Could you add some directives like below in the svc_entry macro (after >>> "sub sp...", not sure if it matters) and check whether gdb behaves >>> better: >>> >>> .cfi_def_cfa_offset S_PC >>> .cfi_offset 14, -4 >> >> Actually since the return address is in S_PC (which maybe gdb assumes it >> would be the saved LR), this is probably not be correct. After SVC >> entry, we have he following structure on the stack: >> >> ORIG_r0 >> CPSR >> <--- assuming this is the Call Frame Address (SP+S_PC+4) >> PC <--- CFA - 4 >> LR <--- don't care >> SP <--- CFA - 12 >> ... >> >> >> So we tell gdb about this with something like below (untested): >> >> .cfi_def_cfa_offset S_PC + 4 >> .cfi_offset 14, -4 >> .cfi_offset 13, -12 > > This brings "unknown CFA rule" gdb exception, but it seems I got your idea. No, this seems to work, it was my fault. I got more or less reasonable backtrace now. -- With best wishes Dmitry