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>
ADDR_COMPARATOR(14),
ADDR_COMPARATOR(15),
ADDR_COMPARATOR(16),
+ { 0, 0, 0, 0, NULL }
#undef ADDR_COMPARATOR
};
DATA_COMPARATOR(6),
DATA_COMPARATOR(7),
DATA_COMPARATOR(8),
+ { 0, 0, 0, 0, NULL }
#undef DATA_COMPARATOR
};
ETM_COUNTER(2),
ETM_COUNTER(3),
ETM_COUNTER(4),
+ { 0, 0, 0, 0, NULL }
#undef ETM_COUNTER
};
ETM_OUTPUT(2),
ETM_OUTPUT(3),
ETM_OUTPUT(4),
+ { 0, 0, 0, 0, NULL }
#undef ETM_OUTPUT
};
* 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)