This is an automated email from Gerrit. Jan Matyas (mat...@codasip.com) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/5177
-- gerrit commit a8f54f0a8f5abe169b07c5b7f4f7f112dcfe0839 Author: Jan Matyas <mat...@codasip.com> Date: Thu May 2 12:22:39 2019 +0200 jtag_vpi: multiple smaller improvements - Added low-level JTAG IO debug capability (_DEBUG_JTAG_IO_) - Zero-fill packet buffers, avoid sending pieces of uninitialized memory over the network (memset struct vpi_cmd) - Use close_socket() instead of close() - needed for Win32 Change-Id: I8bd19bc5c9512fe8e798600212e8a95213f50f5b Signed-off-by: Jan Matyas <mat...@codasip.com> diff --git a/src/jtag/drivers/jtag_vpi.c b/src/jtag/drivers/jtag_vpi.c index e349113..f8f187f 100644 --- a/src/jtag/drivers/jtag_vpi.c +++ b/src/jtag/drivers/jtag_vpi.c @@ -76,8 +76,52 @@ static uint32_t to_little_endian_u32(uint32_t val) return from_little_endian_u32(val); } +#ifdef _DEBUG_JTAG_IO_ +static char *jtag_vpi_cmd_to_str(int cmd_num) +{ + switch (cmd_num) { + case CMD_RESET: return "CMD_RESET"; break; + case CMD_TMS_SEQ: return "CMD_TMS_SEQ"; break; + case CMD_SCAN_CHAIN: return "CMD_SCAN_CHAIN"; break; + case CMD_SCAN_CHAIN_FLIP_TMS: + return "CMD_SCAN_CHAIN_FLIP_TMS"; break; + case CMD_STOP_SIMU: return "CMD_STOP_SIMU"; break; + default: return "<unknown>"; break; + } +} +#endif /* _DEBUG_JTAG_IO_ */ + static int jtag_vpi_send_cmd(struct vpi_cmd *vpi) { + /* Optional low-level JTAG debug */ +#ifdef _DEBUG_JTAG_IO_ + if (vpi->nb_bits > 0) { + /* command with a non-empty data payload */ + char *char_buf = buf_to_str(vpi->buffer_out, + (vpi->nb_bits > DEBUG_JTAG_IOZ) + ? DEBUG_JTAG_IOZ + : vpi->nb_bits, 16); + LOG_DEBUG("sending JTAG VPI cmd: cmd=%s, " + "length=%" PRIu32 ", " + "nb_bits=%" PRIu32 ", " + "buf_out=0x%s%s", + jtag_vpi_cmd_to_str(vpi->cmd), + vpi->length, + vpi->nb_bits, + char_buf, + (vpi->nb_bits > DEBUG_JTAG_IOZ) ? "(...)" : ""); + free(char_buf); + } else { + /* command without data payload */ + LOG_DEBUG("sending JTAG VPI cmd: cmd=%s, " + "length=%" PRIu32 ", " + "nb_bits=%" PRIu32, + jtag_vpi_cmd_to_str(vpi->cmd), + vpi->length, + vpi->nb_bits); + } +#endif /* _DEBUG_JTAG_IO_ */ + /* Always use little endian when transmitting/receiving jtag_vpi cmds. The choice of little endian goes against usual networking conventions @@ -86,6 +130,7 @@ static int jtag_vpi_send_cmd(struct vpi_cmd *vpi) vpi->cmd = to_little_endian_u32(vpi->cmd); vpi->length = to_little_endian_u32(vpi->length); vpi->nb_bits = to_little_endian_u32(vpi->nb_bits); + int retval = write_socket(sockfd, vpi, sizeof(struct vpi_cmd)); if (retval <= 0) return ERROR_FAIL; @@ -115,6 +160,7 @@ static int jtag_vpi_receive_cmd(struct vpi_cmd *vpi) static int jtag_vpi_reset(int trst, int srst) { struct vpi_cmd vpi; + memset(&vpi, 0, sizeof(struct vpi_cmd)); vpi.cmd = CMD_RESET; vpi.length = 0; @@ -137,6 +183,7 @@ static int jtag_vpi_tms_seq(const uint8_t *bits, int nb_bits) struct vpi_cmd vpi; int nb_bytes; + memset(&vpi, 0, sizeof(struct vpi_cmd)); nb_bytes = DIV_ROUND_UP(nb_bits, 8); vpi.cmd = CMD_TMS_SEQ; @@ -204,6 +251,8 @@ static int jtag_vpi_queue_tdi_xfer(uint8_t *bits, int nb_bits, int tap_shift) struct vpi_cmd vpi; int nb_bytes = DIV_ROUND_UP(nb_bits, 8); + memset(&vpi, 0, sizeof(struct vpi_cmd)); + vpi.cmd = tap_shift ? CMD_SCAN_CHAIN_FLIP_TMS : CMD_SCAN_CHAIN; if (bits) @@ -222,6 +271,17 @@ static int jtag_vpi_queue_tdi_xfer(uint8_t *bits, int nb_bits, int tap_shift) if (retval != ERROR_OK) return retval; + /* Optional low-level JTAG debug */ +#ifdef _DEBUG_JTAG_IO_ + char *char_buf = buf_to_str(vpi.buffer_in, + (nb_bits > DEBUG_JTAG_IOZ) + ? DEBUG_JTAG_IOZ + : nb_bits, 16); + LOG_DEBUG("recvd JTAG VPI data: nb_bits=%d, buf_in=0x%s%s", + nb_bits, char_buf, (nb_bits > DEBUG_JTAG_IOZ) ? "(...)" : ""); + free(char_buf); +#endif /* _DEBUG_JTAG_IO_ */ + if (bits) memcpy(bits, vpi.buffer_in, nb_bytes); @@ -464,7 +524,7 @@ static int jtag_vpi_init(void) static int jtag_vpi_quit(void) { free(server_address); - return close(sockfd); + return close_socket(sockfd); } COMMAND_HANDLER(jtag_vpi_set_port) -- _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel