* remote.c (remote_write_bytes): Take a const buffer argument.
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
index 975b5977ccaedbb5ccc4e168a6efc097d4446bd6..e584ab473d7c01a469b766ec6202b867512043ec 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level Alpha interface, for GDB when running native.
-   Copyright 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003
+   Copyright (C) 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -16,8 +16,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -59,8 +59,8 @@ static void
 fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
                          int which, CORE_ADDR reg_addr)
 {
-  register int regno;
-  register int addr;
+  int regno;
+  int addr;
   int bad_reg = -1;
 
   /* Table to map a gdb regnum to an index in the core register
@@ -68,7 +68,7 @@ fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
      OSF/1.2 core files.  OSF5 uses different names for the register
      enum list, need to handle two cases.  The actual values are the
      same.  */
-  static int core_reg_mapping[ALPHA_NUM_REGS] =
+  static int const core_reg_mapping[ALPHA_NUM_REGS] =
   {
 #ifdef NCF_REGS
 #define EFL NCF_REGS
@@ -80,7 +80,7 @@ fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
     EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
     EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
     EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
-    CF_PC, -1
+    CF_PC, -1, -1
 #else
 #define EFL (EF_SIZE / 8)
     EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6,
@@ -91,32 +91,37 @@ fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
     EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
     EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
     EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
-    EF_PC, -1
+    EF_PC, -1, -1
 #endif
   };
-  static char zerobuf[ALPHA_REGISTER_SIZE] = {0};
 
-  for (regno = 0; regno < NUM_REGS; regno++)
+  for (regno = 0; regno < ALPHA_NUM_REGS; regno++)
     {
       if (CANNOT_FETCH_REGISTER (regno))
        {
-         supply_register (regno, zerobuf);
+         regcache_raw_supply (current_regcache, regno, NULL);
          continue;
        }
       addr = 8 * core_reg_mapping[regno];
       if (addr < 0 || addr >= core_reg_size)
        {
+         /* ??? UNIQUE is a new addition.  Don't generate an error.  */
+         if (regno == ALPHA_UNIQUE_REGNUM)
+           {
+             regcache_raw_supply (current_regcache, regno, NULL);
+             continue;
+           }
          if (bad_reg < 0)
            bad_reg = regno;
        }
       else
        {
-         supply_register (regno, core_reg_sect + addr);
+         regcache_raw_supply (current_regcache, regno, core_reg_sect + addr);
        }
     }
   if (bad_reg >= 0)
     {
-      error ("Register %s not found in core file.", REGISTER_NAME (bad_reg));
+      error (_("Register %s not found in core file."), REGISTER_NAME (bad_reg));
     }
 }
 
@@ -126,35 +131,26 @@ fetch_elf_core_registers (char *core_reg_sect, unsigned core_reg_size,
 {
   if (core_reg_size < 32 * 8)
     {
-      error ("Core file register section too small (%u bytes).", core_reg_size);
+      error (_("Core file register section too small (%u bytes)."), core_reg_size);
       return;
     }
 
-  if (which == 2)
+  switch (which)
     {
-      /* The FPU Registers.  */
-      memcpy (&deprecated_registers[REGISTER_BYTE (FP0_REGNUM)],
-             core_reg_sect, 31 * 8);
-      memset (&deprecated_registers[REGISTER_BYTE (FP0_REGNUM + 31)], 0, 8);
-      memset (&deprecated_register_valid[FP0_REGNUM], 1, 32);
-    }
-  else
-    {
-      /* The General Registers.  */
-      memcpy (&deprecated_registers[REGISTER_BYTE (ALPHA_V0_REGNUM)],
-             core_reg_sect, 31 * 8);
-      memcpy (&deprecated_registers[REGISTER_BYTE (PC_REGNUM)],
-             core_reg_sect + 31 * 8, 8);
-      memset (&deprecated_registers[REGISTER_BYTE (ALPHA_ZERO_REGNUM)], 0, 8);
-      memset (&deprecated_register_valid[ALPHA_V0_REGNUM], 1, 32);
-      deprecated_register_valid[PC_REGNUM] = 1;
-
-      if (core_reg_size >= 33 * 8)
-       {
-         memcpy (&deprecated_registers[REGISTER_BYTE (ALPHA_UNIQUE_REGNUM)],
-                 core_reg_sect + 32 * 8, 8);
-         deprecated_register_valid[ALPHA_UNIQUE_REGNUM] = 1;
-       }
+    case 0: /* integer registers */
+      /* PC is in slot 32; UNIQUE is in slot 33, if present.  */
+      alpha_supply_int_regs (-1, core_reg_sect, core_reg_sect + 31*8,
+                            (core_reg_size >= 33 * 8
+                             ? core_reg_sect + 32*8 : NULL));
+      break;
+
+    case 2: /* floating-point registers */
+      /* FPCR is in slot 32.  */
+      alpha_supply_fp_regs (-1, core_reg_sect, core_reg_sect + 31*8);
+      break;
+
+    default:
+      break;
     }
 }
 
@@ -192,6 +188,11 @@ kernel_u_size (void)
 /* Prototypes for supply_gregset etc. */
 #include "gregset.h"
 
+/* Locate the UNIQUE value within the gregset_t.  */
+#ifndef ALPHA_REGSET_UNIQUE
+#define ALPHA_REGSET_UNIQUE(ptr) NULL
+#endif
+
 /*
  * See the comment in m68k-tdep.c regarding the utility of these functions.
  */
@@ -199,31 +200,21 @@ kernel_u_size (void)
 void
 supply_gregset (gdb_gregset_t *gregsetp)
 {
-  register int regi;
-  register long *regp = ALPHA_REGSET_BASE (gregsetp);
-  static char zerobuf[ALPHA_REGISTER_SIZE] = {0};
+  long *regp = ALPHA_REGSET_BASE (gregsetp);
+  void *unique = ALPHA_REGSET_UNIQUE (gregsetp);
 
-  for (regi = 0; regi < 31; regi++)
-    supply_register (regi, (char *) (regp + regi));
-
-  supply_register (PC_REGNUM, (char *) (regp + 31));
-
-  /* Fill inaccessible registers with zero.  */
-  supply_register (ALPHA_ZERO_REGNUM, zerobuf);
+  /* PC is in slot 32.  */
+  alpha_supply_int_regs (-1, regp, regp + 31, unique);
 }
 
 void
 fill_gregset (gdb_gregset_t *gregsetp, int regno)
 {
-  int regi;
-  register long *regp = ALPHA_REGSET_BASE (gregsetp);
+  long *regp = ALPHA_REGSET_BASE (gregsetp);
+  void *unique = ALPHA_REGSET_UNIQUE (gregsetp);
 
-  for (regi = 0; regi < 31; regi++)
-    if ((regno == -1) || (regno == regi))
-      *(regp + regi) = *(long *) &deprecated_registers[REGISTER_BYTE (regi)];
-
-  if ((regno == -1) || (regno == PC_REGNUM))
-    *(regp + 31) = *(long *) &deprecated_registers[REGISTER_BYTE (PC_REGNUM)];
+  /* PC is in slot 32.  */
+  alpha_fill_int_regs (regno, regp, regp + 31, unique);
 }
 
 /*
@@ -234,27 +225,19 @@ fill_gregset (gdb_gregset_t *gregsetp, int regno)
 void
 supply_fpregset (gdb_fpregset_t *fpregsetp)
 {
-  register int regi;
-  register long *regp = ALPHA_REGSET_BASE (fpregsetp);
+  long *regp = ALPHA_REGSET_BASE (fpregsetp);
 
-  for (regi = 0; regi < 32; regi++)
-    supply_register (regi + FP0_REGNUM, (char *) (regp + regi));
+  /* FPCR is in slot 32.  */
+  alpha_supply_fp_regs (-1, regp, regp + 31);
 }
 
 void
 fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
 {
-  int regi;
-  register long *regp = ALPHA_REGSET_BASE (fpregsetp);
+  long *regp = ALPHA_REGSET_BASE (fpregsetp);
 
-  for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
-    {
-      if ((regno == -1) || (regno == regi))
-       {
-         *(regp + regi - FP0_REGNUM) =
-           *(long *) &deprecated_registers[REGISTER_BYTE (regi)];
-       }
-    }
+  /* FPCR is in slot 32.  */
+  alpha_fill_fp_regs (regno, regp, regp + 31);
 }
 #endif
 \f
@@ -284,6 +267,6 @@ static struct core_fns alpha_elf_core_fns =
 void
 _initialize_core_alpha (void)
 {
-  add_core_fns (&alpha_osf_core_fns);
-  add_core_fns (&alpha_elf_core_fns);
+  deprecated_add_core_fns (&alpha_osf_core_fns);
+  deprecated_add_core_fns (&alpha_elf_core_fns);
 }
This page took 0.026966 seconds and 4 git commands to generate.