OSDN Git Service

*** empty log message ***
[pf3gnuchains/sourceware.git] / gdb / irix5-nat.c
index 58630ba..f0738d4 100644 (file)
@@ -1,7 +1,8 @@
 /* Native support for the SGI Iris running IRIX version 5, for GDB.
 
    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
-   1999, 2000, 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2004, 2006, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
    and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
 #include "gdbcore.h"
 #include "target.h"
 #include "regcache.h"
+#include "procfs.h"
 
 #include "gdb_string.h"
 #include <sys/time.h>
 #include <sys/procfs.h>
 #include <setjmp.h>            /* For JB_XXX.  */
 
-/* Prototypes for supply_gregset etc. */
+/* Prototypes for supply_gregset etc.  */
 #include "gregset.h"
 #include "mips-tdep.h"
 
@@ -82,6 +84,7 @@ fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
   greg_t *regp = &(*gregsetp)[0];
   gdb_byte buf[MAX_REGISTER_SIZE];
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   /* Under Irix6, if GDB is built with N32 ABI and is debugging an O32
      executable, we have to sign extend the registers to 64 bits before
@@ -92,15 +95,15 @@ fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
       {
        size = register_size (gdbarch, regi);
        regcache_raw_collect (regcache, regi, buf);
-       *(regp + regi) = extract_signed_integer (buf, size);
+       *(regp + regi) = extract_signed_integer (buf, size, byte_order);
       }
 
-  if ((regno == -1) || (regno == gdbarch_pc_regnum (gdbarch)))
+  if ((regno == -1) || (regno == mips_regnum (gdbarch)->pc))
     {
       regi = mips_regnum (gdbarch)->pc;
       size = register_size (gdbarch, regi);
       regcache_raw_collect (regcache, regi, buf);
-      *(regp + CTX_EPC) = extract_signed_integer (buf, size);
+      *(regp + CTX_EPC) = extract_signed_integer (buf, size, byte_order);
     }
 
   if ((regno == -1) || (regno == mips_regnum (gdbarch)->cause))
@@ -108,7 +111,7 @@ fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
       regi = mips_regnum (gdbarch)->cause;
       size = register_size (gdbarch, regi);
       regcache_raw_collect (regcache, regi, buf);
-      *(regp + CTX_CAUSE) = extract_signed_integer (buf, size);
+      *(regp + CTX_CAUSE) = extract_signed_integer (buf, size, byte_order);
     }
 
   if ((regno == -1) || (regno == mips_regnum (gdbarch)->hi))
@@ -116,7 +119,7 @@ fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
       regi = mips_regnum (gdbarch)->hi;
       size = register_size (gdbarch, regi);
       regcache_raw_collect (regcache, regi, buf);
-      *(regp + CTX_MDHI) = extract_signed_integer (buf, size);
+      *(regp + CTX_MDHI) = extract_signed_integer (buf, size, byte_order);
     }
 
   if ((regno == -1) || (regno == mips_regnum (gdbarch)->lo))
@@ -124,7 +127,7 @@ fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
       regi = mips_regnum (gdbarch)->lo;
       size = register_size (gdbarch, regi);
       regcache_raw_collect (regcache, regi, buf);
-      *(regp + CTX_MDLO) = extract_signed_integer (buf, size);
+      *(regp + CTX_MDLO) = extract_signed_integer (buf, size, byte_order);
     }
 }
 
@@ -144,11 +147,11 @@ supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
   char fsrbuf[8];
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
-  /* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs. */
+  /* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs.  */
 
   for (regi = 0; regi < 32; regi++)
     regcache_raw_supply (regcache, gdbarch_fp0_regnum (gdbarch) + regi,
-                        (const char *) &fpregsetp->fp_r.fp_regs[regi]);
+                        (const char *) &fpregsetp->__fp_r.__fp_regs[regi]);
 
   /* We can't supply the FSR register directly to the regcache,
      because there is a size issue: On one hand, fpregsetp->fp_csr
@@ -156,33 +159,35 @@ supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
      So we use a buffer of the correct size and copy into it the register
      value at the proper location.  */
   memset (fsrbuf, 0, 4);
-  memcpy (fsrbuf + 4, &fpregsetp->fp_csr, 4);
+  memcpy (fsrbuf + 4, &fpregsetp->__fp_csr, 4);
 
   regcache_raw_supply (regcache,
                       mips_regnum (gdbarch)->fp_control_status, fsrbuf);
 
-  /* FIXME: how can we supply FCRIR?  SGI doesn't tell us. */
+  /* FIXME: how can we supply FCRIR?  SGI doesn't tell us.  */
   regcache_raw_supply (regcache,
                       mips_regnum (gdbarch)->fp_implementation_revision,
                       zerobuf);
 }
 
 void
-fill_fpregset (const struct regcache *regcache, fpregset_t *fpregsetp, int regno)
+fill_fpregset (const struct regcache *regcache,
+              fpregset_t *fpregsetp, int regno)
 {
   int regi;
   char *from, *to;
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
-  /* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs. */
+  /* FIXME, this is wrong for the N32 ABI which has 64 bit FP regs.  */
 
   for (regi = gdbarch_fp0_regnum (gdbarch);
        regi < gdbarch_fp0_regnum (gdbarch) + 32; regi++)
     {
       if ((regno == -1) || (regno == regi))
        {
-         to = (char *) &(fpregsetp->fp_r.fp_regs[regi - gdbarch_fp0_regnum
-                                                        (gdbarch)]);
+         const int fp0_regnum = gdbarch_fp0_regnum (gdbarch);
+
+         to = (char *) &(fpregsetp->__fp_r.__fp_regs[regi - fp0_regnum]);
           regcache_raw_collect (regcache, regi, to);
        }
     }
@@ -200,7 +205,7 @@ fill_fpregset (const struct regcache *regcache, fpregset_t *fpregsetp, int regno
       regcache_raw_collect (regcache,
                            mips_regnum (gdbarch)->fp_control_status, fsrbuf);
 
-      memcpy (&fpregsetp->fp_csr, fsrbuf + 4, 4);
+      memcpy (&fpregsetp->__fp_csr, fsrbuf + 4, 4);
     }
 }
 
@@ -244,7 +249,7 @@ fetch_core_registers (struct regcache *regcache,
 }
 
 /* Register that we are able to handle irix5 core file formats.
-   This really is bfd_target_unknown_flavour */
+   This really is bfd_target_unknown_flavour */
 
 static struct core_fns irix5_core_fns =
 {
@@ -255,8 +260,17 @@ static struct core_fns irix5_core_fns =
   NULL                                 /* next */
 };
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_irix5_nat;
+
 void
-_initialize_core_irix5 (void)
+_initialize_irix5_nat (void)
 {
+  struct target_ops *t;
+
+  t = procfs_target ();
+  procfs_use_watchpoints (t);
+  add_target (t);
+
   deprecated_add_core_fns (&irix5_core_fns);
 }