From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26055 invoked by alias); 30 Sep 2004 16:28:05 -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 26045 invoked from network); 30 Sep 2004 16:28:03 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 30 Sep 2004 16:28:03 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.10) with ESMTP id i8UGRwY6008753 for ; Thu, 30 Sep 2004 12:28:03 -0400 Received: from localhost.redhat.com (porkchop.devel.redhat.com [172.16.58.2]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i8UGRwr12504; Thu, 30 Sep 2004 12:27:58 -0400 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id C55A628D2; Thu, 30 Sep 2004 12:27:50 -0400 (EDT) Message-ID: <415C3406.30801@gnu.org> Date: Thu, 30 Sep 2004 16:28:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-GB; rv:1.4.1) Gecko/20040831 MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [commit] Prefer xfer_partial for memory xfers Content-Type: multipart/mixed; boundary="------------060700050807080704070607" X-SW-Source: 2004-09/txt/msg00491.txt.bz2 This is a multi-part message in MIME format. --------------060700050807080704070607 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 449 Hello, This modifies the memory read/write functions so that they strongly prefer the inferior's to_xfer_partial method over the older to_xfer_memory method. With this in place the need to implement xfer_memory is eliminated - I deleted the function from inf-ptrace.c - inferiors (namely GNU/Linux) can more easily overide the inherited xfer method. committed, Andrew (and I thought getting GNU/Linux using inferior inheritance was be easy) --------------060700050807080704070607 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 5691 2004-09-30 Andrew Cagney * inf-ptrace.c (inf_ptrace_target): Do not set to_xfer_memory. (inf_ptrace_xfer_memory): Delete. * target.c (target_xfer_partial_p, xfer_using_stratum): New. (target_read_memory, target_write_memory): Use xfer_using_stratum when target_xfer_partial_p. (debug_target): Move to start of file. (target_read_memory_partial, target_write_memory_partial): Use to_xfer_partial when target_xfer_partial_p. Index: inf-ptrace.c =================================================================== RCS file: /cvs/src/src/gdb/inf-ptrace.c,v retrieving revision 1.7 diff -p -u -r1.7 inf-ptrace.c --- inf-ptrace.c 30 Sep 2004 15:47:30 -0000 1.7 +++ inf-ptrace.c 30 Sep 2004 16:17:38 -0000 @@ -742,7 +742,6 @@ inf_ptrace_target (void) t->to_resume = inf_ptrace_resume; t->to_wait = inf_ptrace_wait; t->to_prepare_to_store = inf_ptrace_prepare_to_store; - t->to_xfer_memory = inf_ptrace_xfer_memory; t->to_xfer_partial = inf_ptrace_xfer_partial; t->to_files_info = inf_ptrace_files_info; t->to_kill = inf_ptrace_kill_inferior; Index: target.c =================================================================== RCS file: /cvs/src/src/gdb/target.c,v retrieving revision 1.83 diff -p -u -r1.83 target.c --- target.c 30 Sep 2004 14:16:20 -0000 1.83 +++ target.c 30 Sep 2004 16:17:38 -0000 @@ -840,6 +840,89 @@ target_section_by_addr (struct target_op return NULL; } +/* Return non-zero when the target vector has supplied an xfer_partial + method and it, rather than xfer_memory, should be used. */ +static int +target_xfer_partial_p (void) +{ + return (target_stack != NULL + && target_stack->to_xfer_partial != default_xfer_partial); +} + +/* Attempt a transfer all LEN bytes starting at OFFSET between the + inferior's KIND:ANNEX space and GDB's READBUF/WRITEBUF buffer. If + the transfer succeeds, return zero, otherwize the host ERRNO is + returned. + + The inferior is formed from several layers. In the case of + corefiles, inf-corefile is layered above inf-exec and a request for + text (corefiles do not include text pages) will be first sent to + the core-stratum, fail, and then sent to the object-file where it + will succeed. + + NOTE: cagney/2004-09-30: + + The old code tried to use four separate mechanisms for mapping an + object:offset:len tuple onto an inferior and its address space: the + target stack; the inferior's TO_SECTIONS; solib's SO_LIST; + overlays. + + This is stupid. + + The code below is instead using a single mechanism (currently + strata). If that mechanism proves insufficient then re-factor it + implementing another singluar mechanism (for instance, a generic + object:annex onto inferior:object:annex say). */ + +static int +xfer_using_stratum (enum target_object object, const char *annex, + CORE_ADDR memaddr, int len, void *readbuf, + const void *writebuf) +{ + LONGEST xfered; + struct target_ops *target; + + /* Always successful. */ + if (len == 0) + return 0; + /* Never successful. */ + if (target_stack == NULL) + return EIO; + + target = target_stack; + while (1) + { + xfered = target->to_xfer_partial (target, object, annex, + readbuf, writebuf, memaddr, len); + if (xfered > 0) + { + /* The partial xfer succeeded, update the counts, check that + the xfer hasn't finished and if it hasn't set things up + for the next round. */ + len -= xfered; + if (len <= 0) + return 0; + target = target_stack; + } + else if (xfered < 0) + { + /* Something totally screwed up, abandon the attempt to + xfer. */ + if (errno) + return errno; + else + return EIO; + } + else + { + /* This "stratum" didn't work, try the next one down. */ + target = target->beneath; + if (target == NULL) + return EIO; + } + } +} + /* Read LEN bytes of target memory at address MEMADDR, placing the results in GDB's memory at MYADDR. Returns either 0 for success or an errno value if any error occurs. @@ -853,13 +936,21 @@ target_section_by_addr (struct target_op int target_read_memory (CORE_ADDR memaddr, char *myaddr, int len) { - return target_xfer_memory (memaddr, myaddr, len, 0); + if (target_xfer_partial_p ()) + return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL, + memaddr, len, myaddr, NULL); + else + return target_xfer_memory (memaddr, myaddr, len, 0); } int target_write_memory (CORE_ADDR memaddr, char *myaddr, int len) { - return target_xfer_memory (memaddr, myaddr, len, 1); + if (target_xfer_partial_p ()) + return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL, + memaddr, len, NULL, myaddr); + else + return target_xfer_memory (memaddr, myaddr, len, 1); } static int trust_readonly = 0; @@ -1065,13 +1156,23 @@ target_xfer_memory_partial (CORE_ADDR me int target_read_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err) { - return target_xfer_memory_partial (memaddr, buf, len, 0, err); + if (target_xfer_partial_p ()) + return target_stack->to_xfer_partial (target_stack, + TARGET_OBJECT_MEMORY, NULL, + buf, NULL, memaddr, len); + else + return target_xfer_memory_partial (memaddr, buf, len, 0, err); } int target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err) { - return target_xfer_memory_partial (memaddr, buf, len, 1, err); + if (target_xfer_partial_p ()) + return target_stack->to_xfer_partial (target_stack, + TARGET_OBJECT_MEMORY, NULL, + NULL, buf, memaddr, len); + else + return target_xfer_memory_partial (memaddr, buf, len, 1, err); } /* More generic transfers. */ --------------060700050807080704070607--