From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23898 invoked by alias); 6 Jul 2010 20:48:57 -0000 Received: (qmail 23885 invoked by uid 22791); 6 Jul 2010 20:48:55 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00,MSGID_FROM_MTA_HEADER,TW_EG,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mtagate3.de.ibm.com (HELO mtagate3.de.ibm.com) (195.212.17.163) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 06 Jul 2010 20:48:49 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate3.de.ibm.com (8.13.1/8.13.1) with ESMTP id o66KmkBG004855 for ; Tue, 6 Jul 2010 20:48:46 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o66Kmkdu1327156 for ; Tue, 6 Jul 2010 22:48:46 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id o66KmjO7002323 for ; Tue, 6 Jul 2010 22:48:46 +0200 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id o66Kmixd002309; Tue, 6 Jul 2010 22:48:44 +0200 Message-Id: <201007062048.o66Kmixd002309@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Tue, 06 Jul 2010 22:48:44 +0200 Subject: Re: support biarch gcore? To: mark.kettenis@xs4all.nl (Mark Kettenis) Date: Tue, 06 Jul 2010 20:48:00 -0000 From: "Ulrich Weigand" Cc: jan.kratochvil@redhat.com, Jon.Zhou@jdsu.com, gdb@sourceware.org In-Reply-To: <201007051154.o65BskRG028816@glazunov.sibelius.xs4all.nl> from "Mark Kettenis" at Jul 05, 2010 01:54:46 PM MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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: 2010-07/txt/msg00018.txt.bz2 Mark Kettenis wrote: > Fixing the code in linux-nat.c is a bit nasty: > > * The definition of the 32-bit version of gdb_gregset_t isn't readily > available on 64-bit systems. > > * The code is used on all Linux platforms and only a few of them are > bi-arch. This was really supposed to be fixed by the gdbarch_core_regset_sections mechanism, which provides the names and sizes of all register sets expected in a core file for the current architecture. However, it seems that this mechanism isn't currently used for .reg itself, only for the other sections. While it is true that .reg needs to be handled somewhat specially, it should still be possible to get its size from gdbarch_core_regset_sections, and thus avoid the need to use the gdb_gregset_t type. Unfortunately, it also turned out that the section sizes provided for .reg in those targets that have gdbarch_core_regset_sections, while currently unused, were also nearly all wrong ... The following patch fixes those sizes, and changes linux-nat.c to use them. Tested on powerpc64-linux (-m64 / -m32), amd64-linux (-m64 / -m32), and i386-linux with no regressions. In fact, it appears to fix all pre-existing gcore-related failures on amd64 -m32 ... Thoughts? Bye, Ulrich ChangeLog: * linux-nat.c (linux_nat_do_thread_registers): Use section size from gdbarch_core_regset_sections also for .reg if present. * amd64-linux-tdep.c (amd64_linux_regset_sections): Fix incorrect section size for .reg. * ppc-linux-tdep.c (ppc_linux_vsx_regset_sections): Likewise. (ppc_linux_vmx_regset_sections): Likewise. (ppc_linux_fp_regset_sections): Likewise. (ppc64_linux_vsx_regset_sections): New variable. (ppc64_linux_vmx_regset_sections): Likewise. (ppc64_linux_fp_regset_sections): Likewise. (ppc_linux_init_abi): Install core_regset_section lists appropriate for current word size. Index: gdb/amd64-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/amd64-linux-tdep.c,v retrieving revision 1.37 diff -u -p -r1.37 amd64-linux-tdep.c --- gdb/amd64-linux-tdep.c 22 Apr 2010 20:02:55 -0000 1.37 +++ gdb/amd64-linux-tdep.c 6 Jul 2010 20:24:45 -0000 @@ -52,7 +52,7 @@ /* Supported register note sections. */ static struct core_regset_section amd64_linux_regset_sections[] = { - { ".reg", 144, "general-purpose" }, + { ".reg", 27 * 8, "general-purpose" }, { ".reg2", 512, "floating-point" }, { ".reg-xstate", I386_XSTATE_MAX_SIZE, "XSAVE extended state" }, { NULL, 0 } Index: gdb/linux-nat.c =================================================================== RCS file: /cvs/src/src/gdb/linux-nat.c,v retrieving revision 1.172 diff -u -p -r1.172 linux-nat.c --- gdb/linux-nat.c 1 Jul 2010 15:36:16 -0000 1.172 +++ gdb/linux-nat.c 6 Jul 2010 20:24:46 -0000 @@ -4134,8 +4134,6 @@ linux_nat_do_thread_registers (bfd *obfd char *note_data, int *note_size, enum target_signal stop_signal) { - gdb_gregset_t gregs; - gdb_fpregset_t fpregs; unsigned long lwp = ptid_get_lwp (ptid); struct gdbarch *gdbarch = target_gdbarch; struct regcache *regcache = get_thread_arch_regcache (ptid, gdbarch); @@ -4153,21 +4151,6 @@ linux_nat_do_thread_registers (bfd *obfd core_regset_p = gdbarch_regset_from_core_section_p (gdbarch); sect_list = gdbarch_core_regset_sections (gdbarch); - if (core_regset_p - && (regset = gdbarch_regset_from_core_section (gdbarch, ".reg", - sizeof (gregs))) != NULL - && regset->collect_regset != NULL) - regset->collect_regset (regset, regcache, -1, - &gregs, sizeof (gregs)); - else - fill_gregset (regcache, &gregs, -1); - - note_data = (char *) elfcore_write_prstatus (obfd, - note_data, - note_size, - lwp, - stop_signal, &gregs); - /* The loop below uses the new struct core_regset_section, which stores the supported section names and sizes for the core file. Note that note PRSTATUS needs to be treated specially. But the other notes are @@ -4175,12 +4158,6 @@ linux_nat_do_thread_registers (bfd *obfd if (core_regset_p && sect_list != NULL) while (sect_list->sect_name != NULL) { - /* .reg was already handled above. */ - if (strcmp (sect_list->sect_name, ".reg") == 0) - { - sect_list++; - continue; - } regset = gdbarch_regset_from_core_section (gdbarch, sect_list->sect_name, sect_list->size); @@ -4188,12 +4165,16 @@ linux_nat_do_thread_registers (bfd *obfd gdb_regset = xmalloc (sect_list->size); regset->collect_regset (regset, regcache, -1, gdb_regset, sect_list->size); - note_data = (char *) elfcore_write_register_note (obfd, - note_data, - note_size, - sect_list->sect_name, - gdb_regset, - sect_list->size); + + if (strcmp (sect_list->sect_name, ".reg") == 0) + note_data = (char *) elfcore_write_prstatus + (obfd, note_data, note_size, + lwp, stop_signal, gdb_regset); + else + note_data = (char *) elfcore_write_register_note + (obfd, note_data, note_size, + sect_list->sect_name, gdb_regset, + sect_list->size); xfree (gdb_regset); sect_list++; } @@ -4203,6 +4184,24 @@ linux_nat_do_thread_registers (bfd *obfd the new support, the code below should be deleted. */ else { + gdb_gregset_t gregs; + gdb_fpregset_t fpregs; + + if (core_regset_p + && (regset = gdbarch_regset_from_core_section (gdbarch, ".reg", + sizeof (gregs))) != NULL + && regset->collect_regset != NULL) + regset->collect_regset (regset, regcache, -1, + &gregs, sizeof (gregs)); + else + fill_gregset (regcache, &gregs, -1); + + note_data = (char *) elfcore_write_prstatus (obfd, + note_data, + note_size, + lwp, + stop_signal, &gregs); + if (core_regset_p && (regset = gdbarch_regset_from_core_section (gdbarch, ".reg2", sizeof (fpregs))) != NULL Index: gdb/ppc-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ppc-linux-tdep.c,v retrieving revision 1.121 diff -u -p -r1.121 ppc-linux-tdep.c --- gdb/ppc-linux-tdep.c 15 Apr 2010 20:19:24 -0000 1.121 +++ gdb/ppc-linux-tdep.c 6 Jul 2010 20:24:46 -0000 @@ -516,7 +516,7 @@ ppc64_standard_linkage1_target (struct f static struct core_regset_section ppc_linux_vsx_regset_sections[] = { - { ".reg", 268, "general-purpose" }, + { ".reg", 48 * 4, "general-purpose" }, { ".reg2", 264, "floating-point" }, { ".reg-ppc-vmx", 544, "ppc Altivec" }, { ".reg-ppc-vsx", 256, "POWER7 VSX" }, @@ -525,7 +525,7 @@ static struct core_regset_section ppc_li static struct core_regset_section ppc_linux_vmx_regset_sections[] = { - { ".reg", 268, "general-purpose" }, + { ".reg", 48 * 4, "general-purpose" }, { ".reg2", 264, "floating-point" }, { ".reg-ppc-vmx", 544, "ppc Altivec" }, { NULL, 0} @@ -533,7 +533,31 @@ static struct core_regset_section ppc_li static struct core_regset_section ppc_linux_fp_regset_sections[] = { - { ".reg", 268, "general-purpose" }, + { ".reg", 48 * 4, "general-purpose" }, + { ".reg2", 264, "floating-point" }, + { NULL, 0} +}; + +static struct core_regset_section ppc64_linux_vsx_regset_sections[] = +{ + { ".reg", 48 * 8, "general-purpose" }, + { ".reg2", 264, "floating-point" }, + { ".reg-ppc-vmx", 544, "ppc Altivec" }, + { ".reg-ppc-vsx", 256, "POWER7 VSX" }, + { NULL, 0} +}; + +static struct core_regset_section ppc64_linux_vmx_regset_sections[] = +{ + { ".reg", 48 * 8, "general-purpose" }, + { ".reg2", 264, "floating-point" }, + { ".reg-ppc-vmx", 544, "ppc Altivec" }, + { NULL, 0} +}; + +static struct core_regset_section ppc64_linux_fp_regset_sections[] = +{ + { ".reg", 48 * 8, "general-purpose" }, { ".reg2", 264, "floating-point" }, { NULL, 0} }; @@ -1507,6 +1531,19 @@ ppc_linux_init_abi (struct gdbarch_info set_gdbarch_gcore_bfd_target (gdbarch, "elf32-powerpcle"); else set_gdbarch_gcore_bfd_target (gdbarch, "elf32-powerpc"); + + /* Supported register sections. */ + if (tdesc_find_feature (info.target_desc, + "org.gnu.gdb.power.vsx")) + set_gdbarch_core_regset_sections (gdbarch, + ppc_linux_vsx_regset_sections); + else if (tdesc_find_feature (info.target_desc, + "org.gnu.gdb.power.altivec")) + set_gdbarch_core_regset_sections (gdbarch, + ppc_linux_vmx_regset_sections); + else + set_gdbarch_core_regset_sections (gdbarch, + ppc_linux_fp_regset_sections); } if (tdep->wordsize == 8) @@ -1533,20 +1570,23 @@ ppc_linux_init_abi (struct gdbarch_info set_gdbarch_gcore_bfd_target (gdbarch, "elf64-powerpcle"); else set_gdbarch_gcore_bfd_target (gdbarch, "elf64-powerpc"); + + /* Supported register sections. */ + if (tdesc_find_feature (info.target_desc, + "org.gnu.gdb.power.vsx")) + set_gdbarch_core_regset_sections (gdbarch, + ppc64_linux_vsx_regset_sections); + else if (tdesc_find_feature (info.target_desc, + "org.gnu.gdb.power.altivec")) + set_gdbarch_core_regset_sections (gdbarch, + ppc64_linux_vmx_regset_sections); + else + set_gdbarch_core_regset_sections (gdbarch, + ppc64_linux_fp_regset_sections); } set_gdbarch_regset_from_core_section (gdbarch, ppc_linux_regset_from_core_section); set_gdbarch_core_read_description (gdbarch, ppc_linux_core_read_description); - /* Supported register sections. */ - if (tdesc_find_feature (info.target_desc, - "org.gnu.gdb.power.vsx")) - set_gdbarch_core_regset_sections (gdbarch, ppc_linux_vsx_regset_sections); - else if (tdesc_find_feature (info.target_desc, - "org.gnu.gdb.power.altivec")) - set_gdbarch_core_regset_sections (gdbarch, ppc_linux_vmx_regset_sections); - else - set_gdbarch_core_regset_sections (gdbarch, ppc_linux_fp_regset_sections); - /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com