From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VH926-0004UU-KO for qemu-devel@nongnu.org; Wed, 04 Sep 2013 05:06:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VH920-0007vY-1L for qemu-devel@nongnu.org; Wed, 04 Sep 2013 05:05:50 -0400 Received: from cantor2.suse.de ([195.135.220.15]:45411 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VH91z-0007vA-4H for qemu-devel@nongnu.org; Wed, 04 Sep 2013 05:05:43 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 4 Sep 2013 11:04:55 +0200 Message-Id: <1378285521-3230-16-git-send-email-afaerber@suse.de> In-Reply-To: <1378285521-3230-1-git-send-email-afaerber@suse.de> References: <1378285521-3230-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [RFC qom-cpu 15/41] cpu: Move watchpoint fields from CPU_COMMON to CPUState List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Marcelo Tosatti , "open list:X86" , Gleb Natapov , Riku Voipio , Max Filippov , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= Signed-off-by: Andreas F=C3=A4rber --- cpu-exec.c | 5 +++-- exec.c | 33 ++++++++++++++++++++------------- gdbstub.c | 8 ++++---- include/exec/cpu-defs.h | 10 ---------- include/qom/cpu.h | 10 ++++++++++ linux-user/main.c | 5 +++-- target-i386/cpu.h | 2 +- target-i386/helper.c | 7 ++++--- target-i386/kvm.c | 8 ++++---- target-xtensa/cpu.h | 2 +- target-xtensa/helper.c | 8 +++++--- 11 files changed, 55 insertions(+), 43 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 0081eaf..209380d 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -183,10 +183,11 @@ void cpu_set_debug_excp_handler(CPUDebugExcpHandler= *handler) =20 static void cpu_handle_debug_exception(CPUArchState *env) { + CPUState *cpu =3D ENV_GET_CPU(env); CPUWatchpoint *wp; =20 - if (!env->watchpoint_hit) { - QTAILQ_FOREACH(wp, &env->watchpoints, entry) { + if (!cpu->watchpoint_hit) { + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { wp->flags &=3D ~BP_WATCHPOINT_HIT; } } diff --git a/exec.c b/exec.c index 93958c3..5b70bf8 100644 --- a/exec.c +++ b/exec.c @@ -379,7 +379,7 @@ void cpu_exec_init(CPUArchState *env) cpu->cpu_index =3D cpu_index; cpu->numa_node =3D 0; QTAILQ_INIT(&env->breakpoints); - QTAILQ_INIT(&env->watchpoints); + QTAILQ_INIT(&cpu->watchpoints); #ifndef CONFIG_USER_ONLY cpu->thread_id =3D qemu_get_thread_id(); #endif @@ -432,6 +432,7 @@ int cpu_watchpoint_insert(CPUArchState *env, target_u= long addr, target_ulong len int cpu_watchpoint_insert(CPUArchState *env, target_ulong addr, target_u= long len, int flags, CPUWatchpoint **watchpoint) { + CPUState *cpu =3D ENV_GET_CPU(env); target_ulong len_mask =3D ~(len - 1); CPUWatchpoint *wp; =20 @@ -449,10 +450,11 @@ int cpu_watchpoint_insert(CPUArchState *env, target= _ulong addr, target_ulong len wp->flags =3D flags; =20 /* keep all GDB-injected watchpoints in front */ - if (flags & BP_GDB) - QTAILQ_INSERT_HEAD(&env->watchpoints, wp, entry); - else - QTAILQ_INSERT_TAIL(&env->watchpoints, wp, entry); + if (flags & BP_GDB) { + QTAILQ_INSERT_HEAD(&cpu->watchpoints, wp, entry); + } else { + QTAILQ_INSERT_TAIL(&cpu->watchpoints, wp, entry); + } =20 tlb_flush_page(env, addr); =20 @@ -465,10 +467,11 @@ int cpu_watchpoint_insert(CPUArchState *env, target= _ulong addr, target_ulong len int cpu_watchpoint_remove(CPUArchState *env, target_ulong addr, target_u= long len, int flags) { + CPUState *cpu =3D ENV_GET_CPU(env); target_ulong len_mask =3D ~(len - 1); CPUWatchpoint *wp; =20 - QTAILQ_FOREACH(wp, &env->watchpoints, entry) { + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { if (addr =3D=3D wp->vaddr && len_mask =3D=3D wp->len_mask && flags =3D=3D (wp->flags & ~BP_WATCHPOINT_HIT)) { cpu_watchpoint_remove_by_ref(env, wp); @@ -481,7 +484,9 @@ int cpu_watchpoint_remove(CPUArchState *env, target_u= long addr, target_ulong len /* Remove a specific watchpoint by reference. */ void cpu_watchpoint_remove_by_ref(CPUArchState *env, CPUWatchpoint *watc= hpoint) { - QTAILQ_REMOVE(&env->watchpoints, watchpoint, entry); + CPUState *cpu =3D ENV_GET_CPU(env); + + QTAILQ_REMOVE(&cpu->watchpoints, watchpoint, entry); =20 tlb_flush_page(env, watchpoint->vaddr); =20 @@ -491,9 +496,10 @@ void cpu_watchpoint_remove_by_ref(CPUArchState *env,= CPUWatchpoint *watchpoint) /* Remove all matching watchpoints. */ void cpu_watchpoint_remove_all(CPUArchState *env, int mask) { + CPUState *cpu =3D ENV_GET_CPU(env); CPUWatchpoint *wp, *next; =20 - QTAILQ_FOREACH_SAFE(wp, &env->watchpoints, entry, next) { + QTAILQ_FOREACH_SAFE(wp, &cpu->watchpoints, entry, next) { if (wp->flags & mask) cpu_watchpoint_remove_by_ref(env, wp); } @@ -677,6 +683,7 @@ hwaddr memory_region_section_get_iotlb(CPUArchState *= env, int prot, target_ulong *address) { + CPUState *cpu =3D ENV_GET_CPU(env); hwaddr iotlb; CPUWatchpoint *wp; =20 @@ -696,7 +703,7 @@ hwaddr memory_region_section_get_iotlb(CPUArchState *= env, =20 /* Make accesses to pages with watchpoints go via the watchpoint trap routines. */ - QTAILQ_FOREACH(wp, &env->watchpoints, entry) { + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { if (vaddr =3D=3D (wp->vaddr & TARGET_PAGE_MASK)) { /* Avoid trapping reads of pages with a write breakpoint. */ if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) { @@ -1454,7 +1461,7 @@ static void check_watchpoint(int offset, int len_ma= sk, int flags) CPUWatchpoint *wp; int cpu_flags; =20 - if (env->watchpoint_hit) { + if (cpu->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. */ @@ -1462,12 +1469,12 @@ static void check_watchpoint(int offset, int len_= mask, int flags) return; } vaddr =3D (cpu->mem_io_vaddr & TARGET_PAGE_MASK) + offset; - QTAILQ_FOREACH(wp, &env->watchpoints, entry) { + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { if ((vaddr =3D=3D (wp->vaddr & len_mask) || (vaddr & wp->len_mask) =3D=3D wp->vaddr) && (wp->flags & fl= ags)) { wp->flags |=3D BP_WATCHPOINT_HIT; - if (!env->watchpoint_hit) { - env->watchpoint_hit =3D wp; + if (!cpu->watchpoint_hit) { + cpu->watchpoint_hit =3D wp; tb_check_watchpoint(env); if (wp->flags & BP_STOP_BEFORE_ACCESS) { cpu->exception_index =3D EXCP_DEBUG; diff --git a/gdbstub.c b/gdbstub.c index dac99b3..05b76e0 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -1207,8 +1207,8 @@ static void gdb_vm_state_change(void *opaque, int r= unning, RunState state) } switch (state) { case RUN_STATE_DEBUG: - if (env->watchpoint_hit) { - switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) { + if (cpu->watchpoint_hit) { + switch (cpu->watchpoint_hit->flags & BP_MEM_ACCESS) { case BP_MEM_READ: type =3D "r"; break; @@ -1222,8 +1222,8 @@ static void gdb_vm_state_change(void *opaque, int r= unning, RunState state) snprintf(buf, sizeof(buf), "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";", GDB_SIGNAL_TRAP, cpu_index(cpu), type, - env->watchpoint_hit->vaddr); - env->watchpoint_hit =3D NULL; + (target_ulong)cpu->watchpoint_hit->vaddr); + cpu->watchpoint_hit =3D NULL; goto send_packet; } tb_flush(env); diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h index be9569c..338b8cb 100644 --- a/include/exec/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -119,13 +119,6 @@ typedef struct CPUBreakpoint { QTAILQ_ENTRY(CPUBreakpoint) entry; } CPUBreakpoint; =20 -typedef struct CPUWatchpoint { - target_ulong vaddr; - target_ulong len_mask; - int flags; /* BP_* */ - QTAILQ_ENTRY(CPUWatchpoint) entry; -} CPUWatchpoint; - #define CPU_TEMP_BUF_NLONGS 128 #define CPU_COMMON = \ /* soft mmu support */ = \ @@ -134,8 +127,5 @@ typedef struct CPUWatchpoint { /* from this point: preserved by CPU reset */ = \ /* ice debug support */ = \ QTAILQ_HEAD(breakpoints_head, CPUBreakpoint) breakpoints; = \ - = \ - QTAILQ_HEAD(watchpoints_head, CPUWatchpoint) watchpoints; = \ - CPUWatchpoint *watchpoint_hit; = \ =20 #endif diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 828c833..ae6602a 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -154,6 +154,13 @@ typedef struct icount_decr_u16 { } icount_decr_u16; #endif =20 +typedef struct CPUWatchpoint { + vaddr vaddr; + vaddr len_mask; + int flags; /* BP_* */ + QTAILQ_ENTRY(CPUWatchpoint) entry; +} CPUWatchpoint; + struct KVMState; struct kvm_run; =20 @@ -231,6 +238,9 @@ struct CPUState { int gdb_num_g_regs; QTAILQ_ENTRY(CPUState) node; =20 + QTAILQ_HEAD(watchpoints_head, CPUWatchpoint) watchpoints; + CPUWatchpoint *watchpoint_hit; + void *opaque; =20 /* In order to avoid passing too many arguments to the MMIO helpers, diff --git a/linux-user/main.c b/linux-user/main.c index ac78024..c8723e7 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -3191,6 +3191,7 @@ void init_task_state(TaskState *ts) =20 CPUArchState *cpu_copy(CPUArchState *env) { + CPUState *cpu =3D ENV_GET_CPU(env); CPUArchState *new_env =3D cpu_init(cpu_model); #if defined(TARGET_HAS_ICE) CPUBreakpoint *bp; @@ -3206,12 +3207,12 @@ CPUArchState *cpu_copy(CPUArchState *env) Note: Once we support ptrace with hw-debug register access, make = sure BP_CPU break/watchpoints are handled correctly on clone. */ QTAILQ_INIT(&env->breakpoints); - QTAILQ_INIT(&env->watchpoints); + QTAILQ_INIT(&cpu->watchpoints); #if defined(TARGET_HAS_ICE) QTAILQ_FOREACH(bp, &env->breakpoints, entry) { cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL); } - QTAILQ_FOREACH(wp, &env->watchpoints, entry) { + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { cpu_watchpoint_insert(new_env, wp->vaddr, (~wp->len_mask) + 1, wp->flags, NULL); } diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 3620699..36e62b1 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -850,7 +850,7 @@ typedef struct CPUX86State { target_ulong dr[8]; /* debug registers */ union { CPUBreakpoint *cpu_breakpoint[4]; - CPUWatchpoint *cpu_watchpoint[4]; + struct CPUWatchpoint *cpu_watchpoint[4]; }; /* break/watchpoints for dr[0..3] */ uint32_t smbase; int old_exception; /* exception in flight */ diff --git a/target-i386/helper.c b/target-i386/helper.c index 864d9f8..2a5ffc2 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -1083,11 +1083,12 @@ bool check_hw_breakpoints(CPUX86State *env, bool = force_dr6_update) =20 void breakpoint_handler(CPUX86State *env) { + CPUState *cs =3D CPU(x86_env_get_cpu(env)); CPUBreakpoint *bp; =20 - if (env->watchpoint_hit) { - if (env->watchpoint_hit->flags & BP_CPU) { - env->watchpoint_hit =3D NULL; + if (cs->watchpoint_hit) { + if (cs->watchpoint_hit->flags & BP_CPU) { + cs->watchpoint_hit =3D NULL; if (check_hw_breakpoints(env, false)) { raise_exception(env, EXCP01_DB); } else { diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 749aa09..64aa43b 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -2199,13 +2199,13 @@ static int kvm_handle_debug(X86CPU *cpu, break; case 0x1: ret =3D EXCP_DEBUG; - env->watchpoint_hit =3D &hw_watchpoint; + cs->watchpoint_hit =3D &hw_watchpoint; hw_watchpoint.vaddr =3D hw_breakpoint[n].addr; hw_watchpoint.flags =3D BP_MEM_WRITE; break; case 0x3: ret =3D EXCP_DEBUG; - env->watchpoint_hit =3D &hw_watchpoint; + cs->watchpoint_hit =3D &hw_watchpoint; hw_watchpoint.vaddr =3D hw_breakpoint[n].addr; hw_watchpoint.flags =3D BP_MEM_ACCESS; break; @@ -2213,11 +2213,11 @@ static int kvm_handle_debug(X86CPU *cpu, } } } - } else if (kvm_find_sw_breakpoint(CPU(cpu), arch_info->pc)) { + } else if (kvm_find_sw_breakpoint(cs, arch_info->pc)) { ret =3D EXCP_DEBUG; } if (ret =3D=3D 0) { - cpu_synchronize_state(CPU(cpu)); + cpu_synchronize_state(cs); assert(env->exception_injected =3D=3D -1); =20 /* pass to guest */ diff --git a/target-xtensa/cpu.h b/target-xtensa/cpu.h index 5d2a059..007a805 100644 --- a/target-xtensa/cpu.h +++ b/target-xtensa/cpu.h @@ -355,7 +355,7 @@ typedef struct CPUXtensaState { int exception_taken; =20 /* Watchpoints for DBREAK registers */ - CPUWatchpoint *cpu_watchpoint[MAX_NDBREAK]; + struct CPUWatchpoint *cpu_watchpoint[MAX_NDBREAK]; =20 CPU_COMMON } CPUXtensaState; diff --git a/target-xtensa/helper.c b/target-xtensa/helper.c index f55095e..c44cf71 100644 --- a/target-xtensa/helper.c +++ b/target-xtensa/helper.c @@ -81,11 +81,13 @@ static uint32_t check_hw_breakpoints(CPUXtensaState *= env) =20 void xtensa_breakpoint_handler(CPUXtensaState *env) { - if (env->watchpoint_hit) { - if (env->watchpoint_hit->flags & BP_CPU) { + CPUState *cs =3D CPU(xtensa_env_get_cpu(env)); + + if (cs->watchpoint_hit) { + if (cs->watchpoint_hit->flags & BP_CPU) { uint32_t cause; =20 - env->watchpoint_hit =3D NULL; + cs->watchpoint_hit =3D NULL; cause =3D check_hw_breakpoints(env); if (cause) { debug_exception_env(env, cause); --=20 1.8.1.4