This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFC] remote-mips.c: Don't error out when a memory read fails
On Sat, 6 Mar 2010 08:05:35 +0400
Joel Brobecker <brobecker@adacore.com> wrote:
> > * remote-mips.c (mips_fetch_word): Add new parameter, `valp'.
> > Change return value to int. Store value fetched in location
> > addressed by `val'. Use function's return value as success
> > or failure indicator. Adjust all callers.
>
> Looks good to me.
Thanks for looking it over.
> > +static int
> > +mips_fetch_word (CORE_ADDR addr, unsigned int *valp)
> > {
> > unsigned int val;
>
> I think that this variable is no longer used?
Right you are. See below for a revised patch. The only change from
the earlier patch is that `val' is removed from mips_fetch_word().
Thanks again,
Kevin
* remote-mips.c (mips_fetch_word): Add new parameter, `valp'.
Change return value to int. Store value fetched in location
addressed by `val'. Use function's return value as success
or failure indicator. Adjust all callers.
Index: remote-mips.c
===================================================================
RCS file: /cvs/src/src/gdb/remote-mips.c,v
retrieving revision 1.109
diff -u -p -r1.109 remote-mips.c
--- remote-mips.c 5 Mar 2010 16:18:54 -0000 1.109
+++ remote-mips.c 6 Mar 2010 05:58:41 -0000
@@ -91,7 +91,7 @@ static int mips_map_regno (struct gdbarc
static void mips_prepare_to_store (struct regcache *regcache);
-static unsigned int mips_fetch_word (CORE_ADDR addr);
+static int mips_fetch_word (CORE_ADDR addr, unsigned int *valp);
static int mips_store_word (CORE_ADDR addr, unsigned int value,
int *old_contents);
@@ -1994,25 +1994,23 @@ mips_store_registers (struct target_ops
mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
}
-/* Fetch a word from the target board. */
+/* Fetch a word from the target board. Return word fetched in location
+ addressed by VALP. Return 0 when successful; return positive error
+ code when not. */
-static unsigned int
-mips_fetch_word (CORE_ADDR addr)
+static int
+mips_fetch_word (CORE_ADDR addr, unsigned int *valp)
{
- unsigned int val;
int err;
- val = mips_request ('d', addr, 0, &err, mips_receive_wait, NULL);
+ *valp = mips_request ('d', addr, 0, &err, mips_receive_wait, NULL);
if (err)
{
/* Data space failed; try instruction space. */
- val = mips_request ('i', addr, 0, &err,
- mips_receive_wait, NULL);
- if (err)
- mips_error ("Can't read address %s: %s",
- paddress (target_gdbarch, addr), safe_strerror (errno));
+ *valp = mips_request ('i', addr, 0, &err,
+ mips_receive_wait, NULL);
}
- return val;
+ return err;
}
/* Store a word to the target board. Returns errno code or zero for
@@ -2078,17 +2076,25 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb
/* Fill start and end extra bytes of buffer with existing data. */
if (addr != memaddr || len < 4)
{
+ unsigned int val;
+
+ if (mips_fetch_word (addr, &val))
+ return 0;
+
/* Need part of initial word -- fetch it. */
- store_unsigned_integer (&buffer[0], 4, byte_order,
- mips_fetch_word (addr));
+ store_unsigned_integer (&buffer[0], 4, byte_order, val);
}
if (count > 1)
{
+ unsigned int val;
+
/* Need part of last word -- fetch it. FIXME: we do this even
if we don't need it. */
- store_unsigned_integer (&buffer[(count - 1) * 4], 4, byte_order,
- mips_fetch_word (addr + (count - 1) * 4));
+ if (mips_fetch_word (addr + (count - 1) * 4, &val))
+ return 0;
+
+ store_unsigned_integer (&buffer[(count - 1) * 4], 4, byte_order, val);
}
/* Copy data to be written over corresponding part of buffer */
@@ -2123,8 +2129,12 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb
/* Read all the longwords */
for (i = 0; i < count; i++, addr += 4)
{
- store_unsigned_integer (&buffer[i * 4], 4, byte_order,
- mips_fetch_word (addr));
+ unsigned int val;
+
+ if (mips_fetch_word (addr, &val))
+ return 0;
+
+ store_unsigned_integer (&buffer[i * 4], 4, byte_order, val);
QUIT;
}