* gdb.mi/mi-var-cmd.exp: Correct test name. Allow any value for
[deliverable/binutils-gdb.git] / gdb / i386v-nat.c
index e160385cccfc9d9cc8314b10aec248ebf9288f94..fdd0d01a5f99e5c5e33631f0176bfaf6748416b4 100644 (file)
@@ -1,5 +1,7 @@
-/* Intel 386 native support for SYSV systems (pre-SVR4).
-   Copyright (C) 1988, 89, 91, 92, 94, 96, 1998 Free Software Foundation, Inc.
+/* Intel 386 native support for System V systems (pre-SVR4).
+
+   Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
+   2000, 2002, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -15,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 "language.h"
 #include "gdbcore.h"
 
-#ifdef USG
-#include <sys/types.h>
-#endif
-
 #include <sys/param.h>
 #include <sys/dir.h>
 #include <signal.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
 
-
-/* FIXME: The following used to be just "#include <sys/debugreg.h>", but
- * the the Linux 2.1.x kernel and glibc 2.0.x are not in sync; including
- * <sys/debugreg.h> will result in an error.  With luck, these losers
- * will get their act together and we can trash this hack in the near future.
- * --jsm 1998-10-21
- */
-
 #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
-#ifdef HAVE_ASM_DEBUGREG_H
-#include <asm/debugreg.h>
-#else
 #include <sys/debugreg.h>
 #endif
-#endif
 
 #include <sys/file.h>
 #include "gdb_stat.h"
 #include "floatformat.h"
 
 #include "target.h"
+
+#include "i386-tdep.h"
 \f
 
-/* this table must line up with REGISTER_NAMES in tm-i386v.h */
-/* symbols like 'EAX' come from <sys/reg.h> */
+/* Mapping between the general-purpose registers in `struct user'
+   format and GDB's register array layout.  */
 static int regmap[] =
 {
   EAX, ECX, EDX, EBX,
@@ -82,41 +70,36 @@ static int regmap[] =
   DS, ES, FS, GS,
 };
 
-/* blockend is the value of u.u_ar0, and points to the
- * place where GS is stored
- */
+/* Support for the user struct.  */
 
-int
-i386_register_u_addr (blockend, regnum)
-     int blockend;
-     int regnum;
+/* Return the address of register REGNUM.  BLOCKEND is the value of
+   u.u_ar0, and points to the place where GS is stored.  */
+
+CORE_ADDR
+register_u_addr (CORE_ADDR blockend, int regnum)
 {
   struct user u;
-  int fpstate;
-  int ubase;
+  CORE_ADDR fpstate;
 
-  ubase = blockend;
-  /* FIXME:  Should have better way to test floating point range */
-  if (regnum >= FP0_REGNUM && regnum <= (FP0_REGNUM + 7))
+  if (i386_fp_regnum_p (regnum))
     {
-#ifdef KSTKSZ                  /* SCO, and others? */
-      ubase += 4 * (SS + 1) - KSTKSZ;
-      fpstate = ubase + ((char *) &u.u_fps.u_fpstate - (char *) &u);
+#ifdef KSTKSZ                  /* SCO, and others?  */
+      blockend += 4 * (SS + 1) - KSTKSZ;
+      fpstate = blockend + ((char *) &u.u_fps.u_fpstate - (char *) &u);
       return (fpstate + 0x1c + 10 * (regnum - FP0_REGNUM));
 #else
-      fpstate = ubase + ((char *) &u.i387.st_space - (char *) &u);
+      fpstate = blockend + ((char *) &u.i387.st_space - (char *) &u);
       return (fpstate + 10 * (regnum - FP0_REGNUM));
 #endif
     }
-  else
-    {
-      return (ubase + 4 * regmap[regnum]);
-    }
 
+  return (blockend + 4 * regmap[regnum]);
 }
-\f
+
+/* Return the size of the user struct.  */
+
 int
-kernel_u_size ()
+kernel_u_size (void)
 {
   return (sizeof (struct user));
 }
@@ -133,33 +116,23 @@ static int debug_control_mirror;
 /* Record which address associates with which register.  */
 static CORE_ADDR address_lookup[DR_LASTADDR - DR_FIRSTADDR + 1];
 
-static int
-i386_insert_aligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
-                                       int));
+static int i386_insert_aligned_watchpoint (int, CORE_ADDR, CORE_ADDR, int,
+                                          int);
 
-static int
-i386_insert_nonaligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
-                                          int));
+static int i386_insert_nonaligned_watchpoint (int, CORE_ADDR, CORE_ADDR, int,
+                                             int);
 
 /* Insert a watchpoint.  */
 
 int
-i386_insert_watchpoint (pid, addr, len, rw)
-     int pid;
-     CORE_ADDR addr;
-     int len;
-     int rw;
+i386_insert_watchpoint (int pid, CORE_ADDR addr, int len, int rw)
 {
   return i386_insert_aligned_watchpoint (pid, addr, addr, len, rw);
 }
 
 static int
-i386_insert_aligned_watchpoint (pid, waddr, addr, len, rw)
-     int pid;
-     CORE_ADDR waddr;
-     CORE_ADDR addr;
-     int len;
-     int rw;
+i386_insert_aligned_watchpoint (int pid, CORE_ADDR waddr, CORE_ADDR addr,
+                               int len, int rw)
 {
   int i;
   int read_write_bits, len_bits;
@@ -218,23 +191,19 @@ i386_insert_aligned_watchpoint (pid, waddr, addr, len, rw)
 }
 
 static int
-i386_insert_nonaligned_watchpoint (pid, waddr, addr, len, rw)
-     int pid;
-     CORE_ADDR waddr;
-     CORE_ADDR addr;
-     int len;
-     int rw;
+i386_insert_nonaligned_watchpoint (int pid, CORE_ADDR waddr, CORE_ADDR addr,
+                                  int len, int rw)
 {
   int align;
   int size;
   int rv;
 
-  static int size_try_array[16] =
+  static int size_try_array[4][4] =
   {
-    1, 1, 1, 1,                        /* trying size one */
-    2, 1, 2, 1,                        /* trying size two */
-    2, 1, 2, 1,                        /* trying size three */
-    4, 1, 2, 1                 /* trying size four */
+    { 1, 1, 1, 1 },            /* trying size one */
+    { 2, 1, 2, 1 },            /* trying size two */
+    { 2, 1, 2, 1 },            /* trying size three */
+    { 4, 1, 2, 1 }             /* trying size four */
   };
 
   rv = 0;
@@ -242,8 +211,7 @@ i386_insert_nonaligned_watchpoint (pid, waddr, addr, len, rw)
     {
       align = addr % 4;
       /* Four is the maximum length for 386.  */
-      size = (len > 4) ? 3 : len - 1;
-      size = size_try_array[size * 4 + align];
+      size = size_try_array[len > 4 ? 3 : len - 1][align];
 
       rv = i386_insert_aligned_watchpoint (pid, waddr, addr, size, rw);
       if (rv)
@@ -260,10 +228,7 @@ i386_insert_nonaligned_watchpoint (pid, waddr, addr, len, rw)
 /* Remove a watchpoint.  */
 
 int
-i386_remove_watchpoint (pid, addr, len)
-     int pid;
-     CORE_ADDR addr;
-     int len;
+i386_remove_watchpoint (int pid, CORE_ADDR addr, int len)
 {
   int i;
   int register_number;
@@ -288,8 +253,7 @@ i386_remove_watchpoint (pid, addr, len)
 /* Check if stopped by a watchpoint.  */
 
 CORE_ADDR
-i386_stopped_by_watchpoint (pid)
-     int pid;
+i386_stopped_by_watchpoint (int pid)
 {
   int i;
   int status;
@@ -307,88 +271,3 @@ i386_stopped_by_watchpoint (pid)
 }
 
 #endif /* TARGET_HAS_HARDWARE_WATCHPOINTS */
-
-#if 0
-/* using FLOAT_INFO as is would be a problem.  FLOAT_INFO is called
-   via a command xxx and eventually calls ptrace without ever having
-   traversed the target vector.  This would be terribly impolite
-   behaviour for a sun4 hosted remote gdb.
-
-   A fix might be to move this code into the "info registers" command.
-   rich@cygnus.com 15 Sept 92. */
-i386_float_info ()
-{
-  struct user u;               /* just for address computations */
-  int i;
-  /* fpstate defined in <sys/user.h> */
-  struct fpstate *fpstatep;
-  char buf[sizeof (struct fpstate) + 2 * sizeof (int)];
-  unsigned int uaddr;
-  char fpvalid = 0;
-  unsigned int rounded_addr;
-  unsigned int rounded_size;
-  extern int corechan;
-  int skip;
-
-  uaddr = (char *) &u.u_fpvalid - (char *) &u;
-  if (target_has_execution)
-    {
-      unsigned int data;
-      unsigned int mask;
-
-      rounded_addr = uaddr & -sizeof (int);
-      data = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) rounded_addr, 0);
-      mask = 0xff << ((uaddr - rounded_addr) * 8);
-
-      fpvalid = ((data & mask) != 0);
-    }
-#if 0
-  else
-    {
-      if (lseek (corechan, uaddr, 0) < 0)
-       perror ("seek on core file");
-      if (myread (corechan, &fpvalid, 1) < 0)
-       perror ("read on core file");
-
-    }
-#endif /* no core support yet */
-
-  if (fpvalid == 0)
-    {
-      printf_unfiltered ("no floating point status saved\n");
-      return;
-    }
-
-  uaddr = (char *) &U_FPSTATE (u) - (char *) &u;
-  if (target_has_execution)
-    {
-      int *ip;
-
-      rounded_addr = uaddr & -sizeof (int);
-      rounded_size = (((uaddr + sizeof (struct fpstate)) - uaddr) +
-                     sizeof (int) - 1) / sizeof (int);
-      skip = uaddr - rounded_addr;
-
-      ip = (int *) buf;
-      for (i = 0; i < rounded_size; i++)
-       {
-         *ip++ = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) rounded_addr, 0);
-         rounded_addr += sizeof (int);
-       }
-    }
-#if 0
-  else
-    {
-      if (lseek (corechan, uaddr, 0) < 0)
-       perror_with_name ("seek on core file");
-      if (myread (corechan, buf, sizeof (struct fpstate)) < 0)
-         perror_with_name ("read from core file");
-      skip = 0;
-    }
-#endif /* 0 */
-
-  fpstatep = (struct fpstate *) (buf + skip);
-  print_387_status (fpstatep->status, (struct env387 *) fpstatep->state);
-}
-
-#endif /* never */
This page took 0.02891 seconds and 4 git commands to generate.