* solib-svr4.c (LM_ADDR_FROM_LINK_MAP): Use builtin types of
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
index 548869b2fa81f91c54e155b47e002fede7ce4ad3..9b63b3075fa1d1b239a3c43853784772ded48d91 100644 (file)
@@ -1,12 +1,12 @@
 /* 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, 2007, 2008
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
    GNU General Public License for more details.
 
    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.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdb_string.h"
 #include "alpha-tdep.h"
 
 #include <sys/ptrace.h>
-#ifdef __linux__
-#include <asm/reg.h>
-#include <alpha/ptrace.h>
-#else
 #include <alpha/coreregs.h>
-#endif
 #include <sys/user.h>
 
-/* Prototypes for local functions. */
-
-static void fetch_osf_core_registers (char *, unsigned, int, CORE_ADDR);
-static void fetch_elf_core_registers (char *, unsigned, int, CORE_ADDR);
 
 /* Extract the register values out of the core file and store
-   them where `read_register' will find them.
+   them into REGCACHE.
 
    CORE_REG_SECT points to the register values themselves, read into memory.
    CORE_REG_SIZE is the size of that area.
@@ -56,11 +45,13 @@ static void fetch_elf_core_registers (char *, unsigned, int, CORE_ADDR);
  */
 
 static void
-fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
+fetch_osf_core_registers (struct regcache *regcache,
+                         char *core_reg_sect, unsigned core_reg_size,
                          int which, CORE_ADDR reg_addr)
 {
-  register int regno;
-  register int addr;
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  int regno;
+  int addr;
   int bad_reg = -1;
 
   /* Table to map a gdb regnum to an index in the core register
@@ -68,7 +59,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 +71,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,105 +82,43 @@ 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_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))
+      if (gdbarch_cannot_fetch_register (gdbarch, regno))
        {
-         supply_register (regno, zerobuf);
+         regcache_raw_supply (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 (regcache, regno, NULL);
+             continue;
+           }
          if (bad_reg < 0)
            bad_reg = regno;
        }
       else
        {
-         supply_register (regno, core_reg_sect + addr);
+         regcache_raw_supply (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."),
+            gdbarch_register_name (gdbarch, bad_reg));
     }
 }
 
-static void
-fetch_elf_core_registers (char *core_reg_sect, unsigned core_reg_size,
-                         int which, CORE_ADDR reg_addr)
-{
-  if (core_reg_size < 32 * 8)
-    {
-      error ("Core file register section too small (%u bytes).", core_reg_size);
-      return;
-    }
-
-  if (which == 2)
-    {
-      /* 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;
-       }
-    }
-}
-
-
-/* Map gdb internal register number to a ptrace ``address''.
-   These ``addresses'' are defined in <sys/ptrace.h>, with
-   the exception of ALPHA_UNIQUE_PTRACE_ADDR.  */
-
-#ifndef ALPHA_UNIQUE_PTRACE_ADDR
-#define ALPHA_UNIQUE_PTRACE_ADDR 0
-#endif
-
-CORE_ADDR
-register_addr (int regno, CORE_ADDR blockend)
-{
-  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
-kernel_u_size (void)
-{
-  return (sizeof (struct user));
-}
 
-#if defined(USE_PROC_FS) || defined(HAVE_GREGSET_T)
 #include <sys/procfs.h>
-
 /* Prototypes for supply_gregset etc. */
 #include "gregset.h"
 
@@ -198,35 +127,22 @@ kernel_u_size (void)
  */
 
 void
-supply_gregset (gdb_gregset_t *gregsetp)
+supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
 {
-  register int regi;
-  register long *regp = ALPHA_REGSET_BASE (gregsetp);
-  static char zerobuf[ALPHA_MAX_REGISTER_RAW_SIZE] =
-  {0};
-
-  for (regi = 0; regi < 31; regi++)
-    supply_register (regi, (char *) (regp + regi));
-
-  supply_register (PC_REGNUM, (char *) (regp + 31));
+  const long *regp = gregsetp->regs;
 
-  /* 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 (regcache, -1, regp, regp + 31, NULL);
 }
 
 void
-fill_gregset (gdb_gregset_t *gregsetp, int regno)
+fill_gregset (const struct regcache *regcache,
+             gdb_gregset_t *gregsetp, int regno)
 {
-  int regi;
-  register long *regp = ALPHA_REGSET_BASE (gregsetp);
+  long *regp = gregsetp->regs;
 
-  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 (regcache, regno, regp, regp + 31, NULL);
 }
 
 /*
@@ -235,31 +151,23 @@ fill_gregset (gdb_gregset_t *gregsetp, int regno)
  */
 
 void
-supply_fpregset (gdb_fpregset_t *fpregsetp)
+supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
 {
-  register int regi;
-  register long *regp = ALPHA_REGSET_BASE (fpregsetp);
+  const long *regp = fpregsetp->regs;
 
-  for (regi = 0; regi < 32; regi++)
-    supply_register (regi + FP0_REGNUM, (char *) (regp + regi));
+  /* FPCR is in slot 32.  */
+  alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
 }
 
 void
-fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
+fill_fpregset (const struct regcache *regcache,
+              gdb_fpregset_t *fpregsetp, int regno)
 {
-  int regi;
-  register long *regp = ALPHA_REGSET_BASE (fpregsetp);
+  long *regp = fpregsetp->regs;
 
-  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 (regcache, regno, regp, regp + 31);
 }
-#endif
 \f
 
 /* Register that we are able to handle alpha core file formats. */
@@ -275,18 +183,8 @@ static struct core_fns alpha_osf_core_fns =
   NULL                                 /* next */
 };
 
-static struct core_fns alpha_elf_core_fns =
-{
-  bfd_target_elf_flavour,              /* core_flavour */
-  default_check_format,                        /* check_format */
-  default_core_sniffer,                        /* core_sniffer */
-  fetch_elf_core_registers,            /* core_read_registers */
-  NULL                                 /* next */
-};
-
 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);
 }
This page took 0.027726 seconds and 4 git commands to generate.