From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21052 invoked by alias); 19 Feb 2014 20:29:45 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 21000 invoked by uid 89); 19 Feb 2014 20:29:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 19 Feb 2014 20:29:44 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s1JKTgJE000301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Feb 2014 15:29:42 -0500 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s1JKTamr025004 for ; Wed, 19 Feb 2014 15:29:41 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 5/7] go32-nat.c: Don't install a deprecated_xfer_memory method Date: Wed, 19 Feb 2014 20:29:00 -0000 Message-Id: <1392841775-19126-6-git-send-email-palves@redhat.com> In-Reply-To: <1392841775-19126-1-git-send-email-palves@redhat.com> References: <1392841775-19126-1-git-send-email-palves@redhat.com> X-SW-Source: 2014-02/txt/msg00611.txt.bz2 This removes yet another instance of a deprecated_xfer_memory user. Unfortunately djgpp's write_child function takes a non-const buffer pointer, while GDB's xfer_partial api passes a const pointer. To be const-correct, we need to copy that buffer to a non-const buffer, and pass the copy to write_child. This is actually what target.c:default_xfer_partial itself does, when calling into the ops->deprecated_xfer_memory hook. Tested by cross-building djgpp gdb, on x86-64 Fedora 17. gdb/ 2014-02-19 Pedro Alves * go32-nat.c (my_write_child): New function. (go32_xfer_memory): Rewrite as to_xfer_partial helper. (go32_xfer_partial): New function. (init_go32_ops): Don't install a deprecated_xfer_memory hook. Instad a to_xfer_partial hook. --- gdb/go32-nat.c | 76 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 20 deletions(-) diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c index 2e91b12..7978a5e 100644 --- a/gdb/go32-nat.c +++ b/gdb/go32-nat.c @@ -577,31 +577,67 @@ go32_prepare_to_store (struct target_ops *self, struct regcache *regcache) { } + +/* Const-correct version of DJGPP's write_child, which unfortunately + takes a non-const buffer pointer. */ + static int -go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, - struct mem_attrib *attrib, struct target_ops *target) +my_write_child (unsigned child_addr, const void *buf, unsigned len) { - if (write) + static void *buffer = NULL; + static unsigned buffer_len = 0; + int res; + + if (buffer_len < len) { - if (write_child (memaddr, myaddr, len)) - { - return 0; - } - else - { - return len; - } + buffer = xrealloc (buffer, len); + buffer_len = len; } + + memcpy (buffer, buf, len); + res = write_child (child_addr, buffer, len); + xfree (buffer); + return res; +} + +/* Helper for go32_xfer_partial that handles memory transfers. + Arguments are like target_xfer_partial. */ + +static enum target_xfer_status +go32_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len) +{ + int res; + + if (writebuf != NULL) + res = my_write_child (memaddr, writebuf, len); else + res = read_child (memaddr, readbuf, len); + + if (res <= 0) + return TARGET_XFER_E_IO; + + *xfered_len = res; + return TARGET_XFER_OK; +} + +/* Target to_xfer_partial implementation. */ + +static enum target_xfer_status +go32_xfer_partial (struct target_ops *ops, enum target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) +{ + switch (object) { - if (read_child (memaddr, myaddr, len)) - { - return 0; - } - else - { - return len; - } + case TARGET_OBJECT_MEMORY: + return go32_xfer_memory (readbuf, writebuf, offset, len, xfered_len); + + default: + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + readbuf, writebuf, offset, len, + xfered_len); } } @@ -957,7 +993,7 @@ init_go32_ops (void) go32_ops.to_fetch_registers = go32_fetch_registers; go32_ops.to_store_registers = go32_store_registers; go32_ops.to_prepare_to_store = go32_prepare_to_store; - go32_ops.deprecated_xfer_memory = go32_xfer_memory; + go32_ops.to_xfer_partial = go32_xfer_partial; go32_ops.to_files_info = go32_files_info; go32_ops.to_insert_breakpoint = memory_insert_breakpoint; go32_ops.to_remove_breakpoint = memory_remove_breakpoint; -- 1.7.11.7