Create new file regcache.h. Update all uses.
[deliverable/binutils-gdb.git] / gdb / ppc-linux-nat.c
index 1522f96b80fea1e49b621a5c20b60e738c12953d..66e6e831a77001783cbed6f31318723f4716297f 100644 (file)
@@ -1,5 +1,6 @@
 /* PPC linux native support.
-   Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
+   Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2001 Free Software
+   Foundation, Inc.
 
    This file is part of GDB.
 
@@ -21,6 +22,7 @@
 #include "frame.h"
 #include "inferior.h"
 #include "gdbcore.h"
+#include "regcache.h"
 
 #include <sys/types.h>
 #include <sys/param.h>
 #include <fcntl.h>
 #include <sys/procfs.h>
 
+/* Prototypes for supply_gregset etc. */
+#include "gregset.h"
+
 int
-kernel_u_size ()
+kernel_u_size (void)
 {
   return (sizeof (struct user));
 }
@@ -54,7 +59,8 @@ ppc_register_u_addr (int ustart, int regnum)
   return (ustart + 4 * regmap[regnum]);
 }
 
-supply_gregset (gregset_t * gregsetp)
+void
+supply_gregset (gdb_gregset_t *gregsetp)
 {
   int regi;
   register greg_t *regp = (greg_t *) gregsetp;
@@ -66,7 +72,30 @@ supply_gregset (gregset_t * gregsetp)
     supply_register (regi, (char *) (regp + regmap[regi]));
 }
 
-supply_fpregset (fpregset_t * fpregsetp)
+void
+fill_gregset (gdb_gregset_t *gregsetp, int regno)
+{
+  int regi;
+  greg_t *regp = (greg_t *) gregsetp;
+
+#define COPY_REG(_idx_,_regi_) \
+  if ((regno == -1) || regno == _regi_) \
+    memcpy (regp + _idx_, &registers[REGISTER_BYTE (_regi_)], \
+           REGISTER_RAW_SIZE (_regi_))
+
+  for (regi = 0; regi < 32; regi++)
+    {
+      COPY_REG (regmap[regi], regi);
+    }
+
+  for (regi = FIRST_UISA_SP_REGNUM; regi <= LAST_UISA_SP_REGNUM; regi++)
+    {
+      COPY_REG (regmap[regi], regi);
+    }
+}
+
+void
+supply_fpregset (gdb_fpregset_t * fpregsetp)
 {
   int regi;
   for (regi = 0; regi < 32; regi++)
@@ -74,3 +103,26 @@ supply_fpregset (fpregset_t * fpregsetp)
       supply_register (FP0_REGNUM + regi, (char *) (*fpregsetp + regi));
     }
 }
+
+/*  Given a pointer to a floating point register set in /proc format
+   (fpregset_t *), update the register specified by REGNO from gdb's idea
+   of the current floating point register set.  If REGNO is -1, update
+   them all. */
+
+void
+fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
+{
+  int regi;
+  char *to;
+  char *from;
+  
+  for (regi = 0; regi < 32; regi++)
+    {
+      if ((regno == -1) || (regno == FP0_REGNUM + regi))
+        {
+         from = (char *) &registers[REGISTER_BYTE (FP0_REGNUM + regi)];
+         to = (char *) (*fpregsetp + regi);
+         memcpy (to, from, REGISTER_RAW_SIZE (FP0_REGNUM + regi));
+        }
+    }
+}
This page took 0.031617 seconds and 4 git commands to generate.