Re: Bizarre internal errors in regcache

Mark Kettenis
2002-08-26T20:28:20Z

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