This is an automated email from Gerrit.

"Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/8641

-- gerrit

commit dd21d8d60ddba2bfaf8a3586e1aae2c87890fe6e
Author: Tomas Vanek <van...@fbl.cz>
Date:   Tue Dec 10 09:47:21 2024 +0100

    drivers/cmsis_dap: fix segfault in quirk mode setting
    
    CMSIS-DAP quirk mode had to be set after init otherwise
    openocd failed due to NULL cmsis_dap_handle
    
    Move quirk_mode from struct cmsis_dap to
    a standalone static variable to allow setting from Tcl config
    before calling cmsis_dap_open()
    
    Signed-off-by: Tomas Vanek <van...@fbl.cz>
    Fixes: 7966: drivers/cmsis_dap: use quirk workarounds optionally | 
https://review.openocd.org/c/openocd/+/7966
    Fixes: https://sourceforge.net/p/openocd/tickets/420/
    Change-Id: I0b53ec09b35ccf66660e00490f41aaed1bd0f91f

diff --git a/src/jtag/drivers/cmsis_dap.c b/src/jtag/drivers/cmsis_dap.c
index e9fd93ad1b..e0c40dd877 100644
--- a/src/jtag/drivers/cmsis_dap.c
+++ b/src/jtag/drivers/cmsis_dap.c
@@ -68,6 +68,7 @@ static uint16_t cmsis_dap_vid[MAX_USB_IDS + 1] = { 0 };
 static uint16_t cmsis_dap_pid[MAX_USB_IDS + 1] = { 0 };
 static int cmsis_dap_backend = -1;
 static bool swd_mode;
+static bool cmsis_dap_quirk_mode;  /* enable expensive workarounds */
 
 /* CMSIS-DAP General Commands */
 #define CMD_DAP_INFO              0x00
@@ -855,7 +856,7 @@ static void cmsis_dap_swd_write_from_queue(struct cmsis_dap 
*dap)
                goto skip;
        }
 
-       unsigned int packet_count = dap->quirk_mode ? 1 : dap->packet_count;
+       unsigned int packet_count = cmsis_dap_quirk_mode ? 1 : 
dap->packet_count;
        dap->pending_fifo_put_idx = (dap->pending_fifo_put_idx + 1) % 
packet_count;
        dap->pending_fifo_block_count++;
        if (dap->pending_fifo_block_count > packet_count)
@@ -975,7 +976,7 @@ static void cmsis_dap_swd_read_process(struct cmsis_dap 
*dap, enum cmsis_dap_blo
 
 skip:
        block->transfer_count = 0;
-       if (!dap->quirk_mode && dap->packet_count > 1)
+       if (!cmsis_dap_quirk_mode && dap->packet_count > 1)
                dap->pending_fifo_get_idx = (dap->pending_fifo_get_idx + 1) % 
dap->packet_count;
        dap->pending_fifo_block_count--;
 }
@@ -1071,7 +1072,7 @@ static void cmsis_dap_swd_queue_cmd(uint8_t cmd, uint32_t 
*dst, uint32_t data)
                /* Not enough room in the queue. Run the queue. */
                cmsis_dap_swd_write_from_queue(cmsis_dap_handle);
 
-               unsigned int packet_count = cmsis_dap_handle->quirk_mode ? 1 : 
cmsis_dap_handle->packet_count;
+               unsigned int packet_count = cmsis_dap_quirk_mode ? 1 : 
cmsis_dap_handle->packet_count;
                if (cmsis_dap_handle->pending_fifo_block_count >= packet_count)
                        cmsis_dap_swd_read_process(cmsis_dap_handle, 
CMSIS_DAP_BLOCKING);
        }
@@ -1215,7 +1216,7 @@ static int cmsis_dap_swd_switch_seq(enum swd_special_seq 
seq)
        if (swd_mode)
                queued_retval = cmsis_dap_swd_run_queue();
 
-       if (cmsis_dap_handle->quirk_mode && seq != LINE_RESET &&
+       if (cmsis_dap_quirk_mode && seq != LINE_RESET &&
                        (output_pins & (SWJ_PIN_SRST | SWJ_PIN_TRST))
                                == (SWJ_PIN_SRST | SWJ_PIN_TRST)) {
                /* Following workaround deasserts reset on most adapters.
@@ -2219,10 +2220,10 @@ COMMAND_HANDLER(cmsis_dap_handle_quirk_command)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        if (CMD_ARGC == 1)
-               COMMAND_PARSE_ENABLE(CMD_ARGV[0], cmsis_dap_handle->quirk_mode);
+               COMMAND_PARSE_ENABLE(CMD_ARGV[0], cmsis_dap_quirk_mode);
 
        command_print(CMD, "CMSIS-DAP quirk workarounds %s",
-                                 cmsis_dap_handle->quirk_mode ? "enabled" : 
"disabled");
+                                 cmsis_dap_quirk_mode ? "enabled" : 
"disabled");
        return ERROR_OK;
 }
 
diff --git a/src/jtag/drivers/cmsis_dap.h b/src/jtag/drivers/cmsis_dap.h
index aded0e54a3..26dc6f0cfe 100644
--- a/src/jtag/drivers/cmsis_dap.h
+++ b/src/jtag/drivers/cmsis_dap.h
@@ -52,7 +52,6 @@ struct cmsis_dap {
        unsigned int pending_fifo_block_count;
 
        uint16_t caps;
-       bool quirk_mode;        /* enable expensive workarounds */
 
        uint32_t swo_buf_sz;
        bool trace_enabled;

-- 

Reply via email to