From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23964 invoked by alias); 1 Mar 2004 20:55:57 -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 23955 invoked from network); 1 Mar 2004 20:55:55 -0000 Received: from unknown (HELO biscayne-one-station.mit.edu) (18.7.7.80) by sources.redhat.com with SMTP; 1 Mar 2004 20:55:55 -0000 Received: from manawatu-mail-centre.mit.edu (MANAWATU-MAIL-CENTRE.MIT.EDU [18.7.7.71]) by biscayne-one-station.mit.edu (8.12.4/8.9.2) with ESMTP id i21Kttmc003873 for ; Mon, 1 Mar 2004 15:55:55 -0500 (EST) Received: from contents-vnder-pressvre.mit.edu (CONTENTS-VNDER-PRESSVRE.MIT.EDU [18.7.16.67]) (authenticated bits=56) (User authenticated as nathanw@ATHENA.MIT.EDU) by manawatu-mail-centre.mit.edu (8.12.4/8.12.4) with ESMTP id i21Kts8e010222 for ; Mon, 1 Mar 2004 15:55:54 -0500 (EST) Received: (from nathanw@localhost) by contents-vnder-pressvre.mit.edu (8.12.9) id i21KtsGJ026833; Mon, 1 Mar 2004 15:55:54 -0500 (EST) To: gdb-patches@sources.redhat.com Subject: [patch] gdbserver: Detect and return errors reading memory From: "Nathan J. Williams" Organization: Wasabi Systems, Inc. Date: Mon, 01 Mar 2004 20:55:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2004-03.o/txt/msg00013.txt As I promised last week, here is a patch to check for errors reading memory in gdbserver and propagate that error back to the host gdb. - Nathan 2004-03-01 Nathan J. Williams * linux-low.c (linux_read_memory): Change return type to int. Check for and return error from ptrace(). * target.c (read_inferior_memory): Change return type to int. Pass back return status from the_target->read_memory(). * target.h (struct target_ops): Adapt *read_memory() prototype. Update comment. (read_inferior_memory): Adapt prototype. * server.c (main): Return an error packet if read_inferior_memory() returns an error. Index: linux-low.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v retrieving revision 1.29 diff -u -p -r1.29 linux-low.c --- linux-low.c 29 Feb 2004 16:47:15 -0000 1.29 +++ linux-low.c 1 Mar 2004 20:47:58 -0000 @@ -1281,7 +1281,7 @@ linux_store_registers (int regno) /* Copy LEN bytes from inferior's memory starting at MEMADDR to debugger memory starting at MYADDR. */ -static void +static int linux_read_memory (CORE_ADDR memaddr, char *myaddr, int len) { register int i; @@ -1298,11 +1298,16 @@ linux_read_memory (CORE_ADDR memaddr, ch /* Read all the longwords */ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE)) { + errno = 0; buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 0); + if (errno) + return errno; } /* Copy appropriate bytes out of the buffer. */ memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len); + + return 0; } /* Copy LEN bytes of data from debugger memory at MYADDR Index: target.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/target.c,v retrieving revision 1.3 diff -u -p -r1.3 target.c --- target.c 11 Jun 2002 17:32:40 -0000 1.3 +++ target.c 1 Mar 2004 20:47:58 -0000 @@ -57,11 +57,13 @@ set_desired_inferior (int use_general) current_inferior = found; } -void +int read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len) { - (*the_target->read_memory) (memaddr, myaddr, len); + int res; + res = (*the_target->read_memory) (memaddr, myaddr, len); check_mem_read (memaddr, myaddr, len); + return res; } int Index: target.h =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/target.h,v retrieving revision 1.10 diff -u -p -r1.10 target.h --- target.h 26 Feb 2004 15:08:47 -0000 1.10 +++ target.h 1 Mar 2004 20:47:58 -0000 @@ -102,9 +102,11 @@ struct target_ops /* Read memory from the inferior process. This should generally be called through read_inferior_memory, which handles breakpoint shadowing. - Read LEN bytes at MEMADDR into a buffer at MYADDR. */ + Read LEN bytes at MEMADDR into a buffer at MYADDR. + + Returns 0 on success and errno on failure. */ - void (*read_memory) (CORE_ADDR memaddr, char *myaddr, int len); + int (*read_memory) (CORE_ADDR memaddr, char *myaddr, int len); /* Write memory to the inferior process. This should generally be called through write_inferior_memory, which handles breakpoint shadowing. @@ -160,7 +162,7 @@ void set_target_ops (struct target_ops * unsigned char mywait (char *statusp, int connected_wait); -void read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len); +int read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len); int write_inferior_memory (CORE_ADDR memaddr, const char *myaddr, int len); Index: server.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/server.c,v retrieving revision 1.20 diff -u -p -r1.20 server.c --- server.c 29 Feb 2004 16:49:38 -0000 1.20 +++ server.c 1 Mar 2004 20:47:58 -0000 @@ -462,8 +462,10 @@ main (int argc, char *argv[]) break; case 'm': decode_m_packet (&own_buf[1], &mem_addr, &len); - read_inferior_memory (mem_addr, mem_buf, len); - convert_int_to_ascii (mem_buf, own_buf, len); + if (read_inferior_memory (mem_addr, mem_buf, len) == 0) + convert_int_to_ascii (mem_buf, own_buf, len); + else + write_enn (own_buf); break; case 'M': decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf); From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23964 invoked by alias); 1 Mar 2004 20:55:57 -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 23955 invoked from network); 1 Mar 2004 20:55:55 -0000 Received: from unknown (HELO biscayne-one-station.mit.edu) (18.7.7.80) by sources.redhat.com with SMTP; 1 Mar 2004 20:55:55 -0000 Received: from manawatu-mail-centre.mit.edu (MANAWATU-MAIL-CENTRE.MIT.EDU [18.7.7.71]) by biscayne-one-station.mit.edu (8.12.4/8.9.2) with ESMTP id i21Kttmc003873 for ; Mon, 1 Mar 2004 15:55:55 -0500 (EST) Received: from contents-vnder-pressvre.mit.edu (CONTENTS-VNDER-PRESSVRE.MIT.EDU [18.7.16.67]) (authenticated bits=56) (User authenticated as nathanw@ATHENA.MIT.EDU) by manawatu-mail-centre.mit.edu (8.12.4/8.12.4) with ESMTP id i21Kts8e010222 for ; Mon, 1 Mar 2004 15:55:54 -0500 (EST) Received: (from nathanw@localhost) by contents-vnder-pressvre.mit.edu (8.12.9) id i21KtsGJ026833; Mon, 1 Mar 2004 15:55:54 -0500 (EST) To: gdb-patches@sources.redhat.com Subject: [patch] gdbserver: Detect and return errors reading memory From: "Nathan J. Williams" Organization: Wasabi Systems, Inc. Date: Fri, 19 Mar 2004 00:09:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2004-03/txt/msg00013.txt.bz2 Message-ID: <20040319000900.SgHeJz0w-hpkXqwkfe7rqrXnsL8a3QQ1P1cz_nDMW94@z> As I promised last week, here is a patch to check for errors reading memory in gdbserver and propagate that error back to the host gdb. - Nathan 2004-03-01 Nathan J. Williams * linux-low.c (linux_read_memory): Change return type to int. Check for and return error from ptrace(). * target.c (read_inferior_memory): Change return type to int. Pass back return status from the_target->read_memory(). * target.h (struct target_ops): Adapt *read_memory() prototype. Update comment. (read_inferior_memory): Adapt prototype. * server.c (main): Return an error packet if read_inferior_memory() returns an error. Index: linux-low.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v retrieving revision 1.29 diff -u -p -r1.29 linux-low.c --- linux-low.c 29 Feb 2004 16:47:15 -0000 1.29 +++ linux-low.c 1 Mar 2004 20:47:58 -0000 @@ -1281,7 +1281,7 @@ linux_store_registers (int regno) /* Copy LEN bytes from inferior's memory starting at MEMADDR to debugger memory starting at MYADDR. */ -static void +static int linux_read_memory (CORE_ADDR memaddr, char *myaddr, int len) { register int i; @@ -1298,11 +1298,16 @@ linux_read_memory (CORE_ADDR memaddr, ch /* Read all the longwords */ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE)) { + errno = 0; buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 0); + if (errno) + return errno; } /* Copy appropriate bytes out of the buffer. */ memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len); + + return 0; } /* Copy LEN bytes of data from debugger memory at MYADDR Index: target.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/target.c,v retrieving revision 1.3 diff -u -p -r1.3 target.c --- target.c 11 Jun 2002 17:32:40 -0000 1.3 +++ target.c 1 Mar 2004 20:47:58 -0000 @@ -57,11 +57,13 @@ set_desired_inferior (int use_general) current_inferior = found; } -void +int read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len) { - (*the_target->read_memory) (memaddr, myaddr, len); + int res; + res = (*the_target->read_memory) (memaddr, myaddr, len); check_mem_read (memaddr, myaddr, len); + return res; } int Index: target.h =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/target.h,v retrieving revision 1.10 diff -u -p -r1.10 target.h --- target.h 26 Feb 2004 15:08:47 -0000 1.10 +++ target.h 1 Mar 2004 20:47:58 -0000 @@ -102,9 +102,11 @@ struct target_ops /* Read memory from the inferior process. This should generally be called through read_inferior_memory, which handles breakpoint shadowing. - Read LEN bytes at MEMADDR into a buffer at MYADDR. */ + Read LEN bytes at MEMADDR into a buffer at MYADDR. + + Returns 0 on success and errno on failure. */ - void (*read_memory) (CORE_ADDR memaddr, char *myaddr, int len); + int (*read_memory) (CORE_ADDR memaddr, char *myaddr, int len); /* Write memory to the inferior process. This should generally be called through write_inferior_memory, which handles breakpoint shadowing. @@ -160,7 +162,7 @@ void set_target_ops (struct target_ops * unsigned char mywait (char *statusp, int connected_wait); -void read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len); +int read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len); int write_inferior_memory (CORE_ADDR memaddr, const char *myaddr, int len); Index: server.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/server.c,v retrieving revision 1.20 diff -u -p -r1.20 server.c --- server.c 29 Feb 2004 16:49:38 -0000 1.20 +++ server.c 1 Mar 2004 20:47:58 -0000 @@ -462,8 +462,10 @@ main (int argc, char *argv[]) break; case 'm': decode_m_packet (&own_buf[1], &mem_addr, &len); - read_inferior_memory (mem_addr, mem_buf, len); - convert_int_to_ascii (mem_buf, own_buf, len); + if (read_inferior_memory (mem_addr, mem_buf, len) == 0) + convert_int_to_ascii (mem_buf, own_buf, len); + else + write_enn (own_buf); break; case 'M': decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);