aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiviu Ionescu <ilg@livius.net>2018-07-15 09:45:13 +0300
committerTomas Vanek <vanekt@fbl.cz>2018-07-18 21:10:53 +0100
commit6fa18a455f7aa78182cdead94278a8659f2dbc89 (patch)
tree24adf90bbe0bc43f909f0c0a2e43e1fa2f9b7cf1
parente270127288d608dc450a3e37557ab1b8de4620e6 (diff)
Avoid null target->semihosting references.
The new common semihosting code introduced a bug, in certain conditions target->semihosting was used without semihosting being initialised. The solution was to explicitly test for target->semihosting before dereferencing it. Change-Id: I4c83e596140c68fe4ab32e586e51f7e981a40798 Signed-off-by: Liviu Ionescu <ilg@livius.net> Reviewed-on: http://openocd.zylin.com/4603 Tested-by: jenkins Reviewed-by: Jonathan Larmour <jifl@eCosCentric.com> Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
-rw-r--r--src/target/arm_semihosting.c3
-rw-r--r--src/target/armv4_5.c6
-rw-r--r--src/target/armv7m.c6
3 files changed, 9 insertions, 6 deletions
diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c
index 31ca7792..9117a744 100644
--- a/src/target/arm_semihosting.c
+++ b/src/target/arm_semihosting.c
@@ -82,6 +82,9 @@ static int post_result(struct target *target)
{
struct arm *arm = target_to_arm(target);
+ if (!target->semihosting)
+ return ERROR_FAIL;
+
/* REVISIT this looks wrong ... ARM11 and Cortex-A8
* should work this way at least sometimes.
*/
diff --git a/src/target/armv4_5.c b/src/target/armv4_5.c
index 5ee8ead6..96a63e49 100644
--- a/src/target/armv4_5.c
+++ b/src/target/armv4_5.c
@@ -752,7 +752,7 @@ int arm_arch_state(struct target *target)
}
/* avoid filling log waiting for fileio reply */
- if (target->semihosting->hit_fileio)
+ if (target->semihosting && target->semihosting->hit_fileio)
return ERROR_OK;
LOG_USER("target halted in %s state due to %s, current mode: %s\n"
@@ -762,8 +762,8 @@ int arm_arch_state(struct target *target)
arm_mode_name(arm->core_mode),
buf_get_u32(arm->cpsr->value, 0, 32),
buf_get_u32(arm->pc->value, 0, 32),
- target->semihosting->is_active ? ", semihosting" : "",
- target->semihosting->is_fileio ? " fileio" : "");
+ (target->semihosting && target->semihosting->is_active) ? ", semihosting" : "",
+ (target->semihosting && target->semihosting->is_fileio) ? " fileio" : "");
return ERROR_OK;
}
diff --git a/src/target/armv7m.c b/src/target/armv7m.c
index 1b4e5b15..7d3bd736 100644
--- a/src/target/armv7m.c
+++ b/src/target/armv7m.c
@@ -541,7 +541,7 @@ int armv7m_arch_state(struct target *target)
uint32_t ctrl, sp;
/* avoid filling log waiting for fileio reply */
- if (target->semihosting->hit_fileio)
+ if (target->semihosting && target->semihosting->hit_fileio)
return ERROR_OK;
ctrl = buf_get_u32(arm->core_cache->reg_list[ARMV7M_CONTROL].value, 0, 32);
@@ -556,8 +556,8 @@ int armv7m_arch_state(struct target *target)
buf_get_u32(arm->pc->value, 0, 32),
(ctrl & 0x02) ? 'p' : 'm',
sp,
- target->semihosting->is_active ? ", semihosting" : "",
- target->semihosting->is_fileio ? " fileio" : "");
+ (target->semihosting && target->semihosting->is_active) ? ", semihosting" : "",
+ (target->semihosting && target->semihosting->is_fileio) ? " fileio" : "");
return ERROR_OK;
}