This is the mail archive of the gdb@sources.redhat.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]
Other format: [Raw text]

Re: Bizarre internal errors in regcache


   Date: Mon, 26 Aug 2002 15:52:47 -0400
   From: Daniel Jacobowitz <drow@mvista.com>

   On Mon, Aug 26, 2002 at 02:56:39PM -0400, Daniel Jacobowitz wrote:
   > I see this error on my laptop but not on my desktop; both current trees,
   > both rebuilt from scratch, both i386-linux.  Any ideas?

   [ snip ]

   My desktop has SSE, my laptop doesn't, it seems.  We can't call
   supply_register on an MMX register if we don't have any. 
   dummy_sse_registers seems to be the culprit.

Hmm, and my desktop sort of pretends it has the SSE registers.

Anyway, I'm pretty certain that the problem is caused by the fact that
the binary produced by the gdb.asm test isn't branded.  Therefore GDB
doesn't select the Linux OS/ABI but the generic OS/ABI which doesn't
include the SSE regs.  Since you're running on Linux, the native code
tries to supply these registers anyway.  i387_supply_fxsave() does
deal with this gracefully, but dummy_sse_regs() doesn't.

Can you try the attached patch?

Note that I'm still open to suggestions on what registers to include
in any of the i386 OS/ABI variants.  Ideally we would let the user
choose somehow.  For now I selected something that most closely
resembles what we did in previous GDB releases, although there are
some differences.  For example, on Linux, you'll always get the SSE
registers now.

Any thoughts?

Mark

Index: i386-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-nat.c,v
retrieving revision 1.40
diff -u -p -r1.40 i386-linux-nat.c
--- i386-linux-nat.c 15 Jun 2002 16:43:54 -0000 1.40
+++ i386-linux-nat.c 26 Aug 2002 20:11:48 -0000
@@ -540,15 +540,17 @@ store_fpxregs (int tid, int regno)
 static void
 dummy_sse_values (void)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
   /* C doesn't have a syntax for NaN's, so write it out as an array of
      longs.  */
   static long dummy[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff };
   static long mxcsr = 0x1f80;
   int reg;
 
-  for (reg = 0; reg < 8; reg++)
+  for (reg = 0; reg < tdep->num_xmm_regs; reg++)
     supply_register (XMM0_REGNUM + reg, (char *) dummy);
-  supply_register (MXCSR_REGNUM, (char *) &mxcsr);
+  if (tdep->num_xmm_regs > 0)
+    supply_register (MXCSR_REGNUM, (char *) &mxcsr);
 }
 
 #else


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