This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] arm-tdep.c: deal with failed memory read


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
 > > 
 > 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]