2002-04-11 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Thu, 11 Apr 2002 20:30:08 +0000 (20:30 +0000)
committerDaniel Jacobowitz <drow@false.org>
Thu, 11 Apr 2002 20:30:08 +0000 (20:30 +0000)
        * 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.

gdb/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-low.h
gdb/gdbserver/linux-ppc-low.c
gdb/regformats/reg-ppc.dat

index dd24b74..90075b5 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2002-04-11  Kevin Buettner  <kevinb@redhat.com>
 
        * ppc-tdep.h (struct gdbarch_tdep): Add new field ``ppc_fpscr_regnum''.
index 8c729df..bd1a876 100644 (file)
@@ -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 0d0050d..e485a8e 100644 (file)
@@ -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 e626eab..7cb315a 100644 (file)
@@ -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 d915996..d7f9b88 100644 (file)
@@ -73,4 +73,4 @@ expedite:r1,pc
 32:lr
 32:ctr
 32:xer
-0:
+32:fpscr