From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7715 invoked by alias); 15 May 2003 19:30:43 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 7486 invoked from network); 15 May 2003 19:30:36 -0000 Received: from unknown (HELO hub.ott.qnx.com) (209.226.137.76) by sources.redhat.com with SMTP; 15 May 2003 19:30:36 -0000 Received: from smtp.ott.qnx.com (smtp.ott.qnx.com [10.0.2.158]) by hub.ott.qnx.com (8.9.3p2/8.9.3) with ESMTP id PAA05411 for ; Thu, 15 May 2003 15:27:02 -0400 Received: from catdog ([10.4.2.2]) by smtp.ott.qnx.com (8.8.8/8.6.12) with SMTP id PAA07423 for ; Thu, 15 May 2003 15:30:36 -0400 Message-ID: <045401c31b18$7ebac400$0202040a@catdog> From: "Kris Warkentin" To: "Gdb-Patches@Sources.Redhat.Com" Subject: [BFD PATCH] Fix QNX Neutrino core file reading Date: Thu, 15 May 2003 19:30:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 X-SW-Source: 2003-05/txt/msg00250.txt.bz2 I finally figured out why our core files weren't showing which thread was active when it was generated. It seems we weren't setting lwpid correctly and were not making the .reg section at the correct time. Okay to apply? cheers, Kris Changelog: * elf.c (elfcore_grok_nto_status): Only set lwpid for the active or signalled thread. (elfcore_grok_nto_gregs): Only make .reg section for the active thread. Index: elf.c =================================================================== RCS file: /cvs/src/src/bfd/elf.c,v retrieving revision 1.184 diff -u -r1.184 elf.c --- elf.c 9 May 2003 10:58:12 -0000 1.184 +++ elf.c 15 May 2003 19:27:31 -0000 @@ -7001,18 +7001,30 @@ char buf[100]; char *name; asection *sect; + short sig; + unsigned flags; /* nto_procfs_status 'pid' field is at offset 0. */ elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, (bfd_byte *) ddata); - /* nto_procfs_status 'tid' field is at offset 4. */ - elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4); + /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */ + *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4); - /* nto_procfs_status 'what' field is at offset 14. */ - elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, (bfd_byte *) ddata + 14); + /* nto_procfs_status 'flags' field is at offset 8. */ + flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8); - /* Pass tid back. */ - *tid = elf_tdata (abfd)->core_lwpid; + /* nto_procfs_status 'what' field is at offset 14. */ + if( (sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0 ){ + elf_tdata (abfd)->core_signal = sig; + elf_tdata (abfd)->core_lwpid = *tid; + } + + /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores + do not come from signals so we make sure we set the current + thread just in case. */ + if (flags & 0x00000080){ + elf_tdata (abfd)->core_lwpid = *tid; + } /* Make a ".qnx_core_status/%d" section. */ sprintf (buf, ".qnx_core_status/%d", *tid); @@ -7022,8 +7034,7 @@ return FALSE; strcpy (name, buf); - sect = bfd_make_section (abfd, name); - if (sect == NULL) + if ( (sect = bfd_make_section (abfd, name)) == NULL ) return FALSE; sect->_raw_size = note->descsz; @@ -7061,7 +7072,12 @@ sect->flags = SEC_HAS_CONTENTS; sect->alignment_power = 2; - return elfcore_maybe_make_sect (abfd, ".reg", sect); + /* This is the current thread. */ + if (elf_tdata (abfd)->core_lwpid == tid){ + return elfcore_maybe_make_sect (abfd, ".reg", sect); + } + + return TRUE; } #define BFD_QNT_CORE_INFO 7