diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-11-18 20:07:32 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-11-18 20:07:32 +0000 |
commit | b81e20ab820a97c45a89fd81cfa8fc0e9740e242 (patch) | |
tree | d8062f3891754bd62a26bfd58613b5c74fb029c3 /target-arm | |
parent | 720df0f27817f100fdb0cad8e9933b8af92ddc48 (diff) | |
download | qemu-b81e20ab820a97c45a89fd81cfa8fc0e9740e242.tar.gz qemu-b81e20ab820a97c45a89fd81cfa8fc0e9740e242.tar.bz2 qemu-b81e20ab820a97c45a89fd81cfa8fc0e9740e242.zip |
Refactor and enhance break/watchpoint API (Jan Kiszka)
This patch prepares the QEMU cpu_watchpoint/breakpoint API to allow the
succeeding enhancements this series comes with.
First of all, it overcomes MAX_BREAKPOINTS/MAX_WATCHPOINTS by switching
to dynamically allocated data structures that are kept in linked lists.
This also allows to return a stable reference to the related objects,
required for later introduced x86 debug register support.
Breakpoints and watchpoints are stored with their full information set
and an additional flag field that makes them easily extensible for use
beyond pure guest debugging.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5738 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-arm')
-rw-r--r-- | target-arm/translate.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/target-arm/translate.c b/target-arm/translate.c index 9d52991b40..237c5f6941 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -8600,6 +8600,7 @@ static inline void gen_intermediate_code_internal(CPUState *env, int search_pc) { DisasContext dc1, *dc = &dc1; + CPUBreakpoint *bp; uint16_t *gen_opc_end; int j, lj; target_ulong pc_start; @@ -8676,9 +8677,9 @@ static inline void gen_intermediate_code_internal(CPUState *env, } #endif - if (env->nb_breakpoints > 0) { - for(j = 0; j < env->nb_breakpoints; j++) { - if (env->breakpoints[j] == dc->pc) { + if (unlikely(env->breakpoints)) { + for (bp = env->breakpoints; bp != NULL; bp = bp->next) { + if (bp->pc == dc->pc) { gen_set_condexec(dc); gen_set_pc_im(dc->pc); gen_exception(EXCP_DEBUG); @@ -8731,7 +8732,7 @@ static inline void gen_intermediate_code_internal(CPUState *env, /* Terminate the TB on memory ops if watchpoints are present. */ /* FIXME: This should be replacd by the deterministic execution * IRQ raising bits. */ - if (dc->is_mem && env->nb_watchpoints) + if (dc->is_mem && env->watchpoints) break; /* Translation stops when a conditional branch is enoutered. |