[PATCH] Fix FreeBSD/sparc64 build mess

Mark Kettenis kettenis@chello.nl
Fri Aug 22 18:54:00 GMT 2003


D'oh, I really messed this up.  Thought my local working directory was
in sync with the machine where I tested things.  Turned out this
wasn't quite the case.

The attached patch fixes the problems, and gets things working again.
Checked in.

Mark

Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>
 
	* sparc64-tdep.h (sparc64_regnum): Fix comment.
	(sparc64_supply_rwindow, sparc64_fill_rwindow): Remove prototypes.
	(sparc_supply_rwindow, sparc_fill_rwindow): New prototypes.
	* sparc64-tdep.c (sparc64_pseudo_register_read): Add missing
	`case' keyword.
	(sparc64_register_info): Give the reister with number
	SPARC64_STATE_REGNUM a name.
	(sparc64_pseudo_register_write): Add support for %cwp, %pstate,
	%asi and %ccr.
	(sparc64_push_dummy_call): Take BIAS into account when checking
	stcak alignment.
	(sparc_software_single_step): Remove assertions that check whether
	NPC and NNPC were zero.
	(sparc_supply_rwindow): Make public.  Merge functionality with
	sparc64_supply_rwindow.
	(sparc_fill_rwindow): Make public.  Merge functionality with
	sparc64_fill_rwindow.
	(sparc64_supply_rwindow, sparc64_fill_rwindow): Remove.
	* sparc64fbsd-nat.c (_initialize_sparc64fbsd_nat): Set
	SPARCBSD_FPREG_SUPPLIES_P to sparc64fbsd_fpreg_supplies_p.
	* sparc64fbsd-tdep.c (sparc64fbsd_supply_reg): Call
	sparc_supply_rwindow instead of sparc64_supply_rwindow.

 
Index: sparc64-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sparc64-tdep.c,v
retrieving revision 1.1
diff -u -p -r1.1 sparc64-tdep.c
--- sparc64-tdep.c 21 Aug 2003 20:38:46 -0000 1.1
+++ sparc64-tdep.c 22 Aug 2003 18:47:53 -0000
@@ -271,7 +271,8 @@ static struct sparc64_register_info spar
   
   /* This raw register contains the contents of %cwp, %pstate, %asi
      and %ccr as laid out in a %tstate register.  */
-  { NULL, &builtin_type_int64 },
+  /* FIXME: Give it a name until we start using register groups.  */
+  { "state", &builtin_type_int64 },
 
   { "fsr", &builtin_type_int64 },
   { "fprs", &builtin_type_int64 },
@@ -422,16 +423,16 @@ sparc64_pseudo_register_read (struct gdb
       regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
       switch (regnum)
 	{
-	SPARC64_CWP_REGNUM:
+	case SPARC64_CWP_REGNUM:
 	  state = (state >> 0) & ((1 << 5) - 1);
 	  break;
-	SPARC64_PSTATE_REGNUM:
+	case SPARC64_PSTATE_REGNUM:
 	  state = (state >> 8) & ((1 << 12) - 1);
 	  break;
-	SPARC64_ASI_REGNUM:
+	case SPARC64_ASI_REGNUM:
 	  state = (state >> 24) & ((1 << 8) - 1);
 	  break;
-	SPARC64_CCR_REGNUM:
+	case SPARC64_CCR_REGNUM:
 	  state = (state >> 32) & ((1 << 8) - 1);
 	  break;
 	}
@@ -471,6 +472,32 @@ sparc64_pseudo_register_write (struct gd
       regcache_raw_write (regcache, regnum, buf);
       regcache_raw_write (regcache, regnum + 1, ((const char *)buf) + 8);
     }
+  else if (regnum == SPARC64_CWP_REGNUM
+	   || regnum == SPARC64_PSTATE_REGNUM
+	   || regnum == SPARC64_ASI_REGNUM
+	   || regnum == SPARC64_CCR_REGNUM)
+    {
+      ULONGEST state, bits;
+
+      regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
+      bits = extract_unsigned_integer (buf, 8);
+      switch (regnum)
+	{
+	case SPARC64_CWP_REGNUM:
+	  state |= ((bits & ((1 << 5) - 1)) << 0);
+	  break;
+	case SPARC64_PSTATE_REGNUM:
+	  state |= ((bits & ((1 << 12) - 1)) << 8);
+	  break;
+	case SPARC64_ASI_REGNUM:
+	  state |= ((bits & ((1 << 8) - 1)) << 24);
+	  break;
+	case SPARC64_CCR_REGNUM:
+	  state |= ((bits & ((1 << 8) - 1)) << 32);
+	  break;
+	}
+      regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
+    }
 }
 
 /* Use the program counter to determine the contents and size of a
@@ -1071,7 +1098,7 @@ sparc64_push_dummy_call (struct gdbarch 
   sp -= 16 * 8;
 
   /* Stack should be 16-byte aligned at this point.  */
-  gdb_assert (sp % 16 == 0);
+  gdb_assert ((sp + BIAS) % 16 == 0);
 
   /* Finally, update the stack pointer.  */
   regcache_cooked_write_unsigned (regcache, SPARC_SP_REGNUM, sp);
@@ -1273,9 +1300,6 @@ sparc_software_single_step (enum target_
     {
       CORE_ADDR pc;
 
-      gdb_assert (npc == 0);
-      gdb_assert (nnpc == 0);
-
       pc = sparc_address_from_register (SPARC64_PC_REGNUM);
       npc = sparc_address_from_register (SPARC64_NPC_REGNUM);
 
@@ -1375,40 +1399,15 @@ sparc64_gdbarch_init (struct gdbarch_inf
 
 /* Helper functions for dealing with register windows.  */
 
-static void
+void
 sparc_supply_rwindow (CORE_ADDR sp, int regnum)
 {
   int offset = 0;
   char buf[8];
   int i;
 
-  /* Clear out the top half of the temporary buffer, and put the
-     register value in the bottom half if we're in 64-bit mode.  */
-  if (gdbarch_ptr_bit (current_gdbarch) == 64)
-    {
-      memset (buf, 0, 4);
-      offset = 4;
-    }
-
-  for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
-    {
-      if (regnum == i || regnum == -1)
-	{
-	  target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
-			      buf + offset, 4);
-	  supply_register (i, buf);
-	}
-    }
-}
-
-void
-sparc64_supply_rwindow (CORE_ADDR sp, int regnum)
-{
   if (sp & 1)
     {
-      char buf[8];
-      int i;
-
       /* Registers are 64-bit.  */
       sp += BIAS;
 
@@ -1416,8 +1415,7 @@ sparc64_supply_rwindow (CORE_ADDR sp, in
 	{
 	  if (regnum == i || regnum == -1)
 	    {
-	      target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 8),
-				  buf, sizeof (buf));
+	      target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
 	      supply_register (i, buf);
 	    }
 	}
@@ -1426,39 +1424,37 @@ sparc64_supply_rwindow (CORE_ADDR sp, in
     {
       /* Registers are 32-bit.  Toss any sign-extension of the stack
 	 pointer.  */
-      sparc_supply_rwindow (sp & 0xffffffffUL, regnum);
-    }
-}
-
-static void
-sparc_fill_rwindow (CORE_ADDR sp, int regnum)
-{
-  int offset = 0;
-  char buf[8];
-  int i;
+      sp &= 0xffffffffUL;
 
-  /* Only use the bottom half if we're in 64-bit mode.  */
-  if (gdbarch_ptr_bit (current_gdbarch) == 64)
-    offset = 4;
+      /* Clear out the top half of the temporary buffer, and put the
+	 register value in the bottom half if we're in 64-bit mode.  */
+      if (gdbarch_ptr_bit (current_gdbarch) == 64)
+	{
+	  memset (buf, 0, 4);
+	  offset = 4;
+	}
 
-  for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
-    {
-      if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
+      for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
 	{
-	  regcache_collect (i, buf);
-	  target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 4), buf, 4);
+	  if (regnum == i || regnum == -1)
+	    {
+	      target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
+				  buf + offset, 4);
+	      supply_register (i, buf);
+	    }
 	}
     }
 }
 
 void
-sparc64_fill_rwindow (CORE_ADDR sp, int regnum)
+sparc_fill_rwindow (CORE_ADDR sp, int regnum)
 {
+  int offset = 0;
+  char buf[8];
+  int i;
+
   if (sp & 1)
     {
-      char buf[8];
-      int i;
-
       /* Registers are 64-bit.  */
       sp += BIAS;
 
@@ -1467,8 +1463,7 @@ sparc64_fill_rwindow (CORE_ADDR sp, int 
 	  if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
 	    {
 	      regcache_collect (i, buf);
-	      target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 8),
-				   buf, sizeof (buf));
+	      target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
 	    }
 	}
     }
@@ -1476,7 +1471,21 @@ sparc64_fill_rwindow (CORE_ADDR sp, int 
     {
       /* Registers are 32-bit.  Toss any sign-extension of the stack
 	 pointer.  */
-      sparc_fill_rwindow (sp & 0xffffffffUL, regnum);
+      sp &= 0xffffffffUL;
+
+      /* Only use the bottom half if we're in 64-bit mode.  */
+      if (gdbarch_ptr_bit (current_gdbarch) == 64)
+	offset = 4;
+
+      for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
+	{
+	  if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
+	    {
+	      regcache_collect (i, buf);
+	      target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
+				   buf + offset, 4);
+	    }
+	}
     }
 }
 
Index: sparc64-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/sparc64-tdep.h,v
retrieving revision 1.1
diff -u -p -r1.1 sparc64-tdep.h
--- sparc64-tdep.h 21 Aug 2003 20:38:46 -0000 1.1
+++ sparc64-tdep.h 22 Aug 2003 18:47:53 -0000
@@ -81,7 +81,7 @@ enum sparc64_regnum
   SPARC64_D0_REGNUM,		/* %d0 */
   SPARC64_D10_REGNUM = SPARC64_D0_REGNUM + 5, /* %d10 */
   SPARC64_D30_REGNUM = SPARC64_D0_REGNUM + 15, /* %d30 */
-  SPARC64_D32_REGNUM = SPARC64_D0_REGNUM + 16, /* %d30 */
+  SPARC64_D32_REGNUM = SPARC64_D0_REGNUM + 16, /* %d32 */
   SPARC64_D62_REGNUM = SPARC64_D0_REGNUM + 31, /* %d62 */
   SPARC64_Q0_REGNUM,		/* %q0 */
   SPARC64_Q8_REGNUM = SPARC64_Q0_REGNUM + 2, /* %q8 */
@@ -90,8 +90,8 @@ enum sparc64_regnum
   SPARC64_Q60_REGNUM = SPARC64_Q0_REGNUM + 15 /* %q60 */
 };
 
-extern void sparc64_supply_rwindow (CORE_ADDR sp, int regnum);
-extern void sparc64_fill_rwindow (CORE_ADDR sp, int regnum);
+extern void sparc_supply_rwindow (CORE_ADDR sp, int regnum);
+extern void sparc_fill_rwindow (CORE_ADDR sp, int regnum);
 
 /* Functions exported from sparc64fbsd-tdep.c.  */
 
Index: sparc64fbsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/sparc64fbsd-nat.c,v
retrieving revision 1.1
diff -u -p -r1.1 sparc64fbsd-nat.c
--- sparc64fbsd-nat.c 21 Aug 2003 20:38:46 -0000 1.1
+++ sparc64fbsd-nat.c 22 Aug 2003 18:47:53 -0000
@@ -76,5 +76,5 @@ _initialize_sparc64fbsd_nat (void)
   sparcbsd_fill_fpreg = sparc64fbsd_fill_fpreg;
 
   sparcbsd_reg_supplies_p = sparc64fbsd_reg_supplies_p;
-  sparcbsd_fpreg_supplies_p = sparc64fbsd_reg_supplies_p;
+  sparcbsd_fpreg_supplies_p = sparc64fbsd_fpreg_supplies_p;
 }
Index: sparc64fbsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sparc64fbsd-tdep.c,v
retrieving revision 1.1
diff -u -p -r1.1 sparc64fbsd-tdep.c
--- sparc64fbsd-tdep.c 21 Aug 2003 20:38:46 -0000 1.1
+++ sparc64fbsd-tdep.c 22 Aug 2003 18:47:53 -0000
@@ -93,7 +93,7 @@ sparc64fbsd_supply_reg (const char *regs
       ULONGEST sp;
 
       regcache_cooked_read_unsigned (current_regcache, SPARC_SP_REGNUM, &sp);
-      sparc64_supply_rwindow (sp, regnum);
+      sparc_supply_rwindow (sp, regnum);
     }
 }
 



More information about the Gdb-patches mailing list