diff options
author | Paul Fertser <fercerpav@gmail.com> | 2013-07-16 11:29:15 +0400 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2013-07-17 14:34:07 +0000 |
commit | d1ae39efc02bb67bc637ec92b5f60254c8ac959f (patch) | |
tree | a06fa8924759760d7d22596e4143578cf36b6e4d | |
parent | d18807e7bc43228e214563ba15fd7b24acb2f8f3 (diff) |
etm: prevent segfault when reading bogus information
When I do not have the JTAG adapter connected to the target, I often
end up always reading 1s from the chain. If the OpenOCD is configured
to connect to an ETM-equipped target (i.MX25 ARM9 in my case), this
results in writing garbage values in the etm reg_cache as the ETM bit
fields for the comparators, counters and outputs are wider than the
amount of entries in the corresponding arrays. This later results in a
segfault in the first etm_reg_lookup() call.
Change-Id: Ied81fdbf3a53a3dd749e2e5e97adf86c012df575
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/1505
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
-rw-r--r-- | src/target/etm.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/target/etm.c b/src/target/etm.c index e99c24ff..be5dd020 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -144,6 +144,7 @@ static const struct etm_reg_info etm_addr_comp[] = { ADDR_COMPARATOR(14), ADDR_COMPARATOR(15), ADDR_COMPARATOR(16), + { 0, 0, 0, 0, NULL } #undef ADDR_COMPARATOR }; @@ -162,6 +163,7 @@ static const struct etm_reg_info etm_data_comp[] = { DATA_COMPARATOR(6), DATA_COMPARATOR(7), DATA_COMPARATOR(8), + { 0, 0, 0, 0, NULL } #undef DATA_COMPARATOR }; @@ -179,6 +181,7 @@ static const struct etm_reg_info etm_counters[] = { ETM_COUNTER(2), ETM_COUNTER(3), ETM_COUNTER(4), + { 0, 0, 0, 0, NULL } #undef ETM_COUNTER }; @@ -206,6 +209,7 @@ static const struct etm_reg_info etm_outputs[] = { ETM_OUTPUT(2), ETM_OUTPUT(3), ETM_OUTPUT(4), + { 0, 0, 0, 0, NULL } #undef ETM_OUTPUT }; @@ -265,6 +269,11 @@ static void etm_reg_add(unsigned bcd_vers, struct arm_jtag *jtag_info, * version of the ETM, to the specified cache. */ for (; nreg--; r++) { + /* No more registers to add */ + if (!r->size) { + LOG_ERROR("etm_reg_add is requested to add non-existing registers, ETM config might be bogus"); + return; + } /* this ETM may be too old to have some registers */ if (r->bcd_vers > bcd_vers) |