bfd/
[deliverable/binutils-gdb.git] / gdb / lynx-nat.c
index 8f8f15ea894856655b8042db6008238eee278853..d66e5bd47c5005be920f213e189c609b84f86cc2 100644 (file)
@@ -1,6 +1,7 @@
 /* Native-dependent code for LynxOS.
-   Copyright 1993, 1994, 1995, 1996, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+
+   Copyright (C) 1993, 1994, 1995, 1996, 1999, 2000, 2001, 2003 Free
+   Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -16,8 +17,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 "frame.h"
@@ -27,7 +28,7 @@
 #include "regcache.h"
 
 #include <sys/ptrace.h>
-#include <sys/wait.h>
+#Include "gdb_wait.h"
 #include <sys/fpp.h>
 
 static unsigned long registers_addr (int pid);
@@ -255,214 +256,6 @@ static int regmap[] =
 
 #endif /* rs6000 */
 
-#ifdef SPARC
-
-/* This routine handles some oddball cases for Sparc registers and LynxOS.
-   In partucular, it causes refs to G0, g5->7, and all fp regs to return zero.
-   It also handles knows where to find the I & L regs on the stack.  */
-
-void
-fetch_inferior_registers (int regno)
-{
-  int whatregs = 0;
-
-#define WHATREGS_FLOAT 1
-#define WHATREGS_GEN 2
-#define WHATREGS_STACK 4
-
-  if (regno == -1)
-    whatregs = WHATREGS_FLOAT | WHATREGS_GEN | WHATREGS_STACK;
-  else if (regno >= L0_REGNUM && regno <= I7_REGNUM)
-    whatregs = WHATREGS_STACK;
-  else if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
-    whatregs = WHATREGS_FLOAT;
-  else
-    whatregs = WHATREGS_GEN;
-
-  if (whatregs & WHATREGS_GEN)
-    {
-      struct econtext ec;      /* general regs */
-      char buf[MAX_REGISTER_RAW_SIZE];
-      int retval;
-      int i;
-
-      errno = 0;
-      retval = ptrace (PTRACE_GETREGS, PIDGET (inferior_ptid),
-                       (PTRACE_ARG3_TYPE) & ec, 0);
-      if (errno)
-       perror_with_name ("ptrace(PTRACE_GETREGS)");
-
-      memset (buf, 0, REGISTER_RAW_SIZE (G0_REGNUM));
-      supply_register (G0_REGNUM, buf);
-      supply_register (TBR_REGNUM, (char *) &ec.tbr);
-
-      memcpy (&registers[REGISTER_BYTE (G1_REGNUM)], &ec.g1,
-             4 * REGISTER_RAW_SIZE (G1_REGNUM));
-      for (i = G1_REGNUM; i <= G1_REGNUM + 3; i++)
-       deprecated_register_valid[i] = 1;
-
-      supply_register (PS_REGNUM, (char *) &ec.psr);
-      supply_register (Y_REGNUM, (char *) &ec.y);
-      supply_register (PC_REGNUM, (char *) &ec.pc);
-      supply_register (NPC_REGNUM, (char *) &ec.npc);
-      supply_register (WIM_REGNUM, (char *) &ec.wim);
-
-      memcpy (&registers[REGISTER_BYTE (O0_REGNUM)], ec.o,
-             8 * REGISTER_RAW_SIZE (O0_REGNUM));
-      for (i = O0_REGNUM; i <= O0_REGNUM + 7; i++)
-       deprecated_register_valid[i] = 1;
-    }
-
-  if (whatregs & WHATREGS_STACK)
-    {
-      CORE_ADDR sp;
-      int i;
-
-      sp = read_register (SP_REGNUM);
-
-      target_read_memory (sp + FRAME_SAVED_I0,
-                         &registers[REGISTER_BYTE (I0_REGNUM)],
-                         8 * REGISTER_RAW_SIZE (I0_REGNUM));
-      for (i = I0_REGNUM; i <= I7_REGNUM; i++)
-       deprecated_register_valid[i] = 1;
-
-      target_read_memory (sp + FRAME_SAVED_L0,
-                         &registers[REGISTER_BYTE (L0_REGNUM)],
-                         8 * REGISTER_RAW_SIZE (L0_REGNUM));
-      for (i = L0_REGNUM; i <= L0_REGNUM + 7; i++)
-       deprecated_register_valid[i] = 1;
-    }
-
-  if (whatregs & WHATREGS_FLOAT)
-    {
-      struct fcontext fc;      /* fp regs */
-      int retval;
-      int i;
-
-      errno = 0;
-      retval = ptrace (PTRACE_GETFPREGS, PIDGET (inferior_ptid),
-                       (PTRACE_ARG3_TYPE) & fc, 0);
-      if (errno)
-       perror_with_name ("ptrace(PTRACE_GETFPREGS)");
-
-      memcpy (&registers[REGISTER_BYTE (FP0_REGNUM)], fc.f.fregs,
-             32 * REGISTER_RAW_SIZE (FP0_REGNUM));
-      for (i = FP0_REGNUM; i <= FP0_REGNUM + 31; i++)
-       deprecated_register_valid[i] = 1;
-
-      supply_register (FPS_REGNUM, (char *) &fc.fsr);
-    }
-}
-
-/* This routine handles storing of the I & L regs for the Sparc.  The trick
-   here is that they actually live on the stack.  The really tricky part is
-   that when changing the stack pointer, the I & L regs must be written to
-   where the new SP points, otherwise the regs will be incorrect when the
-   process is started up again.   We assume that the I & L regs are valid at
-   this point.  */
-
-void
-store_inferior_registers (int regno)
-{
-  int whatregs = 0;
-
-  if (regno == -1)
-    whatregs = WHATREGS_FLOAT | WHATREGS_GEN | WHATREGS_STACK;
-  else if (regno >= L0_REGNUM && regno <= I7_REGNUM)
-    whatregs = WHATREGS_STACK;
-  else if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
-    whatregs = WHATREGS_FLOAT;
-  else if (regno == SP_REGNUM)
-    whatregs = WHATREGS_STACK | WHATREGS_GEN;
-  else
-    whatregs = WHATREGS_GEN;
-
-  if (whatregs & WHATREGS_GEN)
-    {
-      struct econtext ec;      /* general regs */
-      int retval;
-
-      ec.tbr = read_register (TBR_REGNUM);
-      memcpy (&ec.g1, &registers[REGISTER_BYTE (G1_REGNUM)],
-             4 * REGISTER_RAW_SIZE (G1_REGNUM));
-
-      ec.psr = read_register (PS_REGNUM);
-      ec.y = read_register (Y_REGNUM);
-      ec.pc = read_register (PC_REGNUM);
-      ec.npc = read_register (NPC_REGNUM);
-      ec.wim = read_register (WIM_REGNUM);
-
-      memcpy (ec.o, &registers[REGISTER_BYTE (O0_REGNUM)],
-             8 * REGISTER_RAW_SIZE (O0_REGNUM));
-
-      errno = 0;
-      retval = ptrace (PTRACE_SETREGS, PIDGET (inferior_ptid),
-                       (PTRACE_ARG3_TYPE) & ec, 0);
-      if (errno)
-       perror_with_name ("ptrace(PTRACE_SETREGS)");
-    }
-
-  if (whatregs & WHATREGS_STACK)
-    {
-      int regoffset;
-      CORE_ADDR sp;
-
-      sp = read_register (SP_REGNUM);
-
-      if (regno == -1 || regno == SP_REGNUM)
-       {
-         if (!deprecated_register_valid[L0_REGNUM + 5])
-           internal_error (__FILE__, __LINE__, "failed internal consistency check");
-         target_write_memory (sp + FRAME_SAVED_I0,
-                             &registers[REGISTER_BYTE (I0_REGNUM)],
-                             8 * REGISTER_RAW_SIZE (I0_REGNUM));
-
-         target_write_memory (sp + FRAME_SAVED_L0,
-                             &registers[REGISTER_BYTE (L0_REGNUM)],
-                             8 * REGISTER_RAW_SIZE (L0_REGNUM));
-       }
-      else if (regno >= L0_REGNUM && regno <= I7_REGNUM)
-       {
-         if (!deprecated_register_valid[regno])
-           internal_error (__FILE__, __LINE__, "failed internal consistency check");
-         if (regno >= L0_REGNUM && regno <= L0_REGNUM + 7)
-           regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (L0_REGNUM)
-             + FRAME_SAVED_L0;
-         else
-           regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (I0_REGNUM)
-             + FRAME_SAVED_I0;
-         target_write_memory (sp + regoffset, 
-                             &registers[REGISTER_BYTE (regno)],
-                             REGISTER_RAW_SIZE (regno));
-       }
-    }
-
-  if (whatregs & WHATREGS_FLOAT)
-    {
-      struct fcontext fc;      /* fp regs */
-      int retval;
-
-/* We read fcontext first so that we can get good values for fq_t... */
-      errno = 0;
-      retval = ptrace (PTRACE_GETFPREGS, PIDGET (inferior_ptid),
-                       (PTRACE_ARG3_TYPE) & fc, 0);
-      if (errno)
-       perror_with_name ("ptrace(PTRACE_GETFPREGS)");
-
-      memcpy (fc.f.fregs, &registers[REGISTER_BYTE (FP0_REGNUM)],
-             32 * REGISTER_RAW_SIZE (FP0_REGNUM));
-
-      fc.fsr = read_register (FPS_REGNUM);
-
-      errno = 0;
-      retval = ptrace (PTRACE_SETFPREGS, PIDGET (inferior_ptid),
-                       (PTRACE_ARG3_TYPE) & fc, 0);
-      if (errno)
-       perror_with_name ("ptrace(PTRACE_SETFPREGS)");
-    }
-}
-#endif /* SPARC */
-
 #if defined (I386) || defined (M68K) || defined (rs6000)
 
 /* Return the offset relative to the start of the per-thread data to the
@@ -510,29 +303,31 @@ fetch_inferior_registers (int regno)
 
   ecp = registers_addr (PIDGET (inferior_ptid));
 
-  for (regno = reglo; regno <= reghi; regno++)
-    {
-      char buf[MAX_REGISTER_RAW_SIZE];
-      int ptrace_fun = PTRACE_PEEKTHREAD;
-
+  {
+    char buf[MAX_REGISTER_SIZE];
+    for (regno = reglo; regno <= reghi; regno++)
+      {
+       int ptrace_fun = PTRACE_PEEKTHREAD;
+       
 #ifdef M68K
-      ptrace_fun = regno == SP_REGNUM ? PTRACE_PEEKUSP : PTRACE_PEEKTHREAD;
+       ptrace_fun = regno == SP_REGNUM ? PTRACE_PEEKUSP : PTRACE_PEEKTHREAD;
 #endif
-
-      for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
-       {
-         unsigned int reg;
-
-         errno = 0;
-         reg = ptrace (ptrace_fun, PIDGET (inferior_ptid),
-                       (PTRACE_ARG3_TYPE) (ecp + regmap[regno] + i), 0);
-         if (errno)
-           perror_with_name ("ptrace(PTRACE_PEEKUSP)");
-
-         *(int *) &buf[i] = reg;
-       }
-      supply_register (regno, buf);
-    }
+       
+       for (i = 0; i < register_size (current_gdbarch, regno); i += sizeof (int))
+         {
+           unsigned int reg;
+           
+           errno = 0;
+           reg = ptrace (ptrace_fun, PIDGET (inferior_ptid),
+                         (PTRACE_ARG3_TYPE) (ecp + regmap[regno] + i), 0);
+           if (errno)
+             perror_with_name ("ptrace(PTRACE_PEEKUSP)");
+           
+           *(int *) &buf[i] = reg;
+         }
+       regcache_raw_supply (current_regcache, regno, buf);
+      }
+  }
 }
 
 /* Store our register values back into the inferior.
@@ -567,11 +362,11 @@ store_inferior_registers (int regno)
       ptrace_fun = regno == SP_REGNUM ? PTRACE_POKEUSP : PTRACE_POKEUSER;
 #endif
 
-      for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
+      for (i = 0; i < register_size (current_gdbarch, regno); i += sizeof (int))
        {
          unsigned int reg;
 
-         reg = *(unsigned int *) &registers[REGISTER_BYTE (regno) + i];
+         reg = *(unsigned int *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno) + i];
 
          errno = 0;
          ptrace (ptrace_fun, PIDGET (inferior_ptid),
@@ -798,8 +593,8 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
 
   for (regno = 0; regno < NUM_REGS; regno++)
     if (regmap[regno] != -1)
-      supply_register (regno, core_reg_sect + offsetof (st_t, ec)
-                      + regmap[regno]);
+      regcache_raw_supply (current_regcache, regno,
+                          core_reg_sect + offsetof (st_t, ec) + regmap[regno]);
 
 #ifdef SPARC
 /* Fetching this register causes all of the I & L regs to be read from the
@@ -825,5 +620,5 @@ static struct core_fns lynx_core_fns =
 void
 _initialize_core_lynx (void)
 {
-  add_core_fns (&lynx_core_fns);
+  deprecated_add_core_fns (&lynx_core_fns);
 }
This page took 0.028144 seconds and 4 git commands to generate.