This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RFA: Patches to add i387 support to Solaris x86 platforms once again.


I'd really like to see i387 support in Solaris x86 for GDB 5.0.
Here is my current version of the patches:

2000-04-08  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>

	* config/i386/tm-i386sol2.h (HAVE_I387_REGS):  Define.
	* i386v4-nat.c (supply_fpregset, fill_fpregset):  Add code
	to handle floating point registers if NUM_FREGS is not zero.

--- ./config/i386/tm-i386sol2.h.orig	Fri Apr  7 18:29:47 2000
+++ ./config/i386/tm-i386sol2.h	Fri Apr  7 18:50:29 2000
@@ -21,6 +21,7 @@
 #ifndef TM_I386SOL2_H
 #define TM_I386SOL2_H 1
 
+#define HAVE_I387_REGS
 #include "i386/tm-i386v4.h"
 
 /* Signal handler frames under Solaris 2 are recognized by a return address
--- ./i386v4-nat.c.orig	Wed Jul  7 22:07:05 1999
+++ ./i386v4-nat.c	Fri Apr  7 18:57:01 2000
@@ -142,17 +142,65 @@ fill_gregset (gregsetp, regno)
 
 #endif /* HAVE_GREGSET_T */
 
-#if defined (FP0_REGNUM) && defined (HAVE_FPREGSET_T)
+#if defined (HAVE_FPREGSET_T)
 
 /*  Given a pointer to a floating point register set in /proc format
    (fpregset_t *), unpack the register contents and supply them as gdb's
    idea of the current floating point register values. */
 
+/* FIXME: Assumes that fpregsetp contains an i387 FSAVE area. */
+static const int freg_offset_map[] =
+{
+#if !defined(FPREGSET_FSAVE_OFFSET)
+#define FPREGSET_FSAVE_OFFSET	0
+#endif
+  FPREGSET_FSAVE_OFFSET + 28 + 0 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 1 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 2 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 3 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 4 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 5 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 6 * 10,
+  FPREGSET_FSAVE_OFFSET + 28 + 7 * 10,
+  FPREGSET_FSAVE_OFFSET + 0,
+  FPREGSET_FSAVE_OFFSET + 4,
+  FPREGSET_FSAVE_OFFSET + 8,
+  FPREGSET_FSAVE_OFFSET + 16,
+  FPREGSET_FSAVE_OFFSET + 12,
+  FPREGSET_FSAVE_OFFSET + 24,
+  FPREGSET_FSAVE_OFFSET + 20,
+  FPREGSET_FSAVE_OFFSET + 16
+};
+
 void
 supply_fpregset (fpregsetp)
      fpregset_t *fpregsetp;
 {
-  /* FIXME: see m68k-tdep.c for an example, for the m68k. */
+  int regi;
+  
+  if (NUM_FREGS == 0)
+    return;
+  for (regi = FP0_REGNUM; regi <= LAST_FPU_CTRL_REGNUM; regi++)
+    {
+      char tbuf[4];
+      ULONGEST tval;
+      char *from = (char *) fpregsetp + freg_offset_map[regi - FP0_REGNUM];
+
+      if (regi == FCS_REGNUM)
+	{
+	  tval = extract_unsigned_integer (from, 4) & 0xffff;
+	  store_unsigned_integer (tbuf, 4, tval);
+	  supply_register (regi, tbuf);
+	}
+      else if (regi == FOP_REGNUM)
+	{
+	  tval = (extract_unsigned_integer (from, 4) >> 16) & ((1 << 11) - 1);
+	  store_unsigned_integer (tbuf, 4, tval);
+	  supply_register (regi, tbuf);
+	}
+      else
+	supply_register (regi, from);
+    }
 }
 
 /*  Given a pointer to a floating point register set in /proc format
@@ -165,9 +213,41 @@ fill_fpregset (fpregsetp, regno)
      fpregset_t *fpregsetp;
      int regno;
 {
-  /* FIXME: see m68k-tdep.c for an example, for the m68k. */
+  int regi;
+
+  if (NUM_FREGS == 0)
+    return;
+  for (regi = FP0_REGNUM; regi <= LAST_FPU_CTRL_REGNUM; regi++)
+    {
+      if ((regno == -1) || (regno == regi))
+	{
+	  char *to = (char *) fpregsetp + freg_offset_map[regi - FP0_REGNUM];
+	  char *from = (char *) &registers[REGISTER_BYTE (regi)];
+	  ULONGEST valto;
+	  ULONGEST valfrom;
+
+	  if (regi == FCS_REGNUM)
+	    {
+	      valto = extract_unsigned_integer (to, 4);
+	      valfrom = extract_unsigned_integer (from, 4);
+	      valto = (valto & ~0xffff) | (valfrom & 0xffff);
+	      store_unsigned_integer (to, 4, valto);
+	    }
+	  else if (regi == FOP_REGNUM)
+	    {
+	      valto = extract_unsigned_integer (to, 4);
+	      valfrom = extract_unsigned_integer (from, 4);
+	      valto = (valto & 0xffff) | ((valfrom & ((1 << 11) - 1)) << 16);
+	      store_unsigned_integer (to, 4, valto);
+	    }
+	  else
+	    {
+	      memcpy (to, from, REGISTER_RAW_SIZE (regi));
+	    }
+	}
+    }
 }
 
-#endif /* defined (FP0_REGNUM) && defined (HAVE_FPREGSET_T) */
+#endif /* defined (HAVE_FPREGSET_T) */
 
 #endif /* HAVE_SYS_PROCFS_H */

-- 
Peter Schauer			pes@regent.e-technik.tu-muenchen.de

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]