* sparc64-tdep.h (sparc64_regnum): Fix comment.
authorMark Kettenis <kettenis@gnu.org>
Fri, 22 Aug 2003 18:52:50 +0000 (18:52 +0000)
committerMark Kettenis <kettenis@gnu.org>
Fri, 22 Aug 2003 18:52:50 +0000 (18:52 +0000)
(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.

gdb/ChangeLog
gdb/sparc64-tdep.c
gdb/sparc64-tdep.h
gdb/sparc64fbsd-nat.c
gdb/sparc64fbsd-tdep.c

index 85786b653a4ae3fd218dfcc4d33fd2e5f0343b99..1d560298dd0d17729b7ff8c4f92d7f839d2b789c 100644 (file)
@@ -1,5 +1,28 @@
 2003-08-22  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.
+
        * reggroups.c: Add whitespace after declarations of local
        variables in functions.
 
index da5d3571a4ce28788ecfdf4ff3a245ce718b1299..81b2115691ad71fcdd2be83b9d3d5a5f659b6654 100644 (file)
@@ -271,7 +271,8 @@ static struct sparc64_register_info sparc64_register_info[] =
   
   /* 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 gdbarch *gdbarch,
       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 gdbarch *gdbarch,
       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 *gdbarch, CORE_ADDR func_addr,
   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_signal sig, int insert_breakpoints_p)
     {
       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_info info, struct gdbarch_list *arches)
 \f
 /* 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, int regnum)
        {
          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, int regnum)
     {
       /* 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 regnum)
          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 regnum)
     {
       /* 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);
+           }
+       }
     }
 }
 \f
index fbad4349eb0aa0cf92e6331cdcd2c5d7a89c39ea..e7b910d55fe305327d1b2f31094d0e5a9adb850d 100644 (file)
@@ -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 8cbcc38f451e5aa5eb0ba8b8b703960cf4e2ebdb..26c58d8d13bb8da07c5da149960e08af13ebf895 100644 (file)
@@ -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 182cd456ecfbd536413da7f9deab67f53e6e299f..2b910c1b33d9a54269186d0951cfad689676908b 100644 (file)
@@ -93,7 +93,7 @@ sparc64fbsd_supply_reg (const char *regs, int regnum)
       ULONGEST sp;
 
       regcache_cooked_read_unsigned (current_regcache, SPARC_SP_REGNUM, &sp);
-      sparc64_supply_rwindow (sp, regnum);
+      sparc_supply_rwindow (sp, regnum);
     }
 }
 
This page took 0.035212 seconds and 4 git commands to generate.