Added self to write-after-approval.
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
index 580dcc0e8091e289bb8839bf9911efcc27aee37d..6fe6bdfeec62a8419143aaf33cbf0d566d95d12b 100644 (file)
@@ -1,5 +1,5 @@
 /* Low level Alpha interface, for GDB when running native.
-   Copyright 1993, 1995, 1996, 1998, 1999, 2000, 2001
+   Copyright 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -20,6 +20,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
+#include "gdb_string.h"
 #include "inferior.h"
 #include "gdbcore.h"
 #include "target.h"
@@ -58,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
@@ -67,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
@@ -93,25 +94,29 @@ fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
     EF_PC, -1
 #endif
   };
-  static char zerobuf[ALPHA_MAX_REGISTER_RAW_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)
@@ -130,41 +135,45 @@ fetch_elf_core_registers (char *core_reg_sect, unsigned core_reg_size,
       return;
     }
 
-  if (which == 2)
+  switch (which)
     {
-      /* The FPU Registers.  */
-      memcpy (&registers[REGISTER_BYTE (FP0_REGNUM)], core_reg_sect, 31 * 8);
-      memset (&registers[REGISTER_BYTE (FP0_REGNUM + 31)], 0, 8);
-      memset (&register_valid[FP0_REGNUM], 1, 32);
-    }
-  else
-    {
-      /* The General Registers.  */
-      memcpy (&registers[REGISTER_BYTE (ALPHA_V0_REGNUM)], core_reg_sect,
-              31 * 8);
-      memcpy (&registers[REGISTER_BYTE (PC_REGNUM)], core_reg_sect + 31 * 8, 8);
-      memset (&registers[REGISTER_BYTE (ALPHA_ZERO_REGNUM)], 0, 8);
-      memset (&register_valid[ALPHA_V0_REGNUM], 1, 32);
-      register_valid[PC_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;
     }
 }
 
 
 /* Map gdb internal register number to a ptrace ``address''.
-   These ``addresses'' are defined in <sys/ptrace.h> */
-
-#define REGISTER_PTRACE_ADDR(regno) \
-   (regno < FP0_REGNUM ?       GPR_BASE + (regno) \
-  : regno == PC_REGNUM ?       PC      \
-  : regno >= FP0_REGNUM ?      FPR_BASE + ((regno) - FP0_REGNUM) \
-  : 0)
+   These ``addresses'' are defined in <sys/ptrace.h>, with
+   the exception of ALPHA_UNIQUE_PTRACE_ADDR.  */
 
-/* Return the ptrace ``address'' of register REGNO. */
+#ifndef ALPHA_UNIQUE_PTRACE_ADDR
+#define ALPHA_UNIQUE_PTRACE_ADDR 0
+#endif
 
 CORE_ADDR
 register_addr (int regno, CORE_ADDR blockend)
 {
-  return REGISTER_PTRACE_ADDR (regno);
+  if (regno == PC_REGNUM)
+    return PC;
+  if (regno == ALPHA_UNIQUE_REGNUM)
+    return ALPHA_UNIQUE_PTRACE_ADDR;
+  if (regno < FP0_REGNUM)
+    return GPR_BASE + regno;
+  else
+    return FPR_BASE + regno - FP0_REGNUM;
 }
 
 int
@@ -179,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.
  */
@@ -186,33 +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_MAX_REGISTER_RAW_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);
-  supply_register (FP_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 *) &registers[REGISTER_BYTE (regi)];
-
-  if ((regno == -1) || (regno == PC_REGNUM))
-    *(regp + 31) = *(long *) &registers[REGISTER_BYTE (PC_REGNUM)];
+  /* PC is in slot 32.  */
+  alpha_fill_int_regs (regno, regp, regp + 31, unique);
 }
 
 /*
@@ -223,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 *) &registers[REGISTER_BYTE (regi)];
-       }
-    }
+  /* FPCR is in slot 32.  */
+  alpha_fill_fp_regs (regno, regp, regp + 31);
 }
 #endif
 \f
@@ -273,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.039454 seconds and 4 git commands to generate.