This patch should fix the jtag_add_ir_scan() regression(SEGFAULT)
in 1672 reported by Magnus Lundin.

If someone can confirm that it works, I'll commit it, if not I'll have to
see if I can test it later on tonight.

-- 
Øyvind Harboe
Embedded software and hardware consulting services
http://consulting.zylin.com
Index: C:/workspace/openocd/src/jtag/jtag.c
===================================================================
--- C:/workspace/openocd/src/jtag/jtag.c        (revision 1676)
+++ C:/workspace/openocd/src/jtag/jtag.c        (working copy)
@@ -45,6 +45,7 @@
 
 int jtag_flush_queue_count; /* count # of flushes for profiling / debugging 
purposes */
 
+
 /* note that this is not marked as static as it must be available from outside 
jtag.c for those
    that implement the jtag_xxx() minidriver layer
 */
@@ -541,7 +542,6 @@
        u32 id[8];
        int modified[8];
 
-
        /* if we are to run a verification of the ir scan, we need to get the 
input back.
         * We may have to allocate space if the caller didn't ask for the input 
back.
         *
@@ -621,10 +621,16 @@
                        break;
                }
                nth_tap++;
+
+               if (nth_tap >= x )
+               {
+                       LOG_ERROR("BUG: not enough fields allocated!");
+               }
+
                scan_size = tap->ir_length;
                (*last_cmd)->cmd.scan->fields[nth_tap].tap = tap;
                (*last_cmd)->cmd.scan->fields[nth_tap].num_bits = scan_size;
-               (*last_cmd)->cmd.scan->fields[nth_tap].in_value = 
fields[nth_tap].in_value;
+               (*last_cmd)->cmd.scan->fields[nth_tap].in_value = NULL;
 
                /* search the list */
                for (j = 0; j < num_fields; j++)
@@ -632,6 +638,7 @@
                        if (tap == fields[j].tap)
                        {
                                found = 1;
+                               (*last_cmd)->cmd.scan->fields[nth_tap].in_value 
= fields[j].in_value;
                                
(*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_cpy(fields[j].out_value, 
cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
 
                                tap->bypass = 0;
@@ -649,6 +656,10 @@
                /* update device information */
                buf_cpy((*last_cmd)->cmd.scan->fields[nth_tap].out_value, 
tap->cur_instr, scan_size);
        }
+       if (nth_tap != (x-1) )
+       {
+               LOG_ERROR("BUG: all the scan fields where not filled out %d 
%d!", nth_tap, x);
+       }
 
        return ERROR_OK;
 }
@@ -1450,7 +1461,7 @@
        /* each flush can take as much as 1-2ms on high bandwidth low latency 
interfaces.
         * E.g. a JTAG over TCP/IP or USB....
         */
-       jtag_flush_queue_count++; 
+       jtag_flush_queue_count++;
 
        int retval=interface_jtag_execute_queue();
        /* we keep the first error */
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to