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

Reply via email to