aboutsummaryrefslogtreecommitdiff
path: root/src/jtag/drivers
diff options
context:
space:
mode:
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>2012-08-23 23:35:48 +0200
committerFreddie Chopin <freddie.chopin@gmail.com>2012-08-29 06:31:59 +0000
commit6055d952c3efd2e6b12924c5ec42407fff99b453 (patch)
treefbaa910a62824446f867692736801126c7e65446 /src/jtag/drivers
parentd9a02fda075c466dd4a37785d886a4b1ee382242 (diff)
downloadriscv-openocd-6055d952c3efd2e6b12924c5ec42407fff99b453.zip
riscv-openocd-6055d952c3efd2e6b12924c5ec42407fff99b453.tar.gz
riscv-openocd-6055d952c3efd2e6b12924c5ec42407fff99b453.tar.bz2
ftdi: fix overflow if last field of a scan is empty
The last bit of a scan is clocked during TAP movement so it's necessary for the last field to have at least one bit. Strip trailing empty fields and make sure the TAP is not affected if there's nothing to scan. Clients probably shouldn't add empty fields so add a debug message to be able to track and fix them. Change-Id: I27552568bc11146570b9b99ed8a1ae81b5fb2c50 Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/794 Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk> Tested-by: jenkins Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
Diffstat (limited to 'src/jtag/drivers')
-rw-r--r--src/jtag/drivers/ftdi.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c
index 72b08fd..46797d7 100644
--- a/src/jtag/drivers/ftdi.c
+++ b/src/jtag/drivers/ftdi.c
@@ -389,6 +389,18 @@ static int ftdi_execute_scan(struct jtag_command *cmd)
DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN",
jtag_scan_type(cmd->cmd.scan));
+ /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
+ while (cmd->cmd.scan->num_fields > 0
+ && cmd->cmd.scan->fields[cmd->cmd.scan->num_fields - 1].num_bits == 0) {
+ cmd->cmd.scan->num_fields--;
+ LOG_DEBUG("discarding trailing empty field");
+ }
+
+ if (cmd->cmd.scan->num_fields == 0) {
+ LOG_DEBUG("empty scan, doing nothing");
+ return retval;
+ }
+
if (cmd->cmd.scan->ir_scan) {
if (tap_get_state() != TAP_IRSHIFT)
move_to_state(TAP_IRSHIFT);
@@ -413,7 +425,7 @@ static int ftdi_execute_scan(struct jtag_command *cmd)
if (i == cmd->cmd.scan->num_fields - 1 && tap_get_state() != tap_get_end_state()) {
/* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
- *movement */
+ * movement. This last field can't have length zero, it was checked above. */
mpsse_clock_data(mpsse_ctx,
field->out_value,
0,