617 |
tb_reset_jump_recursive2(tb, 1); |
tb_reset_jump_recursive2(tb, 1); |
618 |
} |
} |
619 |
|
|
620 |
|
/* add a breakpoint */ |
621 |
|
int cpu_breakpoint_insert(CPUState *env, uint32_t pc) |
622 |
|
{ |
623 |
|
#if defined(TARGET_I386) |
624 |
|
int i; |
625 |
|
|
626 |
|
for(i = 0; i < env->nb_breakpoints; i++) { |
627 |
|
if (env->breakpoints[i] == pc) |
628 |
|
return 0; |
629 |
|
} |
630 |
|
|
631 |
|
if (env->nb_breakpoints >= MAX_BREAKPOINTS) |
632 |
|
return -1; |
633 |
|
env->breakpoints[env->nb_breakpoints++] = pc; |
634 |
|
tb_invalidate_page(pc); |
635 |
|
return 0; |
636 |
|
#else |
637 |
|
return -1; |
638 |
|
#endif |
639 |
|
} |
640 |
|
|
641 |
|
/* remove a breakpoint */ |
642 |
|
int cpu_breakpoint_remove(CPUState *env, uint32_t pc) |
643 |
|
{ |
644 |
|
#if defined(TARGET_I386) |
645 |
|
int i; |
646 |
|
for(i = 0; i < env->nb_breakpoints; i++) { |
647 |
|
if (env->breakpoints[i] == pc) |
648 |
|
goto found; |
649 |
|
} |
650 |
|
return -1; |
651 |
|
found: |
652 |
|
memmove(&env->breakpoints[i], &env->breakpoints[i + 1], |
653 |
|
(env->nb_breakpoints - (i + 1)) * sizeof(env->breakpoints[0])); |
654 |
|
env->nb_breakpoints--; |
655 |
|
tb_invalidate_page(pc); |
656 |
|
return 0; |
657 |
|
#else |
658 |
|
return -1; |
659 |
|
#endif |
660 |
|
} |
661 |
|
|
662 |
/* mask must never be zero */ |
/* mask must never be zero */ |
663 |
void cpu_interrupt(CPUState *env, int mask) |
void cpu_interrupt(CPUState *env, int mask) |
664 |
{ |
{ |