From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Kpncr-0000c5-5i for qemu-devel@nongnu.org; Tue, 14 Oct 2008 13:24:05 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Kpnco-0000bW-KC for qemu-devel@nongnu.org; Tue, 14 Oct 2008 13:24:03 -0400 Received: from [199.232.76.173] (port=46675 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Kpnco-0000bN-Ej for qemu-devel@nongnu.org; Tue, 14 Oct 2008 13:24:02 -0400 Received: from mail-gx0-f19.google.com ([209.85.217.19]:62779) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Kpnco-0002NS-0w for qemu-devel@nongnu.org; Tue, 14 Oct 2008 13:24:02 -0400 Received: by gxk12 with SMTP id 12so5329910gxk.10 for ; Tue, 14 Oct 2008 10:24:01 -0700 (PDT) Message-ID: <5d6222a80810141024x1077066ek851f96a815c0cbe4@mail.gmail.com> Date: Tue, 14 Oct 2008 15:24:01 -0200 From: "Glauber Costa" Subject: Re: [Qemu-devel] [PATCH 02/13] Refactor and enhance break/watchpoint API In-Reply-To: <20081014091224.774875732@mchn012c.ww002.siemens.net> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <20081014091223.932366369@mchn012c.ww002.siemens.net> <20081014091224.774875732@mchn012c.ww002.siemens.net> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Jan Kiszka > > Index: b/exec.c > =================================================================== > --- a/exec.c > +++ b/exec.c > @@ -537,7 +537,6 @@ void cpu_exec_init(CPUState *env) > cpu_index++; > } > env->cpu_index = cpu_index; > - env->nb_watchpoints = 0; > *penv = env; > #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY) > register_savevm("cpu_common", cpu_index, CPU_COMMON_SAVE_VERSION, > @@ -1311,107 +1310,150 @@ static void breakpoint_invalidate(CPUSta > #endif > > /* Add a watchpoint. */ > -int cpu_watchpoint_insert(CPUState *env, target_ulong addr, int type) > +int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len, > + int flags, CPUWatchpoint **watchpoint) > { > - int i; > + CPUWatchpoint *wp; > > - for (i = 0; i < env->nb_watchpoints; i++) { > - if (addr == env->watchpoint[i].vaddr) > - return 0; > - } > - if (env->nb_watchpoints >= MAX_WATCHPOINTS) > - return -1; > + wp = qemu_malloc(sizeof(*wp)); > + if (!wp) > + return -ENOBUFS; > + > + wp->vaddr = addr; > + wp->len = len; > + wp->flags = flags; > + > + wp->next = env->watchpoints; > + wp->prev = NULL; > + if (wp->next) > + wp->next->prev = wp; > + env->watchpoints = wp; > > - i = env->nb_watchpoints++; > - env->watchpoint[i].vaddr = addr; > - env->watchpoint[i].type = type; > tlb_flush_page(env, addr); > /* FIXME: This flush is needed because of the hack to make memory ops > terminate the TB. It can be removed once the proper IO trap and > re-execute bits are in. */ > tb_flush(env); > Index: b/cpu-defs.h > +typedef struct CPUBreakpoint { > + target_ulong pc; > + int flags; /* BP_* */ > + struct CPUBreakpoint *prev, *next; > +} CPUBreakpoint; > + > +typedef struct CPUWatchpoint { > + target_ulong vaddr; > + target_ulong len; > + int flags; /* BP_* */ > + struct CPUWatchpoint *prev, *next; > +} CPUWatchpoint; > + Most of the time, you are transversing the list in a single direction. So any particular reason to use a double linked list? By the way, /me thinks it is about time for us to have a generic linked list implementation -- Glauber Costa. "Free as in Freedom" http://glommer.net "The less confident you are, the more serious you have to act."