This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Correct irix5-nat.c's fetch_core_registers (take 2)


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  <roger@eyesopen.com>
	    Daniel Jacobowitz  <dan@codesourcery.com>

	* 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
--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]