From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7416 invoked by alias); 23 Nov 2001 20:39:22 -0000 Mailing-List: contact gdb-patches-help@sourceware.cygnus.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 7373 invoked from network); 23 Nov 2001 20:39:13 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sourceware.cygnus.com with SMTP; 23 Nov 2001 20:39:13 -0000 Received: from cygnus.com (totem.toronto.redhat.com [172.16.14.242]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id MAA00734; Fri, 23 Nov 2001 12:39:11 -0800 (PST) Message-ID: <3BFEB3EB.816139A1@cygnus.com> Date: Sat, 10 Nov 2001 10:13:00 -0000 From: Fernando Nasser Organization: Red Hat , Inc. - Toronto X-Mailer: Mozilla 4.77 [en] (X11; U; Linux 2.4.3-12smp i686) X-Accept-Language: en MIME-Version: 1.0 To: Elena Zannoni CC: gdb-patches@sources.redhat.com Subject: Re: [RFA] arm-tdep.c: deal with failed memory read References: <15356.17915.602742.140302@krustylu.cygnus.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2001-11/txt/msg00198.txt.bz2 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. Fernando > 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 > =================================================================== > RCS file: /cvs/uberbaum/gdb/gdbcore.h,v > retrieving revision 1.8 > diff -u -p -r1.8 gdbcore.h > --- gdbcore.h 2001/11/12 21:08:04 1.8 > +++ gdbcore.h 2001/11/22 00:09:12 > @@ -55,6 +55,7 @@ extern void read_memory (CORE_ADDR memad > bytes. */ > > extern LONGEST read_memory_integer (CORE_ADDR memaddr, int len); > +extern int gdb_read_memory_integer (CORE_ADDR memaddr, int len, LONGEST *return_value); > > /* Read an unsigned integer from debugged memory, given address and > number of bytes. */ -- Fernando Nasser Red Hat - Toronto E-Mail: fnasser@redhat.com 2323 Yonge Street, Suite #300 Toronto, Ontario M4P 2C9