From: Liming Sun Date: Mon, 5 Nov 2018 15:26:05 +0000 (-0500) Subject: target: armv8: Add TARGET_HALTED check for gdb connect X-Git-Tag: v0.11.0-rc1~905 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=651998e33771bdad56873e3e70bd875104ca1d12;hp=bff87a7f28fb60b40f14a91ed3bef982bdc8db92 target: armv8: Add TARGET_HALTED check for gdb connect This commit adds TARGET_HALTED check in armv8_get_core_reg32() and armv8_set_core_reg32() to void a crash issue when gdb connects but fails to halt the ARM core. Similar logic can be found in armv8_get_core_reg() and armv8_set_core_reg(). Below is the call stack information of this case when gdb connects. (gdb) bt regnum=regnum@entry=0, dpm=0x990110) at src/target/armv8_dpm.c:657 r=0x9c7240, regnum=0, mode=) at src/target/armv8_dpm.c:974 at src/target/armv8.c:1487 packet=0x8ec8e0 "g", packet_size=, connection=) at src/server/gdb_server.c:1200 at src/server/gdb_server.c:3180 command_context=command_context@entry=0x935010) at src/server/server.c:566 ... Change-Id: I159837b533f110998184f910a0abe48409bd58f1 Signed-off-by: Liming Sun Reviewed-on: http://openocd.zylin.com/4758 Tested-by: jenkins Reviewed-by: Matthias Welwarsky --- diff --git a/src/target/armv8.c b/src/target/armv8.c index 75ada896d8..887e21df73 100644 --- a/src/target/armv8.c +++ b/src/target/armv8.c @@ -1477,6 +1477,9 @@ static int armv8_get_core_reg32(struct reg *reg) struct reg *reg64; int retval; + if (target->state != TARGET_HALTED) + return ERROR_TARGET_NOT_HALTED; + /* get the corresponding Aarch64 register */ reg64 = cache->reg_list + armv8_reg->num; if (reg64->valid) { @@ -1500,6 +1503,9 @@ static int armv8_set_core_reg32(struct reg *reg, uint8_t *buf) struct reg *reg64 = cache->reg_list + armv8_reg->num; uint32_t value = buf_get_u32(buf, 0, 32); + if (target->state != TARGET_HALTED) + return ERROR_TARGET_NOT_HALTED; + if (reg64 == arm->cpsr) { armv8_set_cpsr(arm, value); } else {