This is an automated email from Gerrit.

Jan Matyas ([email protected]) just uploaded a new patch set to Gerrit, which 
you can find at http://openocd.zylin.com/5330

-- gerrit

commit 4ccbf0596c0dd25d331dddb2df1cb6b7b0cb1f5e
Author: Jan Matyas <[email protected]>
Date:   Mon Oct 21 08:44:08 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
    
    - Fixed usage message of jtag_vpi_command_handlers
    
    Change-Id: I0c8c47993dfc51f8a070e36205caefda0956169a
    Signed-off-by: Jan Matyas <[email protected]>

diff --git a/src/jtag/drivers/jtag_vpi.c b/src/jtag/drivers/jtag_vpi.c
index de93bcc..cf4cf7b 100644
--- a/src/jtag/drivers/jtag_vpi.c
+++ b/src/jtag/drivers/jtag_vpi.c
@@ -71,8 +71,56 @@ struct vpi_cmd {
        };
 };
 
+static char *jtag_vpi_cmd_to_str(int cmd_num)
+{
+       switch (cmd_num) {
+       case CMD_RESET:
+               return "CMD_RESET";
+       case CMD_TMS_SEQ:
+               return "CMD_TMS_SEQ";
+       case CMD_SCAN_CHAIN:
+               return "CMD_SCAN_CHAIN";
+       case CMD_SCAN_CHAIN_FLIP_TMS:
+               return "CMD_SCAN_CHAIN_FLIP_TMS";
+       case CMD_STOP_SIMU:
+               return "CMD_STOP_SIMU";
+       default:
+               return "<unknown>";
+       }
+}
+
 static int jtag_vpi_send_cmd(struct vpi_cmd *vpi)
 {
+       /* Optional low-level JTAG debug */
+       if (LOG_LEVEL_IS(LOG_LVL_DEBUG_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_IO("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_IO("sending JTAG VPI cmd: cmd=%s, "
+                                       "length=%" PRIu32 ", "
+                                       "nb_bits=%" PRIu32,
+                                       jtag_vpi_cmd_to_str(vpi->cmd),
+                                       vpi->length,
+                                       vpi->nb_bits);
+               }
+       }
+
        /* Use little endian when transmitting/receiving jtag_vpi cmds.
           The choice of little endian goes against usual networking conventions
           but is intentional to remain compatible with most older OpenOCD 
builds
@@ -110,6 +158,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;
@@ -132,6 +181,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;
@@ -199,6 +249,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)
@@ -217,6 +269,16 @@ 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 */
+       if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) {
+               char *char_buf = buf_to_str(vpi.buffer_in,
+                               (nb_bits > DEBUG_JTAG_IOZ) ? DEBUG_JTAG_IOZ : 
nb_bits,
+                               16);
+               LOG_DEBUG_IO("recvd JTAG VPI data: nb_bits=%d, buf_in=0x%s%s",
+                       nb_bits, char_buf, (nb_bits > DEBUG_JTAG_IOZ) ? "(...)" 
: "");
+               free(char_buf);
+       }
+
        if (bits)
                memcpy(bits, vpi.buffer_in, nb_bytes);
 
@@ -459,7 +521,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)
@@ -495,14 +557,14 @@ static const struct command_registration 
jtag_vpi_command_handlers[] = {
                .handler = &jtag_vpi_set_port,
                .mode = COMMAND_CONFIG,
                .help = "set the port of the VPI server",
-               .usage = "description_string",
+               .usage = "tcp_port_num",
        },
        {
                .name = "jtag_vpi_set_address",
                .handler = &jtag_vpi_set_address,
                .mode = COMMAND_CONFIG,
                .help = "set the address of the VPI server",
-               .usage = "description_string",
+               .usage = "ipv4_addr",
        },
        COMMAND_REGISTRATION_DONE
 };

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to