From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26162 invoked by alias); 25 Jul 2006 16:31:13 -0000 Received: (qmail 26154 invoked by uid 22791); 25 Jul 2006 16:31:12 -0000 X-Spam-Check-By: sourceware.org Received: from eyesopen.com (HELO www.eyesopen.com) (208.41.78.163) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 25 Jul 2006 16:31:08 +0000 Received: from localhost (roger@localhost) by www.eyesopen.com (8.11.6/8.11.6) with ESMTP id k6PFxcd13257; Tue, 25 Jul 2006 09:59:38 -0600 Date: Tue, 25 Jul 2006 16:31:00 -0000 From: Roger Sayle To: Daniel Jacobowitz cc: gdb-patches@sourceware.org Subject: [PATCH] Correct irix5-nat.c's fetch_core_registers (take 2) In-Reply-To: <20060724214557.GA18918@nevyn.them.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-07/txt/msg00387.txt.bz2 On Mon, 24 Jul 2006, Daniel Jacobowitz wrote: > If the core register set size matches the ISA register size, just read > them in. It should match. You can check and warn if they don't. > IOW I think the entire else branch is dead; it reads in four bytes of > N32 64-bit registers. Not very useful! Try as I might, even resurecting a long dead SGI O2 and trying to use the command "set mips saved-gpreg-size 32" to spoof the mips_isa_regsize I couldn't get the else branch to trigger, so I think you're right that this code is long dead. Well, that greatly simplifies things! The patch below follows your suggestions and should additionally fix O32. The following revised patch has been tested by building mainline gdb on mips-sgi-irix6.5. Unfortunately, as explained in my original post, loading shared libraries on IRIX is broken, but an earlier version of this patch cured to "wrong size gregset" errors when applied to older versions of GDB. Thanks again for your help. 2006-07-25 Roger Sayle Daniel Jacobowitz * irix5-nat.c (fetch_core_registers): Simplify and correct logic. Index: irix5-nat.c =================================================================== RCS file: /cvs/src/src/gdb/irix5-nat.c,v retrieving revision 1.40 diff -c -3 -p -r1.40 irix5-nat.c *** irix5-nat.c 17 Dec 2005 22:34:01 -0000 1.40 --- irix5-nat.c 25 Jul 2006 05:52:11 -0000 *************** *** 1,7 **** /* Native support for the SGI Iris running IRIX version 5, for GDB. Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, ! 1998, 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc. Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin. --- 1,7 ---- /* Native support for the SGI Iris running IRIX version 5, for GDB. Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, ! 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free Software Foundation, Inc. Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin. *************** fetch_core_registers (char *core_reg_sec *** 242,280 **** int which, CORE_ADDR reg_addr) { char *srcp = core_reg_sect; int regno; ! if (core_reg_size == deprecated_register_bytes ()) ! { ! for (regno = 0; regno < NUM_REGS; regno++) ! { ! regcache_raw_write (current_regcache, regno, srcp); ! srcp += register_size (current_gdbarch, regno); ! } ! } ! else if (mips_isa_regsize (current_gdbarch) == 4 && ! core_reg_size == (2 * mips_isa_regsize (current_gdbarch)) * NUM_REGS) ! { ! /* This is a core file from a N32 executable, 64 bits are saved ! for all registers. */ ! for (regno = 0; regno < NUM_REGS; regno++) ! { ! if (regno >= FP0_REGNUM && regno < (FP0_REGNUM + 32)) ! { ! regcache_raw_write (current_regcache, regno, srcp); ! } ! else ! { ! regcache_raw_write (current_regcache, regno, srcp + 4); ! } ! srcp += 8; ! } ! } ! else { warning (_("wrong size gregset struct in core file")); return; } } /* Register that we are able to handle irix5 core file formats. --- 242,263 ---- int which, CORE_ADDR reg_addr) { char *srcp = core_reg_sect; + int regsize = mips_isa_regsize (current_gdbarch); int regno; ! /* If regsize is 8, this is a N32 or N64 core file. ! If regsize is 4, this is an O32 core file. */ ! if (core_reg_size != regsize * NUM_REGS) { warning (_("wrong size gregset struct in core file")); return; } + + for (regno = 0; regno < NUM_REGS; regno++) + { + regcache_raw_write (current_regcache, regno, srcp); + srcp += regsize; + } } /* Register that we are able to handle irix5 core file formats. Roger --