mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 09:43:56 -06:00
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
This commit is contained in:
parent
d6fc1b397b
commit
a1d1bb3101
13 changed files with 274 additions and 190 deletions
|
@ -2965,6 +2965,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
|
|||
{
|
||||
DisasContext dc1, *dc = &dc1;
|
||||
uint16_t *gen_opc_end;
|
||||
CPUBreakpoint *bp;
|
||||
int j, lj;
|
||||
target_ulong pc_start;
|
||||
int pc_offset;
|
||||
|
@ -2998,9 +2999,9 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
|
|||
do {
|
||||
pc_offset = dc->pc - pc_start;
|
||||
gen_throws_exception = NULL;
|
||||
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_exception(dc, dc->pc, EXCP_DEBUG);
|
||||
dc->is_jmp = DISAS_JUMP;
|
||||
break;
|
||||
|
@ -3030,7 +3031,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
|
|||
/* Terminate the TB on memory ops if watchpoints are present. */
|
||||
/* FIXME: This should be replaced by the deterministic execution
|
||||
* IRQ raising bits. */
|
||||
if (dc->is_mem && env->nb_watchpoints)
|
||||
if (dc->is_mem && env->watchpoints)
|
||||
break;
|
||||
} while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
|
||||
!env->singlestep_enabled &&
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue