* infptrace.c (child_resume): Don't try to step if
[deliverable/binutils-gdb.git] / gdb / i386v-nat.c
index 07ddc9f7b5de52298b9efe6149502f262ae5f917..38468a90277e8c73dd0451b9bc52f5e589b3b859 100644 (file)
@@ -1,5 +1,5 @@
 /* Intel 386 native support for SYSV systems (pre-SVR4).
-   Copyright (C) 1988, 1989, 1991, 1992, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -15,7 +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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "frame.h"
@@ -34,12 +34,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/ioctl.h>
 #include <fcntl.h>
 
-#ifdef TARGET_CAN_USE_HARDWARE_WATCHPOINT
+#ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
 #include <sys/debugreg.h>
 #endif
 
 #include <sys/file.h>
-#include <sys/stat.h>
+#include "gdb_stat.h"
 
 #ifndef NO_SYS_REG_H
 #include <sys/reg.h>
@@ -69,26 +69,37 @@ i386_register_u_addr (blockend, regnum)
      int blockend;
      int regnum;
 {
-#if 0
-  /* this will be needed if fp registers are reinstated */
-  /* for now, you can look at them with 'info float'
-   * sys5 wont let you change them with ptrace anyway
-   */
-  if (regnum >= FP0_REGNUM && regnum <= FP7_REGNUM) 
+  struct user u;
+  int fpstate;
+  int ubase;
+
+  ubase = blockend;
+  /* FIXME:  Should have better way to test floating point range */
+  if (regnum >= FP0_REGNUM && regnum <= (FP0_REGNUM + 7)) 
     {
-      int ubase, fpstate;
-      struct user u;
-      ubase = blockend + 4 * (SS + 1) - KSTKSZ;
-      fpstate = ubase + ((char *)&u.u_fpstate - (char *)&u);
+#ifdef KSTKSZ  /* SCO, and others? */
+      ubase += 4 * (SS + 1) - KSTKSZ;
+      fpstate = ubase + ((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);
+      return (fpstate + 10 * (regnum - FP0_REGNUM));
+#endif
     } 
   else
-#endif
-    return (blockend + 4 * regmap[regnum]);
+    {
+      return (ubase + 4 * regmap[regnum]);
+    }
   
 }
 \f
-#ifdef TARGET_CAN_USE_HARDWARE_WATCHPOINT
+int
+kernel_u_size ()
+{
+  return (sizeof (struct user));
+}
+\f
+#ifdef TARGET_HAS_HARDWARE_WATCHPOINTS
 
 #if !defined (offsetof)
 #define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
@@ -101,11 +112,12 @@ static int debug_control_mirror;
 static CORE_ADDR address_lookup[DR_LASTADDR - DR_FIRSTADDR + 1];
 
 static int
-i386_insert_nonaligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
+i386_insert_aligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
                                           int));
 
 static int
-i386_insert_aligned_watchpoint PARAMS ((pid, addr, len, rw));
+i386_insert_nonaligned_watchpoint PARAMS ((int, CORE_ADDR, CORE_ADDR, int,
+                                          int));
 
 /* Insert a watchpoint.  */
 
@@ -210,7 +222,7 @@ i386_insert_nonaligned_watchpoint (pid, waddr, addr, len, rw)
       size = (len > 4) ? 3 : len - 1;
       size = size_try_array[size * 4 + align];
 
-      rv = i386_insert_watchpoint (pid, waddr, addr, size, rw);
+      rv = i386_insert_aligned_watchpoint (pid, waddr, addr, size, rw);
       if (rv)
        {
          i386_remove_watchpoint (pid, waddr, size);
@@ -271,7 +283,7 @@ i386_stopped_by_watchpoint (pid)
   return 0;
 }
 
-#endif /* TARGET_CAN_USE_HARDWARE_WATCHPOINT */
+#endif /* TARGET_HAS_HARDWARE_WATCHPOINTS */
 
 #if 0
 /* using FLOAT_INFO as is would be a problem.  FLOAT_INFO is called
This page took 0.027383 seconds and 4 git commands to generate.