* go32-nat.c: Include i387-nat.h.
authorEli Zaretskii <eliz@gnu.org>
Sun, 18 Feb 2001 07:22:17 +0000 (07:22 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sun, 18 Feb 2001 07:22:17 +0000 (07:22 +0000)
(fetch_register): New function, uses some of the guts of
go32_fetch_registers and i387_supply_register.
(go32_fetch_registers): Most of the code moved into
fetch_register.  Use i387_supply_fsave.
(store_register): Use i387_fill_fsave instead of custom code.
(go32_store_registers): Use i387_fill_fsave.

* Makefile.in (go32-nat.o): Depend on i387-nat.h.

* config/i386/go32.mh (NATDEPFILES): Add i387-nat.o.

gdb/ChangeLog
gdb/Makefile.in
gdb/config/i386/go32.mh
gdb/go32-nat.c

index 2115929304b6f2c7f740ce0b4b808c5267dac62e..3623e027daf7d1c3c68122a174fb799c8f5a8e81 100644 (file)
@@ -1,5 +1,17 @@
 2001-02-18  Eli Zaretskii  <eliz@is.elta.co.il>
 
+       * go32-nat.c: Include i387-nat.h.
+       (fetch_register): New function, uses some of the guts of
+       go32_fetch_registers and calls i387_supply_register.
+       (go32_fetch_registers): Most of the code moved into
+       fetch_register.  Use i387_supply_fsave.
+       (store_register): Use i387_fill_fsave instead of custom code.
+       (go32_store_registers): Use i387_fill_fsave.
+
+       * Makefile.in (go32-nat.o): Depend on i387-nat.h.
+
+       * config/i386/go32.mh (NATDEPFILES): Add i387-nat.o.
+
        * completer.c (gdb_completer_file_name_break_characters): Remove
        slash from file-name break characters.
        [__MSDOS__]: Special definition for DOS/Windows file names.
index 2c471353962f9d0e36fc2aadd57cb57d66c4748b..1ff8398aa0b106c5a3f15350901c0840b676e5e4 100644 (file)
@@ -1450,7 +1450,7 @@ gdbtypes.o: gdbtypes.c $(bfd_h) complaints.h $(defs_h) $(expression_h) \
        $(value_h) gdb_string.h wrapper.h
 
 go32-nat.o: go32-nat.c $(defs_h) $(inferior_h) gdb_wait.h $(gdbcore_h) \
-       $(command_h) $(floatformat_h) target.h
+       $(command_h) $(floatformat_h) target.h i387-nat.h
 
 gnu-nat.o: process_reply_S.h exc_request_S.h notify_S.h msg_reply_S.h \
        exc_request_U.h msg_U.h gnu-nat.h
index ce6c5324e2e43fabe6495b5de813f3c4bb48ce78..a1c673d8951e5fd5b5ea621c16567da841555e0b 100644 (file)
@@ -8,7 +8,7 @@ XM_FILE= xm-go32.h
 XDEPFILES=
 
 NAT_FILE= nm-go32.h
-NATDEPFILES= go32-nat.o
+NATDEPFILES= go32-nat.o i387-nat.o
 
 TERMCAP= 
 HOST_IPC=
index 885662be76e624ce033872f5e3497744aed71f5f..582ff1626ffa3085cc64d064e4d94860aeecc3e4 100644 (file)
@@ -28,6 +28,7 @@
 #include "command.h"
 #include "floatformat.h"
 #include "buildsym.h"
+#include "i387-nat.h"
 
 #include <stdio.h>             /* required for __DJGPP_MINOR__ */
 #include <stdlib.h>
@@ -450,55 +451,27 @@ go32_wait (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *status)
 }
 
 static void
-go32_fetch_registers (int regno)
+fetch_register (int regno)
 {
-  /*JHW */
-  int end_reg = regno + 1;     /* just one reg initially */
-
-  if (regno < 0)               /* do the all registers */
-    {
-      regno = 0;               /* start at first register */
-      /* # regs in table */
-      end_reg = sizeof (regno_mapping) / sizeof (regno_mapping[0]);
-    }
+  if (regno < FP0_REGNUM)
+    supply_register (regno, (char *) &a_tss + regno_mapping[regno].tss_ofs);
+  else if (regno <= LAST_FPU_CTRL_REGNUM)
+    i387_supply_register (regno, (char *) &npx);
+  else
+    internal_error (__FILE__, __LINE__,
+                   "Invalid register no. %d in fetch_register.", regno);
+}
 
-  for (; regno < end_reg; regno++)
+static void
+go32_fetch_registers (int regno)
+{
+  if (regno >= 0)
+    fetch_register (regno);
+  else
     {
-      if (regno < 16)
-       supply_register (regno,
-                        (char *) &a_tss + regno_mapping[regno].tss_ofs);
-      else if (regno < 24)
-       supply_register (regno,
-                        (char *) &npx.reg[regno_mapping[regno].tss_ofs]);
-      else if (regno < 32)
-       {
-         unsigned regval;
-
-         switch (regno_mapping[regno].size)
-           {
-             case 2:
-               regval = *(unsigned short *)
-                 ((char *) &npx + regno_mapping[regno].tss_ofs);
-               regval &= 0xffff;
-               if (regno == FOP_REGNUM && regval)
-                 /* Feature: restore the 5 bits of the opcode
-                    stripped by FSAVE/FNSAVE.  */
-                 regval |= 0xd800;
-               break;
-             case 4:
-               regval = *(unsigned *)
-                 ((char *) &npx + regno_mapping[regno].tss_ofs);
-               break;
-             default:
-               internal_error (__FILE__, __LINE__, "\
-Invalid native size for register no. %d in go32_fetch_register.", regno);
-           }
-         supply_register (regno, (char *) &regval);
-       }
-      else
-       internal_error (__FILE__, __LINE__,
-                       "Invalid register no. %d in go32_fetch_register.",
-                       regno);
+      for (regno = 0; regno < FP0_REGNUM; regno++)
+       fetch_register (regno);
+      i387_supply_fsave ((char *) &npx);
     }
 }
 
@@ -508,18 +481,14 @@ store_register (int regno)
   void *rp;
   void *v = (void *) &registers[REGISTER_BYTE (regno)];
 
-  if (regno < 16)
-    rp = (char *) &a_tss + regno_mapping[regno].tss_ofs;
-  else if (regno < 24)
-    rp = (char *) &npx.reg[regno_mapping[regno].tss_ofs];
-  else if (regno < 32)
-    rp = (char *) &npx + regno_mapping[regno].tss_ofs;
+  if (regno < FP0_REGNUM)
+    memcpy ((char *) &a_tss + regno_mapping[regno].tss_ofs,
+           v, regno_mapping[regno].size);
+  else if (regno <= LAST_FPU_CTRL_REGNUM)
+    i387_fill_fsave ((char *)&npx, regno);
   else
     internal_error (__FILE__, __LINE__,
                    "Invalid register no. %d in store_register.", regno);
-  memcpy (rp, v, regno_mapping[regno].size);
-  if (regno == FOP_REGNUM)
-    *(short *)rp &= 0x07ff; /* strip high 5 bits, in case they added them */
 }
 
 static void
@@ -531,8 +500,9 @@ go32_store_registers (int regno)
     store_register (regno);
   else
     {
-      for (r = 0; r < sizeof (regno_mapping) / sizeof (regno_mapping[0]); r++)
+      for (r = 0; r < FP0_REGNUM; r++)
        store_register (r);
+      i387_fill_fsave ((char *) &npx, -1);
     }
 }