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/5407

-- gerrit

commit 096b3d4a2a590221b05d7b70e6430bc317511f31
Author: Jan Matyas <mat...@codasip.com>
Date:   Wed Jan 22 08:50:36 2020 +0100

    jtag_vpi: added an option to stop simulation on exit
    
    Command CMD_STOP_SIMU had been defined in jtag_vpi for a long time
    (since the beginning? )but has not been utilized until now.
    Its purpose is to signal to the jtag_vpi server (i.e. the RTL
    simulation software) that the simulation shall be stopped.
    
    This commit adds a TCL configuration command that configures whether
    CMD_STOP_SIMU will be sent to the jtag_vpi server when OpenOCD is
    about to exit. This functionality is off by default to maintain
    identical behavior as in previous OpenOCD versions, unless the user
    enables it explicitly.
    
    Change-Id: If3894af6efa61038ccf6c9191f664e2128f2ef11
    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 e5124b5..6abc702 100644
--- a/src/jtag/drivers/jtag_vpi.c
+++ b/src/jtag/drivers/jtag_vpi.c
@@ -49,11 +49,15 @@
 #define CMD_SCAN_CHAIN_FLIP_TMS        3
 #define CMD_STOP_SIMU          4
 
-int server_port = SERVER_PORT;
-char *server_address;
+/* jtag_vpi server port and address to connect to */
+static int server_port = SERVER_PORT;
+static char *server_address;
 
-int sockfd;
-struct sockaddr_in serv_addr;
+/* Send CMD_STOP_SIMU to server when OpenOCD exits? */
+static bool stop_sim_on_exit;
+
+static int sockfd;
+static struct sockaddr_in serv_addr;
 
 /* One jtag_vpi "packet" as sent over a TCP channel. */
 struct vpi_cmd {
@@ -576,8 +580,22 @@ static int jtag_vpi_init(void)
        return ERROR_OK;
 }
 
+static int jtag_vpi_stop_simulation(void)
+{
+       struct vpi_cmd cmd;
+       memset(&cmd, 0, sizeof(struct vpi_cmd));
+       cmd.length = 0;
+       cmd.nb_bits = 0;
+       cmd.cmd = CMD_STOP_SIMU;
+       return jtag_vpi_send_cmd(&cmd);
+}
+
 static int jtag_vpi_quit(void)
 {
+       if (stop_sim_on_exit) {
+               if (jtag_vpi_stop_simulation() != ERROR_OK)
+                       LOG_WARNING("jtag_vpi: failed to send \"stop 
simulation\" command");
+       }
        free(server_address);
        return close_socket(sockfd);
 }
@@ -609,6 +627,17 @@ COMMAND_HANDLER(jtag_vpi_set_address)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(jtag_vpi_stop_sim_on_exit_handler)
+{
+       if (CMD_ARGC != 1) {
+               LOG_ERROR("jtag_vpi_stop_sim_on_exit expects 1 argument 
(on|off)");
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       } else {
+               COMMAND_PARSE_ON_OFF(CMD_ARGV[0], stop_sim_on_exit);
+       }
+       return ERROR_OK;
+}
+
 static const struct command_registration jtag_vpi_command_handlers[] = {
        {
                .name = "jtag_vpi_set_port",
@@ -624,6 +653,14 @@ static const struct command_registration 
jtag_vpi_command_handlers[] = {
                .help = "set the address of the VPI server",
                .usage = "ipv4_addr",
        },
+       {
+               .name = "jtag_vpi_stop_sim_on_exit",
+               .handler = &jtag_vpi_stop_sim_on_exit_handler,
+               .mode = COMMAND_CONFIG,
+               .help = "Configure if simulation stop command shall be sent "
+                       "before OpenOCD exits (default: off)",
+               .usage = "<on|off>",
+       },
        COMMAND_REGISTRATION_DONE
 };
 

-- 


_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to