From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9495 invoked by alias); 22 Nov 2001 00:19:12 -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 9469 invoked from network); 22 Nov 2001 00:19:08 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sourceware.cygnus.com with SMTP; 22 Nov 2001 00:19:08 -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 QAA16612 for ; Wed, 21 Nov 2001 16:19:07 -0800 (PST) Received: (from ezannoni@localhost) by rtl.cygnus.com (8.11.2/8.11.0) id fAM0PVA06300; Wed, 21 Nov 2001 19:25:31 -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: <15356.17915.602742.140302@krustylu.cygnus.com> Date: Fri, 09 Nov 2001 01:18:00 -0000 To: gdb-patches@sources.redhat.com Subject: [RFA] arm-tdep.c: deal with failed memory read X-Mailer: VM 6.97 under Emacs 20.7.1 X-SW-Source: 2001-11/txt/msg00179.txt.bz2 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? 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. */