From 8717ed04aaa465dcd6ae722b120b2cd4fdc4c8b4 Mon Sep 17 00:00:00 2001 From: zwelch Date: Sun, 24 May 2009 00:47:49 +0000 Subject: SimonQian : Changes svf_check_tdo function (checks tdo output matches desired values): - call buf_cmp_mask function to do comparison instead of using a loop. - fixes a bug when data length is equal to sizeof(int). git-svn-id: svn://svn.berlios.de/openocd/trunk@1900 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/svf/svf.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/svf/svf.c b/src/svf/svf.c index 3cad4c7e..0552c122 100644 --- a/src/svf/svf.c +++ b/src/svf/svf.c @@ -628,32 +628,35 @@ static int svf_copy_hexstring_to_binary(char *str, u8 **bin, int orig_bit_len, i static int svf_check_tdo(void) { - int i, j, byte_len, index; + int i, len, index; for (i = 0; i < svf_check_tdo_para_index; i++) { - if (svf_check_tdo_para[i].enabled) + index = svf_check_tdo_para[i].buffer_offset; + len = svf_check_tdo_para[i].bit_len; + if ((svf_check_tdo_para[i].enabled) + && buf_cmp_mask(&svf_tdi_buffer[index], &svf_tdo_buffer[index], &svf_mask_buffer[index], len)) { - byte_len = (svf_check_tdo_para[i].bit_len + 7) >> 3; - index = svf_check_tdo_para[i].buffer_offset; - for (j = 0; j < byte_len; j++) + unsigned bitmask; + unsigned received, expected, tapmask; + if (svf_check_tdo_para[i].bit_len >= 32) { - if ((svf_tdi_buffer[index + j] & svf_mask_buffer[index + j]) != svf_tdo_buffer[index + j]) - { - unsigned bitmask = (1 << svf_check_tdo_para[i].bit_len) - 1; - unsigned received, expected, tapmask; - memcpy(&received, svf_tdi_buffer + index, sizeof(unsigned)); - memcpy(&expected, svf_tdo_buffer + index, sizeof(unsigned)); - memcpy(&tapmask, svf_mask_buffer + index, sizeof(unsigned)); - LOG_ERROR("tdo check error at line %d, " - "read = 0x%X, want = 0x%X, mask = 0x%X", - svf_check_tdo_para[i].line_num, - received & bitmask, - expected & bitmask, - tapmask & bitmask); - return ERROR_FAIL; - } + bitmask = 0xFFFFFFFF; } + else + { + bitmask = (1 << svf_check_tdo_para[i].bit_len) - 1; + } + memcpy(&received, svf_tdi_buffer + index, sizeof(unsigned)); + memcpy(&expected, svf_tdo_buffer + index, sizeof(unsigned)); + memcpy(&tapmask, svf_mask_buffer + index, sizeof(unsigned)); + LOG_ERROR("tdo check error at line %d", + svf_check_tdo_para[i].line_num); + LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X", + received & bitmask, + expected & bitmask, + tapmask & bitmask); + return ERROR_FAIL; } } svf_check_tdo_para_index = 0; -- cgit v1.2.3