From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30353 invoked by alias); 5 Dec 2001 22:41:02 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 30256 invoked from network); 5 Dec 2001 22:40:59 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 5 Dec 2001 22:40:59 -0000 Received: from rtl.cygnus.com (cse.cygnus.com [205.180.230.236]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id OAA26197; Wed, 5 Dec 2001 14:40:55 -0800 (PST) Received: (from ezannoni@localhost) by rtl.cygnus.com (8.11.2/8.11.0) id fB5Ml5u06319; Wed, 5 Dec 2001 17:47:05 -0500 X-Authentication-Warning: krustylu.cygnus.com: ezannoni set sender to ezannoni@cygnus.com using -f From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15374.41961.369914.120062@krustylu.cygnus.com> Date: Wed, 05 Dec 2001 14:41:00 -0000 To: Andrew Cagney Cc: Elena Zannoni , Fernando Nasser , gdb-patches@sources.redhat.com Subject: Re: [RFA] arm-tdep.c: deal with failed memory read In-Reply-To: <3C04615A.7020304@cygnus.com> References: <15356.17915.602742.140302@krustylu.cygnus.com> <3BFEB3EB.816139A1@cygnus.com> <3C04615A.7020304@cygnus.com> X-Mailer: VM 6.97 under Emacs 20.7.1 X-SW-Source: 2001-12/txt/msg00158.txt.bz2 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 > >> > >> * 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 > > >