This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] arm-tdep.c: deal with failed memory read
- From: Elena Zannoni <ezannoni at cygnus dot com>
- To: Andrew Cagney <ac131313 at cygnus dot com>
- Cc: Elena Zannoni <ezannoni at cygnus dot com>, Fernando Nasser <fnasser at cygnus dot com>, gdb-patches at sources dot redhat dot com
- Date: Wed, 5 Dec 2001 17:47:05 -0500
- Subject: Re: [RFA] arm-tdep.c: deal with failed memory read
- References: <15356.17915.602742.140302@krustylu.cygnus.com><3BFEB3EB.816139A1@cygnus.com><3C04615A.7020304@cygnus.com>
Andrew Cagney writes:
> > Elena Zannoni wrote:
> >
> >>
> >> If, upon initial connection to a remote ARM target, the contents of
> >> r11 (which is the Frame Pointer) are junk, a memory read from
> >> arm_scan_prologue can fail and abort the whole connection to the
> >> remote target. There are several ways to fix this, and probably the
> >> most correct one is to teach gdb to do the initial connection in 2
> >> separate steps. First connect and declare that successful or not, then
> >> start reading memory if the connection was established.
> >>
> >> This patch is just a band-aid to allow intercepting bad memory reads
> >> and not aborting the connection. It has been in our internal
> >> repository for a couple of months now. It is by no means a complete
> >> solution, but it improves things a bit.
> >>
> >> OK?
> >>
> >
> >
> > The arm-tdep.c part is approved.
>
> We desperatly need a better naming convention and clearer semantics
> (what happens if the function fails due to a target disconnect) for
> these wrapped functions. gdb_*() is being used by both libgdb and
> wrapper.[hc] et.al.
>
> Suggestions?
I can change the name of the functions in wrapper (and this one) to
something like safe_read_memory_integer if that's a name people prefer.
I can submit separate patches to do the other functions.
Elena
>
> Otherwize ok.
>
> Andrew
>
>
> >> Elena
> >>
> >> 2001-11-21 Elena Zannoni <ezannoni@redhat.com>
> >>
> >> * corefile.c (do_captured_read_memory_integer,
> >> gdb_read_memory_integer): New functions.
> >> * gdbcore.h (gdb_read_memory_integer): Export.
> >> * arm-tdep.c (arm_scan_prologue): Use gdb_read_memory_integer,
> >> to read the frame value, to capture calls to error().
> >>
> >> Index: arm-tdep.c
> >> ===================================================================
> >> RCS file: /cvs/uberbaum/gdb/arm-tdep.c,v
> >> retrieving revision 1.17
> >> diff -u -p -r1.17 arm-tdep.c
> >> --- arm-tdep.c 2001/11/14 08:18:32 1.17
> >> +++ arm-tdep.c 2001/11/22 00:08:28
> >> @@ -717,6 +717,7 @@ static void
> >> arm_scan_prologue (struct frame_info *fi)
> >> {
> >> int regno, sp_offset, fp_offset;
> >> + LONGEST return_value;
> >> CORE_ADDR prologue_start, prologue_end, current_pc;
> >>
> >> /* Check if this function is already in the cache of frame information. */
> >> @@ -781,9 +782,13 @@ arm_scan_prologue (struct frame_info *fi
> >> {
> >> /* Get address of the stmfd in the prologue of the callee; the saved
> >> PC is the address of the stmfd + 8. */
> >> - prologue_start = ADDR_BITS_REMOVE (read_memory_integer (fi->frame, 4))
> >> - - 8;
> >> - prologue_end = prologue_start + 64; /* See above. */
> >> + if (!gdb_read_memory_integer (fi->frame, 4, &return_value))
> >> + return;
> >> + else
> >> + {
> >> + prologue_start = ADDR_BITS_REMOVE (return_value) - 8;
> >> + prologue_end = prologue_start + 64; /* See above. */
> >> + }
> >> }
> >>
> >> /* Now search the prologue looking for instructions that set up the
> >> Index: corefile.c
> >> ===================================================================
> >> RCS file: /cvs/uberbaum/gdb/corefile.c,v
> >> retrieving revision 1.15
> >> diff -u -p -r1.15 corefile.c
> >> --- corefile.c 2001/11/12 21:08:04 1.15
> >> +++ corefile.c 2001/11/22 00:08:50
> >> @@ -262,6 +262,41 @@ dis_asm_print_address (bfd_vma addr, str
> >>
> >> /* Read an integer from debugged memory, given address and number of bytes. */
> >>
> >> +struct captured_read_memory_integer_arguments
> >> +{
> >> + CORE_ADDR memaddr;
> >> + int len;
> >> + LONGEST result;
> >> +};
> >> +
> >> +static int
> >> +do_captured_read_memory_integer (void *data)
> >> +{
> >> + struct captured_read_memory_integer_arguments *args = (struct captured_read_memory_integer_arguments*) data
> >> ;
> >> + CORE_ADDR memaddr = args->memaddr;
> >> + int len = args->len;
> >> +
> >> + args->result = read_memory_integer (memaddr, len);
> >> +
> >> + return 0;
> >> +}
> >> +
> >> +int
> >> +gdb_read_memory_integer (CORE_ADDR memaddr, int len, LONGEST *return_value)
> >> +{
> >> + int status;
> >> + struct captured_read_memory_integer_arguments args;
> >> + args.memaddr = memaddr;
> >> + args.len = len;
> >> +
> >> + status = catch_errors (do_captured_read_memory_integer, &args,
> >> + "", RETURN_MASK_ALL);
> >> + if (!status)
> >> + *return_value = args.result;
> >> +
> >> + return status;
> >> +}
> >> +
> >> LONGEST
> >> read_memory_integer (CORE_ADDR memaddr, int len)
> >> {
> >> Index: gdbcore.h
> >
>