This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [PATCH] Add support for fpscr for Power / PowerPC targets
On Thu, Apr 11, 2002 at 01:10:16PM -0700, Kevin Buettner wrote:
> On Apr 11, 3:25pm, Daniel Jacobowitz wrote:
> > What versions are we talking here?
>
> 2.2.X, for X <= 15. Probably for X > 15 too, but I haven't checked.
> I don't think the 2.4 kernels have this problem though.
>
> > Is it worth silencing the gdbserver warning in this case?
>
> If it's only a warning, it probably doesn't hurt to leave it in,
> though it'd be nice to structure it so that the warning is only
> printed once.
>
> I would have preferred to not to have to add the above code to
> ppc-linux-nat.c, but I was seeing too many regressions without it and
> that made it difficult to evaluate the patch. It was worth it to add
> the above code though because I ended up catching some regressions
> that I would've missed otherwise. (I probably ought to just upgrade
> my Linux/PPC box...)
OK, I'll silence the warning, I think. That's easier. Committed.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
2002-04-11 Daniel Jacobowitz <drow@mvista.com>
* gdbserver/linux-low.c (usr_store_inferior_registers): Support
registers which are allowed to fail to store.
* gdbserver/linux-low.h (linux_target_ops): Likewise.
* gdbserver/linux-ppc-low.c (ppc_regmap): Support FPSCR.
(ppc_cannot_store_register): FPSCR may not be storable.
* regformats/reg-ppc.dat: Support FPSCR.
Index: gdbserver/linux-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v
retrieving revision 1.13
diff -u -p -r1.13 linux-low.c
--- gdbserver/linux-low.c 9 Apr 2002 23:52:05 -0000 1.13
+++ gdbserver/linux-low.c 11 Apr 2002 20:19:58 -0000
@@ -240,7 +240,7 @@ usr_store_inferior_registers (int regno)
if (regno >= the_low_target.num_regs)
return;
- if ((*the_low_target.cannot_store_register) (regno))
+ if ((*the_low_target.cannot_store_register) (regno) == 1)
return;
regaddr = register_addr (regno);
@@ -254,14 +254,15 @@ usr_store_inferior_registers (int regno)
*(int *) (register_data (regno) + i));
if (errno != 0)
{
- /* Warning, not error, in case we are attached; sometimes the
- kernel doesn't let us at the registers. */
- char *err = strerror (errno);
- char *msg = alloca (strlen (err) + 128);
- sprintf (msg, "writing register %d: %s",
- regno, err);
- error (msg);
- return;
+ if ((*the_low_target.cannot_store_register) (regno) == 0)
+ {
+ char *err = strerror (errno);
+ char *msg = alloca (strlen (err) + 128);
+ sprintf (msg, "writing register %d: %s",
+ regno, err);
+ error (msg);
+ return;
+ }
}
regaddr += sizeof (int);
}
Index: gdbserver/linux-low.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.h,v
retrieving revision 1.3
diff -u -p -r1.3 linux-low.h
--- gdbserver/linux-low.h 9 Apr 2002 22:44:43 -0000 1.3
+++ gdbserver/linux-low.h 11 Apr 2002 20:19:58 -0000
@@ -34,6 +34,10 @@ struct linux_target_ops
int num_regs;
int *regmap;
int (*cannot_fetch_register) (int);
+
+ /* Returns 0 if we can store the register, 1 if we can not
+ store the register, and 2 if failure to store the register
+ is acceptable. */
int (*cannot_store_register) (int);
};
Index: gdbserver/linux-ppc-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-ppc-low.c,v
retrieving revision 1.3
diff -u -p -r1.3 linux-ppc-low.c
--- gdbserver/linux-ppc-low.c 9 Apr 2002 22:44:43 -0000 1.3
+++ gdbserver/linux-ppc-low.c 11 Apr 2002 20:19:58 -0000
@@ -46,11 +46,15 @@ static int ppc_regmap[] =
PT_FPR0*4+192, PT_FPR0*4+200, PT_FPR0*4+208, PT_FPR0*4+216,
PT_FPR0*4+224, PT_FPR0*4+232, PT_FPR0*4+240, PT_FPR0*4+248,
PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4,
- PT_CTR * 4, PT_XER * 4, -1, };
+ PT_CTR * 4, PT_XER * 4, PT_FPSCR * 4, };
static int
ppc_cannot_store_register (int regno)
{
+ /* Some kernels do not allow us to store fpscr. */
+ if (regno == find_regno ("fpscr"))
+ return 2;
+
return 0;
}
Index: regformats/reg-ppc.dat
===================================================================
RCS file: /cvs/src/src/gdb/regformats/reg-ppc.dat,v
retrieving revision 1.1
diff -u -p -r1.1 reg-ppc.dat
--- regformats/reg-ppc.dat 1 Feb 2002 22:05:28 -0000 1.1
+++ regformats/reg-ppc.dat 11 Apr 2002 20:19:58 -0000
@@ -73,4 +73,4 @@ expedite:r1,pc
32:lr
32:ctr
32:xer
-0:
+32:fpscr