X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Farm_semihosting.c;h=f4244c84d11c15985590e2abda59317f1db34fb3;hb=48d51e1719c2b48509786bba7c84c09d329929d3;hp=39625f61bcaccc5f7726358112021d749c0af7af;hpb=340e2eb7629fc1fdb6d2ead2952982584abdcefa;p=openocd.git diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c index 39625f61bc..f4244c84d1 100644 --- a/src/target/arm_semihosting.c +++ b/src/target/arm_semihosting.c @@ -34,6 +34,7 @@ #include "config.h" #endif +#include "arm.h" #include "armv4_5.h" #include "register.h" #include "arm_semihosting.h" @@ -414,18 +415,16 @@ static int do_semihosting(struct target *target) int arm_semihosting(struct target *target, int *retval) { struct arm *arm = target_to_arm(target); - uint32_t lr, spsr; + uint32_t pc, lr, spsr; struct reg *r; if (!arm->is_semihosting || arm->core_mode != ARM_MODE_SVC) return 0; - /* Check for PC == 8: Supervisor Call vector - * REVISIT: assumes low exception vectors, not hivecs... - * safer to test "was this entry from a vector catch". - */ + /* Check for PC == 0x00000008 or 0xffff0008: Supervisor Call vector. */ r = arm->core_cache->reg_list + 15; - if (buf_get_u32(r->value, 0, 32) != 0x08) + pc = buf_get_u32(r->value, 0, 32); + if (pc != 0x00000008 && pc != 0xffff0008) return 0; r = arm_reg_current(arm, 14);