From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KAnBH-0005s0-Rh for qemu-devel@nongnu.org; Mon, 23 Jun 2008 10:38:07 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KAnBG-0005r2-8n for qemu-devel@nongnu.org; Mon, 23 Jun 2008 10:38:07 -0400 Received: from [199.232.76.173] (port=33417 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KAnBF-0005qv-EN for qemu-devel@nongnu.org; Mon, 23 Jun 2008 10:38:05 -0400 Received: from gecko.sbs.de ([194.138.37.40]:19918) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KAnBF-0004sX-7q for qemu-devel@nongnu.org; Mon, 23 Jun 2008 10:38:05 -0400 Received: from mail1.sbs.de (localhost [127.0.0.1]) by gecko.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id m5NEZnMN002113 for ; Mon, 23 Jun 2008 16:35:49 +0200 Received: from [139.25.109.167] (mchn012c.ww002.siemens.net [139.25.109.167] (may be forged)) by mail1.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id m5NEZnxc017922 for ; Mon, 23 Jun 2008 16:35:49 +0200 Resent-To: qemu-devel@nongnu.org Resent-Message-Id: <485FB4C4.60204@siemens.com> Message-ID: <485FB347.707@siemens.com> Date: Mon, 23 Jun 2008 16:29:27 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <485FB18E.1090801@siemens.com> In-Reply-To: <485FB18E.1090801@siemens.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 9/15] Restore pc on watchpoint hits 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 In order to provide accurate information about the triggering instruction, this patch adds the required bits to restore the pc if the access happened inside a TB. With the BP_STOP_BEFORE_ACCESS flag, the watchpoint user can control if the debug trap should be issued on or after the accessing instruction. Signed-off-by: Jan Kiszka --- cpu-all.h | 1 + exec.c | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) Index: b/exec.c =================================================================== --- a/exec.c +++ b/exec.c @@ -2283,15 +2283,32 @@ static CPUWriteMemoryFunc *notdirty_mem_ static void check_watchpoint(int offset, int len_mask, int flags) { CPUState *env = cpu_single_env; + TranslationBlock *tb; target_ulong vaddr; CPUWatchpoint *wp; + if (env->watchpoint_hit) { + /* We re-entered the check after replacing the TB. Now raise + * the debug interrupt so that is will trigger after the + * current instruction. */ + cpu_interrupt(env, CPU_INTERRUPT_DEBUG); + return; + } vaddr = (env->mem_access_vaddr & TARGET_PAGE_MASK) + offset; for (wp = env->watchpoints; wp != NULL; wp = wp->next) { if ((vaddr == (wp->vaddr & len_mask) || (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) { env->watchpoint_hit = wp; - cpu_interrupt(env, CPU_INTERRUPT_DEBUG); + tb = tb_find_pc(env->mem_access_pc); + if (tb) { + cpu_restore_state(tb, env, env->mem_access_pc, NULL); + tb_phys_invalidate(tb, -1); + } + if (wp->flags & BP_STOP_BEFORE_ACCESS) + env->exception_index = EXCP_DEBUG; + else + env->singlestep_enabled |= SSTEP_INTERNAL; + cpu_resume_from_signal(env, NULL); break; } } Index: b/cpu-all.h =================================================================== --- a/cpu-all.h +++ b/cpu-all.h @@ -801,6 +801,7 @@ void cpu_reset_interrupt(CPUState *env, #define BP_MEM_READ 0x01 #define BP_MEM_WRITE 0x02 #define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE) +#define BP_STOP_BEFORE_ACCESS 0x04 #define BP_GDB 0x10 int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,