diff --git a/qemu/aarch64.h b/qemu/aarch64.h index 1a8b84b8..d7ada6ea 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_aarch64 #define arm_current_el arm_current_el_aarch64 #define arm_dc_feature arm_dc_feature_aarch64 +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_aarch64 #define arm_debug_excp_handler arm_debug_excp_handler_aarch64 #define arm_debug_target_el arm_debug_target_el_aarch64 #define arm_el_is_aa64 arm_el_is_aa64_aarch64 diff --git a/qemu/aarch64eb.h b/qemu/aarch64eb.h index 75a6a263..95f25aea 100644 --- a/qemu/aarch64eb.h +++ b/qemu/aarch64eb.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_aarch64eb #define arm_current_el arm_current_el_aarch64eb #define arm_dc_feature arm_dc_feature_aarch64eb +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_aarch64eb #define arm_debug_excp_handler arm_debug_excp_handler_aarch64eb #define arm_debug_target_el arm_debug_target_el_aarch64eb #define arm_el_is_aa64 arm_el_is_aa64_aarch64eb diff --git a/qemu/arm.h b/qemu/arm.h index a6012974..13121a33 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_arm #define arm_current_el arm_current_el_arm #define arm_dc_feature arm_dc_feature_arm +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_arm #define arm_debug_excp_handler arm_debug_excp_handler_arm #define arm_debug_target_el arm_debug_target_el_arm #define arm_el_is_aa64 arm_el_is_aa64_arm diff --git a/qemu/armeb.h b/qemu/armeb.h index 12d5c156..2c318666 100644 --- a/qemu/armeb.h +++ b/qemu/armeb.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_armeb #define arm_current_el arm_current_el_armeb #define arm_dc_feature arm_dc_feature_armeb +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_armeb #define arm_debug_excp_handler arm_debug_excp_handler_armeb #define arm_debug_target_el arm_debug_target_el_armeb #define arm_el_is_aa64 arm_el_is_aa64_armeb diff --git a/qemu/header_gen.py b/qemu/header_gen.py index 94217a76..549fd72c 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -150,6 +150,7 @@ symbols = ( 'arm_cp_write_ignore', 'arm_current_el', 'arm_dc_feature', + 'arm_debug_check_watchpoint', 'arm_debug_excp_handler', 'arm_debug_target_el', 'arm_el_is_aa64', diff --git a/qemu/m68k.h b/qemu/m68k.h index 345417df..c1e234f7 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_m68k #define arm_current_el arm_current_el_m68k #define arm_dc_feature arm_dc_feature_m68k +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_m68k #define arm_debug_excp_handler arm_debug_excp_handler_m68k #define arm_debug_target_el arm_debug_target_el_m68k #define arm_el_is_aa64 arm_el_is_aa64_m68k diff --git a/qemu/mips.h b/qemu/mips.h index 9e1b0140..ff6939d7 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_mips #define arm_current_el arm_current_el_mips #define arm_dc_feature arm_dc_feature_mips +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_mips #define arm_debug_excp_handler arm_debug_excp_handler_mips #define arm_debug_target_el arm_debug_target_el_mips #define arm_el_is_aa64 arm_el_is_aa64_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index d7e91bba..a4e7b0b4 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_mips64 #define arm_current_el arm_current_el_mips64 #define arm_dc_feature arm_dc_feature_mips64 +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_mips64 #define arm_debug_excp_handler arm_debug_excp_handler_mips64 #define arm_debug_target_el arm_debug_target_el_mips64 #define arm_el_is_aa64 arm_el_is_aa64_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index 7d024906..47942f4c 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_mips64el #define arm_current_el arm_current_el_mips64el #define arm_dc_feature arm_dc_feature_mips64el +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_mips64el #define arm_debug_excp_handler arm_debug_excp_handler_mips64el #define arm_debug_target_el arm_debug_target_el_mips64el #define arm_el_is_aa64 arm_el_is_aa64_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index d5fe6ad7..a0e12926 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_mipsel #define arm_current_el arm_current_el_mipsel #define arm_dc_feature arm_dc_feature_mipsel +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_mipsel #define arm_debug_excp_handler arm_debug_excp_handler_mipsel #define arm_debug_target_el arm_debug_target_el_mipsel #define arm_el_is_aa64 arm_el_is_aa64_mipsel diff --git a/qemu/powerpc.h b/qemu/powerpc.h index bab50b2f..8debe063 100644 --- a/qemu/powerpc.h +++ b/qemu/powerpc.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_powerpc #define arm_current_el arm_current_el_powerpc #define arm_dc_feature arm_dc_feature_powerpc +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_powerpc #define arm_debug_excp_handler arm_debug_excp_handler_powerpc #define arm_debug_target_el arm_debug_target_el_powerpc #define arm_el_is_aa64 arm_el_is_aa64_powerpc diff --git a/qemu/sparc.h b/qemu/sparc.h index 5d4ec40c..6f458f7f 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_sparc #define arm_current_el arm_current_el_sparc #define arm_dc_feature arm_dc_feature_sparc +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_sparc #define arm_debug_excp_handler arm_debug_excp_handler_sparc #define arm_debug_target_el arm_debug_target_el_sparc #define arm_el_is_aa64 arm_el_is_aa64_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index a897a544..10e22648 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_sparc64 #define arm_current_el arm_current_el_sparc64 #define arm_dc_feature arm_dc_feature_sparc64 +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_sparc64 #define arm_debug_excp_handler arm_debug_excp_handler_sparc64 #define arm_debug_target_el arm_debug_target_el_sparc64 #define arm_el_is_aa64 arm_el_is_aa64_sparc64 diff --git a/qemu/target-arm/cpu.c b/qemu/target-arm/cpu.c index b4bae8e9..192e8f63 100644 --- a/qemu/target-arm/cpu.c +++ b/qemu/target-arm/cpu.c @@ -1343,6 +1343,7 @@ static void arm_cpu_class_init(struct uc_struct *uc, ObjectClass *oc, void *data //cc->virtio_is_big_endian = arm_cpu_is_big_endian; #endif cc->debug_excp_handler = arm_debug_excp_handler; + cc->debug_check_watchpoint = arm_debug_check_watchpoint; } static void cpu_register(struct uc_struct *uc, const ARMCPUInfo *info) diff --git a/qemu/target-arm/internals.h b/qemu/target-arm/internals.h index 36838291..0a3d979e 100644 --- a/qemu/target-arm/internals.h +++ b/qemu/target-arm/internals.h @@ -411,6 +411,9 @@ void hw_breakpoint_update(ARMCPU *cpu, int n); */ void hw_breakpoint_update_all(ARMCPU *cpu); +/* Callback function for checking if a watchpoint should trigger. */ +bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp); + /* Callback function for when a watchpoint or breakpoint triggers. */ void arm_debug_excp_handler(CPUState *cs); diff --git a/qemu/target-arm/op_helper.c b/qemu/target-arm/op_helper.c index 2f7dcec7..c922c2af 100644 --- a/qemu/target-arm/op_helper.c +++ b/qemu/target-arm/op_helper.c @@ -973,6 +973,16 @@ void HELPER(check_breakpoints)(CPUARMState *env) } } +bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp) +{ + /* Called by core code when a CPU watchpoint fires; need to check if this + * is also an architectural watchpoint match. + */ + ARMCPU *cpu = ARM_CPU(cs->uc, cs); + + return check_watchpoints(cpu); +} + void arm_debug_excp_handler(CPUState *cs) { /* Called by core code when a watchpoint or breakpoint fires; @@ -984,23 +994,19 @@ void arm_debug_excp_handler(CPUState *cs) if (wp_hit) { if (wp_hit->flags & BP_CPU) { - cs->watchpoint_hit = NULL; - if (check_watchpoints(cpu)) { - bool wnr = (wp_hit->flags & BP_WATCHPOINT_HIT_WRITE) != 0; - bool same_el = arm_debug_target_el(env) == arm_current_el(env); + bool wnr = (wp_hit->flags & BP_WATCHPOINT_HIT_WRITE) != 0; + bool same_el = arm_debug_target_el(env) == arm_current_el(env); - if (extended_addresses_enabled(env)) { - env->exception.fsr = (1 << 9) | 0x22; - } else { - env->exception.fsr = 0x2; - } - env->exception.vaddress = wp_hit->hitaddr; - raise_exception(env, EXCP_DATA_ABORT, - syn_watchpoint(same_el, 0, wnr), - arm_debug_target_el(env)); + cs->watchpoint_hit = NULL; + if (extended_addresses_enabled(env)) { + env->exception.fsr = (1 << 9) | 0x22; } else { - cpu_resume_from_signal(cs, NULL); + env->exception.fsr = 0x2; } + env->exception.vaddress = wp_hit->hitaddr; + raise_exception(env, EXCP_DATA_ABORT, + syn_watchpoint(same_el, 0, wnr), + arm_debug_target_el(env)); } } else { uint64_t pc = is_a64(env) ? env->pc : env->regs[15]; diff --git a/qemu/x86_64.h b/qemu/x86_64.h index c7b4f1bb..527c9c4d 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -144,6 +144,7 @@ #define arm_cp_write_ignore arm_cp_write_ignore_x86_64 #define arm_current_el arm_current_el_x86_64 #define arm_dc_feature arm_dc_feature_x86_64 +#define arm_debug_check_watchpoint arm_debug_check_watchpoint_x86_64 #define arm_debug_excp_handler arm_debug_excp_handler_x86_64 #define arm_debug_target_el arm_debug_target_el_x86_64 #define arm_el_is_aa64 arm_el_is_aa64_x86_64