From 673641504780300be2f0553b76bee34e3d643e57 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sun, 29 Jan 2012 00:01:40 +0400 Subject: exec: add missing breaks to the watch_mem_write MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Max Filippov Reviewed-by: Andreas Färber Reviewed-by: Meador Inge --- exec.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'exec.c') diff --git a/exec.c b/exec.c index b81677ade..f105b43fd 100644 --- a/exec.c +++ b/exec.c @@ -3289,9 +3289,15 @@ static void watch_mem_write(void *opaque, target_phys_addr_t addr, { check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_WRITE); switch (size) { - case 1: stb_phys(addr, val); - case 2: stw_phys(addr, val); - case 4: stl_phys(addr, val); + case 1: + stb_phys(addr, val); + break; + case 2: + stw_phys(addr, val); + break; + case 4: + stl_phys(addr, val); + break; default: abort(); } } -- cgit v1.2.3 From 488d65772ce94aa439f26d7136db384aec460bcb Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sun, 29 Jan 2012 02:24:39 +0400 Subject: exec: fix check_watchpoint exiting cpu_loop In case of BP_STOP_BEFORE_ACCESS watchpoint check_watchpoint intends to signal EXCP_DEBUG exception on exit from cpu loop, but later overwrites exception code by the cpu_resume_from_signal call. Use cpu_loop_exit with BP_STOP_BEFORE_ACCESS watchpoints. Signed-off-by: Max Filippov --- exec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'exec.c') diff --git a/exec.c b/exec.c index f105b43fd..ed091f398 100644 --- a/exec.c +++ b/exec.c @@ -3257,11 +3257,12 @@ static void check_watchpoint(int offset, int len_mask, int flags) tb_phys_invalidate(tb, -1); if (wp->flags & BP_STOP_BEFORE_ACCESS) { env->exception_index = EXCP_DEBUG; + cpu_loop_exit(env); } else { cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags); tb_gen_code(env, pc, cs_base, cpu_flags, 1); + cpu_resume_from_signal(env, NULL); } - cpu_resume_from_signal(env, NULL); } } else { wp->flags &= ~BP_WATCHPOINT_HIT; -- cgit v1.2.3 From 0dc23828f1487a3e587f42a0630dd6879ab8f2bb Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sun, 29 Jan 2012 03:15:23 +0400 Subject: exec: let cpu_watchpoint_insert accept larger watchpoints Make cpu_watchpoint_insert accept watchpoints of any power-of-two size up to the target page size. Signed-off-by: Max Filippov --- exec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'exec.c') diff --git a/exec.c b/exec.c index ed091f398..80560fad5 100644 --- a/exec.c +++ b/exec.c @@ -1443,7 +1443,8 @@ int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len, CPUWatchpoint *wp; /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */ - if ((len != 1 && len != 2 && len != 4 && len != 8) || (addr & ~len_mask)) { + if ((len & (len - 1)) || (addr & ~len_mask) || + len == 0 || len > TARGET_PAGE_SIZE) { fprintf(stderr, "qemu: tried to set invalid watchpoint at " TARGET_FMT_lx ", len=" TARGET_FMT_lu "\n", addr, len); return -EINVAL; -- cgit v1.2.3