From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24678 invoked by alias); 24 Oct 2013 08:33:03 -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 24662 invoked by uid 89); 24 Oct 2013 08:33:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.2 required=5.0 tests=AWL,BAYES_00,GARBLED_BODY autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 24 Oct 2013 08:33:00 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1VZGLg-0005yq-QA from Yao_Qi@mentor.com ; Thu, 24 Oct 2013 01:32:56 -0700 Received: from SVR-ORW-FEM-05.mgc.mentorg.com ([147.34.97.43]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 24 Oct 2013 01:32:56 -0700 Received: from qiyao.dyndns.org (147.34.91.1) by svr-orw-fem-05.mgc.mentorg.com (147.34.97.43) with Microsoft SMTP Server id 14.2.247.3; Thu, 24 Oct 2013 01:32:55 -0700 Message-ID: <5268DAE1.6070409@codesourcery.com> Date: Thu, 24 Oct 2013 08:33:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 MIME-Version: 1.0 To: Tom Tromey CC: Subject: Re: [PATCH 2/5] Associate target_dcache to address_space. References: <1382516855-32218-1-git-send-email-yao@codesourcery.com> <1382516855-32218-3-git-send-email-yao@codesourcery.com> <878uxkdjv3.fsf@fleche.redhat.com> In-Reply-To: <878uxkdjv3.fsf@fleche.redhat.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2013-10/txt/msg00749.txt.bz2 On 10/24/2013 12:37 AM, Tom Tromey wrote: > I like this patch quite a bit. For one thing, it fixes the target > dcache for the coming multi-target work:-) > > Yao> +/* The current added space. */ > Yao> +#define current_address_space current_program_space->aspace > > On the whole I would prefer we not add new object-style macros like > this. (Actually I'd really like it if we got rid of the existing ones > too...) Writing out the expansion in the few places it is used seems > better to me. > This macro is removed in the updated patch. > Yao> +static void > Yao> +target_dcache_cleanup (struct address_space *aspace, void *arg) > Yao> +{ > Yao> + struct target_dcache *dcache > Yao> + = address_space_data (aspace, target_dcache_aspace_key); > Yao> + > Yao> + target_dcache_xfree (dcache); > > Here you don't need to call address_space_data, since ARG is the dcache > that was passed in. You are right. Fixed. b.t.w, this sort of problems exist somewhere else in the tree, I'll post a patch to fix them separately. -- Yao (齐尧) gdb: 2013-10-24 Yao Qi * progspace.h (struct address_space): Declare. * target.c (target_dcache_aspace_key): New. (target_dcache): Delete. (struct target_dcache): New. (target_dcache_alloc): New function. (target_dcache_xfree): New function. (target_dcache_get): New function. (target_dcache_cleanup)): New function. (target_dcache_invalidate): Update. (memory_xfer_partial_1): Update. (initialize_targets): Initialize target_dcache_aspace_key. --- gdb/progspace.h | 1 + gdb/target.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 77 insertions(+), 11 deletions(-) diff --git a/gdb/progspace.h b/gdb/progspace.h index 3735202..bbe81a4 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -32,6 +32,7 @@ struct objfile; struct inferior; struct exec; struct program_space_data; +struct address_space_data; typedef struct so_list *so_list_ptr; DEF_VEC_P (so_list_ptr); diff --git a/gdb/target.c b/gdb/target.c index 22d7fb6..073a602 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -206,6 +206,70 @@ show_targetdebug (struct ui_file *file, int from_tty, static void setup_target_debug (void); +/* The target dcache is kept per-address-space. This key lets us + associate the cache with the address space. */ + +static const struct address_space_data *target_dcache_aspace_key; + +/* dcache for target memory. */ + +struct target_dcache +{ + /* Cache the memory on stack and areas specified by memory + attributes. */ + DCACHE *general; +}; + +/* Allocate an instance of struct target_dcache. */ + +static struct target_dcache * +target_dcache_alloc (void) +{ + struct target_dcache *dcache = xmalloc (sizeof (*dcache)); + + dcache->general = dcache_init (); + + return dcache; +} + +/* Free DCACHE and its fields. */ + +static void +target_dcache_xfree (struct target_dcache *dcache) +{ + if (dcache != NULL) + { + dcache_free (dcache->general); + xfree (dcache); + } +} + +/* Get an instance of struct target_dcache. */ + +static struct target_dcache * +target_dcache_get (void) +{ + struct target_dcache *dcache + = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + if (dcache == NULL) + { + dcache = target_dcache_alloc (); + + set_address_space_data (current_program_space->aspace, + target_dcache_aspace_key, dcache); + } + + return dcache; +} + +static void +target_dcache_cleanup (struct address_space *aspace, void *arg) +{ + target_dcache_xfree (arg); +} + /* The option sets this. */ static int stack_cache_enabled_p_1 = 1; /* And set_stack_cache_enabled_p updates this. @@ -235,15 +299,14 @@ show_stack_cache_enabled_p (struct ui_file *file, int from_tty, fprintf_filtered (file, _("Cache use for stack accesses is %s.\n"), value); } -/* Cache of memory operations, to speed up remote access. */ -static DCACHE *target_dcache; - /* Invalidate the target dcache. */ void target_dcache_invalidate (void) { - dcache_invalidate (target_dcache); + struct target_dcache *td = target_dcache_get (); + + dcache_invalidate (td->general); } /* The user just typed 'target' without the name of a target. */ @@ -1589,14 +1652,14 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, || (stack_cache_enabled_p && object == TARGET_OBJECT_STACK_MEMORY))) { if (readbuf != NULL) - res = dcache_xfer_memory (ops, target_dcache, memaddr, readbuf, - reg_len, 0); + res = dcache_xfer_memory (ops, target_dcache_get ()->general, + memaddr, readbuf, reg_len, 0); else /* FIXME drow/2006-08-09: If we're going to preserve const correctness dcache_xfer_memory should take readbuf and writebuf. */ - res = dcache_xfer_memory (ops, target_dcache, memaddr, - (void *) writebuf, + res = dcache_xfer_memory (ops, target_dcache_get ()->general, + memaddr, (void *) writebuf, reg_len, 1); if (res <= 0) return -1; @@ -1641,7 +1704,8 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, && stack_cache_enabled_p && object != TARGET_OBJECT_STACK_MEMORY) { - dcache_update (target_dcache, memaddr, (void *) writebuf, res); + dcache_update (target_dcache_get ()->general, memaddr, + (void *) writebuf, res); } /* If we still haven't got anything, return the last error. We @@ -5187,6 +5251,7 @@ Otherwise, any attempt to interrupt or stop will be ignored."), set_target_permissions, NULL, &setlist, &showlist); - - target_dcache = dcache_init (); + target_dcache_aspace_key + = register_address_space_data_with_cleanup (NULL, + target_dcache_cleanup); } -- 1.7.7.6