Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] Fix i386 FPU register conversion code
@ 2001-07-28  9:49 Mark Kettenis
  2001-07-28 12:49 ` Michael Snyder
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Kettenis @ 2001-07-28  9:49 UTC (permalink / raw)
  To: gdb-patches

Fixing the debug register number mapping scheme uncovered a bug in
i386-tdep.c:i386_register_convert_to_virtual().  Fixed with the
attached patch.

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* i386-tdep.c: Include "gdb_assert.h"
	(i386_register_convert_to_virtual): Fix such that it can handle
	conversion to any floating-point type.  Assert that we are dealing
	with a floating-point first.
	(i386_register_convert_to_raw): Assert that TYPE is a
	floating-point type with length 12.

Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.34
diff -u -p -r1.34 i386-tdep.c
--- i386-tdep.c 2001/07/15 20:10:02 1.34
+++ i386-tdep.c 2001/07/28 16:45:41
@@ -33,6 +33,8 @@
 #include "arch-utils.h"
 #include "regcache.h"
 
+#include "gdb_assert.h"
+
 /* i386_register_byte[i] is the offset into the register file of the
    start of register number i.  We initialize this from
    i386_register_raw_size.  */
@@ -972,27 +974,39 @@ i386_register_convertible (int regnum)
 }
 
 /* Convert data from raw format for register REGNUM in buffer FROM to
-   virtual format with type TYPE in buffer TO.  In principle both
-   formats are identical except that the virtual format has two extra
-   bytes appended that aren't used.  We set these to zero.  */
+   virtual format with type TYPE in buffer TO.  */
 
 void
 i386_register_convert_to_virtual (int regnum, struct type *type,
 				  char *from, char *to)
 {
-  /* Copy straight over, but take care of the padding.  */
-  memcpy (to, from, FPU_REG_RAW_SIZE);
-  memset (to + FPU_REG_RAW_SIZE, 0, TYPE_LENGTH (type) - FPU_REG_RAW_SIZE);
+  char buf[12];
+  DOUBLEST d;
+
+  /* We only support floating-point values.  */
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
+
+  /* First add the necessary padding.  */
+  memcpy (buf, from, FPU_REG_RAW_SIZE);
+  memset (buf + FPU_REG_RAW_SIZE, 0, sizeof buf - FPU_REG_RAW_SIZE);
+
+  /* Convert to TYPE.  This should be a no-op, if TYPE is equivalent
+     to the extended floating-point format used by the FPU.  */
+  d = extract_floating (buf, sizeof buf);
+  store_floating (to, TYPE_LENGTH (type), d);
 }
 
 /* Convert data from virtual format with type TYPE in buffer FROM to
-   raw format for register REGNUM in buffer TO.  Simply omit the two
-   unused bytes.  */
+   raw format for register REGNUM in buffer TO.  */
 
 void
 i386_register_convert_to_raw (struct type *type, int regnum,
 			      char *from, char *to)
 {
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT
+	      && TYPE_LENGTH (type) == 12);
+
+  /* Simply omit the two unused bytes.  */
   memcpy (to, from, FPU_REG_RAW_SIZE);
 }
 \f     


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2001-07-30 14:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-07-28  9:49 [PATCH] Fix i386 FPU register conversion code Mark Kettenis
2001-07-28 12:49 ` Michael Snyder
2001-07-28 13:53   ` Mark Kettenis
2001-07-30 10:35     ` Michael Snyder
     [not found]     ` <3B633A59.6030009@cygnus.com>
2001-07-30 10:36       ` Michael Snyder
2001-07-30 14:42         ` Mark Kettenis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox