]> git.sur5r.net Git - openocd/blob - src/svf/svf.c
types: write memory now uses const
[openocd] / src / svf / svf.c
1 /*
2  * Copyright (C) 2009 by Simon Qian
3  * SimonQian@SimonQian.com
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20
21 /* The specification for SVF is available here:
22  * http://www.asset-intertech.com/support/svf.pdf
23  * Below, this document is refered to as the "SVF spec".
24  *
25  * The specification for XSVF is available here:
26  * http://www.xilinx.com/support/documentation/application_notes/xapp503.pdf
27  * Below, this document is refered to as the "XSVF spec".
28  */
29
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
33
34 #include <jtag/jtag.h>
35 #include "svf.h"
36 #include <helper/time_support.h>
37
38
39 // SVF command
40 typedef enum
41 {
42         ENDDR,
43         ENDIR,
44         FREQUENCY,
45         HDR,
46         HIR,
47         PIO,
48         PIOMAP,
49         RUNTEST,
50         SDR,
51         SIR,
52         STATE,
53         TDR,
54         TIR,
55         TRST,
56 }svf_command_t;
57
58 static const char *svf_command_name[14] =
59 {
60         "ENDDR",
61         "ENDIR",
62         "FREQUENCY",
63         "HDR",
64         "HIR",
65         "PIO",
66         "PIOMAP",
67         "RUNTEST",
68         "SDR",
69         "SIR",
70         "STATE",
71         "TDR",
72         "TIR",
73         "TRST"
74 };
75
76 typedef enum
77 {
78         TRST_ON,
79         TRST_OFF,
80         TRST_Z,
81         TRST_ABSENT
82 }trst_mode_t;
83
84 static const char *svf_trst_mode_name[4] =
85 {
86         "ON",
87         "OFF",
88         "Z",
89         "ABSENT"
90 };
91
92 struct svf_statemove
93 {
94         tap_state_t from;
95         tap_state_t to;
96         uint32_t num_of_moves;
97         tap_state_t paths[8];
98 };
99
100 /*
101  * These paths are from the SVF specification for the STATE command, to be
102  * used when the STATE command only includes the final state.  The first
103  * element of the path is the "from" (current) state, and the last one is
104  * the "to" (target) state.
105  *
106  * All specified paths are the shortest ones in the JTAG spec, and are thus
107  * not (!!) exact matches for the paths used elsewhere in OpenOCD.  Note
108  * that PAUSE-to-PAUSE transitions all go through UPDATE and then CAPTURE,
109  * which has specific effects on the various registers; they are not NOPs.
110  *
111  * Paths to RESET are disabled here.  As elsewhere in OpenOCD, and in XSVF
112  * and many SVF implementations, we don't want to risk missing that state.
113  * To get to RESET, always we ignore the current state.
114  */
115 static const struct svf_statemove svf_statemoves[] =
116 {
117         // from                 to                              num_of_moves,   paths[8]
118 //      {TAP_RESET,             TAP_RESET,              1,                              {TAP_RESET}},
119         {TAP_RESET,             TAP_IDLE,               2,                              {TAP_RESET, TAP_IDLE}},
120         {TAP_RESET,             TAP_DRPAUSE,    6,                              {TAP_RESET, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
121         {TAP_RESET,             TAP_IRPAUSE,    7,                              {TAP_RESET, TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
122
123 //      {TAP_IDLE,              TAP_RESET,              4,                              {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
124         {TAP_IDLE,              TAP_IDLE,               1,                              {TAP_IDLE}},
125         {TAP_IDLE,              TAP_DRPAUSE,    5,                              {TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
126         {TAP_IDLE,              TAP_IRPAUSE,    6,                              {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
127
128 //      {TAP_DRPAUSE,   TAP_RESET,              6,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
129         {TAP_DRPAUSE,   TAP_IDLE,               4,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE}},
130         {TAP_DRPAUSE,   TAP_DRPAUSE,    7,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
131         {TAP_DRPAUSE,   TAP_IRPAUSE,    8,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
132
133 //      {TAP_IRPAUSE,   TAP_RESET,              6,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
134         {TAP_IRPAUSE,   TAP_IDLE,               4,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_IDLE}},
135         {TAP_IRPAUSE,   TAP_DRPAUSE,    7,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
136         {TAP_IRPAUSE,   TAP_IRPAUSE,    8,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}}
137 };
138
139
140 #define XXR_TDI                                         (1 << 0)
141 #define XXR_TDO                                         (1 << 1)
142 #define XXR_MASK                                        (1 << 2)
143 #define XXR_SMASK                                       (1 << 3)
144 struct svf_xxr_para
145 {
146         int len;
147         int data_mask;
148         uint8_t *tdi;
149         uint8_t *tdo;
150         uint8_t *mask;
151         uint8_t *smask;
152 };
153
154 struct svf_para
155 {
156         float frequency;
157         tap_state_t ir_end_state;
158         tap_state_t dr_end_state;
159         tap_state_t runtest_run_state;
160         tap_state_t runtest_end_state;
161         trst_mode_t trst_mode;
162
163         struct svf_xxr_para hir_para;
164         struct svf_xxr_para hdr_para;
165         struct svf_xxr_para tir_para;
166         struct svf_xxr_para tdr_para;
167         struct svf_xxr_para sir_para;
168         struct svf_xxr_para sdr_para;
169 };
170
171 static struct svf_para svf_para;
172 static const struct svf_para svf_para_init =
173 {
174 //      frequency,      ir_end_state,   dr_end_state,   runtest_run_state,      runtest_end_state,      trst_mode
175         0,                      TAP_IDLE,               TAP_IDLE,               TAP_IDLE,                       TAP_IDLE,                       TRST_Z,
176 //      hir_para
177 //      {len,   data_mask,      tdi,    tdo,    mask,   smask},
178         {0,             0,                      NULL,   NULL,   NULL,   NULL},
179 //      hdr_para
180 //      {len,   data_mask,      tdi,    tdo,    mask,   smask},
181         {0,             0,                      NULL,   NULL,   NULL,   NULL},
182 //      tir_para
183 //      {len,   data_mask,      tdi,    tdo,    mask,   smask},
184         {0,             0,                      NULL,   NULL,   NULL,   NULL},
185 //      tdr_para
186 //      {len,   data_mask,      tdi,    tdo,    mask,   smask},
187         {0,             0,                      NULL,   NULL,   NULL,   NULL},
188 //      sir_para
189 //      {len,   data_mask,      tdi,    tdo,    mask,   smask},
190         {0,             0,                      NULL,   NULL,   NULL,   NULL},
191 //      sdr_para
192 //      {len,   data_mask,      tdi,    tdo,    mask,   smask},
193         {0,             0,                      NULL,   NULL,   NULL,   NULL},
194 };
195
196 struct svf_check_tdo_para
197 {
198         int line_num;           // used to record line number of the check operation
199                                                 // so more information could be printed
200         int enabled;            // check is enabled or not
201         int buffer_offset;      // buffer_offset to buffers
202         int bit_len;            // bit length to check
203 };
204
205 #define SVF_CHECK_TDO_PARA_SIZE 1024
206 static struct svf_check_tdo_para *svf_check_tdo_para = NULL;
207 static int svf_check_tdo_para_index = 0;
208
209 static int svf_read_command_from_file(FILE * fd);
210 static int svf_check_tdo(void);
211 static int svf_add_check_para(uint8_t enabled, int buffer_offset, int bit_len);
212 static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str);
213
214 static FILE * svf_fd = NULL;
215 static char * svf_read_line = NULL;
216 static size_t svf_read_line_size = 0;
217 static char *svf_command_buffer = NULL;
218 static size_t svf_command_buffer_size = 0;
219 static int svf_line_number = 1;
220 static int svf_getline (char **lineptr, size_t *n, FILE *stream);
221
222 #define SVF_MAX_BUFFER_SIZE_TO_COMMIT   (1024 * 1024)
223 static uint8_t *svf_tdi_buffer = NULL, *svf_tdo_buffer = NULL, *svf_mask_buffer = NULL;
224 static int svf_buffer_index = 0, svf_buffer_size = 0;
225 static int svf_quiet = 0;
226 static int svf_nil = 0;
227
228 // Targetting particular tap
229 static int svf_tap_is_specified = 0;
230 static int svf_set_padding(struct svf_xxr_para *para, int len, unsigned char tdi);
231
232 // Progress Indicator
233 static int svf_progress_enabled = 0;
234 static long svf_total_lines = 0;
235 static int svf_percentage = 0;
236 static int svf_last_printed_percentage = -1;
237
238 static void svf_free_xxd_para(struct svf_xxr_para *para)
239 {
240         if (NULL != para)
241         {
242                 if (para->tdi != NULL)
243                 {
244                         free(para->tdi);
245                         para->tdi = NULL;
246                 }
247                 if (para->tdo != NULL)
248                 {
249                         free(para->tdo);
250                         para->tdo = NULL;
251                 }
252                 if (para->mask != NULL)
253                 {
254                         free(para->mask);
255                         para->mask = NULL;
256                 }
257                 if (para->smask != NULL)
258                 {
259                         free(para->smask);
260                         para->smask = NULL;
261                 }
262         }
263 }
264
265 static unsigned svf_get_mask_u32(int bitlen)
266 {
267         uint32_t bitmask;
268
269         if (bitlen < 0)
270         {
271                 bitmask = 0;
272         }
273         else if (bitlen >= 32)
274         {
275                 bitmask = 0xFFFFFFFF;
276         }
277         else
278         {
279                 bitmask = (1 << bitlen) - 1;
280         }
281
282         return bitmask;
283 }
284
285 int svf_add_statemove(tap_state_t state_to)
286 {
287         tap_state_t state_from = cmd_queue_cur_state;
288         unsigned index_var;
289
290         /* when resetting, be paranoid and ignore current state */
291         if (state_to == TAP_RESET) {
292                 if (svf_nil)
293                         return ERROR_OK;
294
295                 jtag_add_tlr();
296                 return ERROR_OK;
297         }
298
299         for (index_var = 0; index_var < ARRAY_SIZE(svf_statemoves); index_var++)
300         {
301                 if ((svf_statemoves[index_var].from == state_from)
302                         && (svf_statemoves[index_var].to == state_to))
303                 {
304                         if (svf_nil)
305                         {
306                                 continue;
307                         }
308                         /* recorded path includes current state ... avoid extra TCKs! */
309                         if (svf_statemoves[index_var].num_of_moves > 1)
310                                 jtag_add_pathmove(svf_statemoves[index_var].num_of_moves - 1,
311                                                 svf_statemoves[index_var].paths + 1);
312                         else
313                                 jtag_add_pathmove(svf_statemoves[index_var].num_of_moves,
314                                                 svf_statemoves[index_var].paths);
315                         return ERROR_OK;
316                 }
317         }
318         LOG_ERROR("SVF: can not move to %s", tap_state_name(state_to));
319         return ERROR_FAIL;
320 }
321
322 COMMAND_HANDLER(handle_svf_command)
323 {
324 #define SVF_MIN_NUM_OF_OPTIONS                  1
325 #define SVF_MAX_NUM_OF_OPTIONS                  5
326         int command_num = 0;
327         int ret = ERROR_OK;
328         long long time_measure_ms;
329         int time_measure_s, time_measure_m;
330
331         /* use NULL to indicate a "plain" svf file which accounts for
332            any additional devices in the scan chain, otherwise the device
333            that should be affected
334         */
335         struct jtag_tap *tap = NULL;
336
337         if ((CMD_ARGC < SVF_MIN_NUM_OF_OPTIONS) || (CMD_ARGC > SVF_MAX_NUM_OF_OPTIONS))
338         {
339                 return ERROR_COMMAND_SYNTAX_ERROR;
340         }
341
342         // parse command line
343         svf_quiet = 0;
344         svf_nil = 0;
345         for (unsigned int i = 0; i < CMD_ARGC; i++)
346         {
347                 if (strcmp(CMD_ARGV[i], "-tap") == 0)
348                 {
349                         tap = jtag_tap_by_string(CMD_ARGV[i+1]);
350                         if (!tap)
351                         {
352                                 command_print(CMD_CTX, "Tap: %s unknown", CMD_ARGV[i+1]);
353                                 return ERROR_FAIL;
354                         }
355                         i++;
356                 }
357                 else if ((strcmp(CMD_ARGV[i], "quiet") == 0) || (strcmp(CMD_ARGV[i], "-quiet") == 0))
358                 {
359                         svf_quiet = 1;
360                 }
361                 else if ((strcmp(CMD_ARGV[i], "nil") == 0) || (strcmp(CMD_ARGV[i], "-nil") == 0))
362                 {
363                         svf_nil = 1;
364                 }
365                 else if ((strcmp(CMD_ARGV[i], "progress") == 0) || (strcmp(CMD_ARGV[i], "-progress") == 0))
366                 {
367                         svf_progress_enabled = 1;
368                 }
369                 else if ((svf_fd = fopen(CMD_ARGV[i], "r")) == NULL)
370                 {
371                         int err = errno;
372                         command_print(CMD_CTX, "open(\"%s\"): %s", CMD_ARGV[i], strerror(err));
373                         // no need to free anything now
374                         return ERROR_COMMAND_SYNTAX_ERROR;
375                 }
376                 else
377                 {
378                         LOG_USER("svf processing file: \"%s\"", CMD_ARGV[i]);
379                 }
380         }
381
382         if (svf_fd == NULL)
383         {
384                 return ERROR_COMMAND_SYNTAX_ERROR;
385         }
386
387         // get time
388         time_measure_ms = timeval_ms();
389
390         // init
391         svf_line_number = 1;
392         svf_command_buffer_size = 0;
393
394         svf_check_tdo_para_index = 0;
395         svf_check_tdo_para = malloc(sizeof(struct svf_check_tdo_para) * SVF_CHECK_TDO_PARA_SIZE);
396         if (NULL == svf_check_tdo_para)
397         {
398                 LOG_ERROR("not enough memory");
399                 ret = ERROR_FAIL;
400                 goto free_all;
401         }
402
403         svf_buffer_index = 0;
404         // double the buffer size
405         // in case current command cannot be committed, and next command is a bit scan command
406         // here is 32K bits for this big scan command, it should be enough
407         // buffer will be reallocated if buffer size is not enough
408         svf_tdi_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
409         if (NULL == svf_tdi_buffer)
410         {
411                 LOG_ERROR("not enough memory");
412                 ret = ERROR_FAIL;
413                 goto free_all;
414         }
415         svf_tdo_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
416         if (NULL == svf_tdo_buffer)
417         {
418                 LOG_ERROR("not enough memory");
419                 ret = ERROR_FAIL;
420                 goto free_all;
421         }
422         svf_mask_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
423         if (NULL == svf_mask_buffer)
424         {
425                 LOG_ERROR("not enough memory");
426                 ret = ERROR_FAIL;
427                 goto free_all;
428         }
429         svf_buffer_size = 2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT;
430
431         memcpy(&svf_para, &svf_para_init, sizeof(svf_para));
432
433         if (!svf_nil)
434         {
435                 // TAP_RESET
436                 jtag_add_tlr();
437         }
438
439         if (tap)
440         {
441                 /* Tap is specified, set header/trailer paddings */
442                 int header_ir_len = 0, header_dr_len = 0, trailer_ir_len = 0, trailer_dr_len = 0;
443                 struct jtag_tap *check_tap;
444
445                 svf_tap_is_specified = 1;
446
447                 for (check_tap = jtag_all_taps(); check_tap; check_tap = check_tap->next_tap) {
448                         if (check_tap->abs_chain_position < tap->abs_chain_position)
449                         {
450                                 //Header
451                                 header_ir_len += check_tap->ir_length;
452                                 header_dr_len ++;
453                         }
454                         else if (check_tap->abs_chain_position > tap->abs_chain_position)
455                         {
456                                 //Trailer
457                                 trailer_ir_len += check_tap->ir_length;
458                                 trailer_dr_len ++;
459                         }
460                 }
461
462                 // HDR %d TDI (0)
463                 if (ERROR_OK != svf_set_padding(&svf_para.hdr_para, header_dr_len, 0))
464                 {
465                         LOG_ERROR("failed to set data header");
466                         return ERROR_FAIL;
467                 }
468
469                 // HIR %d TDI (0xFF)
470                 if (ERROR_OK != svf_set_padding(&svf_para.hir_para, header_ir_len, 0xFF))
471                 {
472                         LOG_ERROR("failed to set instruction header");
473                         return ERROR_FAIL;
474                 }
475
476                 // TDR %d TDI (0)
477                 if (ERROR_OK != svf_set_padding(&svf_para.tdr_para, trailer_dr_len, 0))
478                 {
479                         LOG_ERROR("failed to set data trailer");
480                         return ERROR_FAIL;
481                 }
482
483                 // TIR %d TDI (0xFF)
484                 if (ERROR_OK != svf_set_padding(&svf_para.tir_para, trailer_ir_len, 0xFF))
485                 {
486                         LOG_ERROR("failed to set instruction trailer");
487                         return ERROR_FAIL;
488                 }
489
490         }
491
492         if (svf_progress_enabled)
493         {
494                 // Count total lines in file.
495                 while ( ! feof (svf_fd) )
496                  {
497                    svf_getline (&svf_command_buffer, &svf_command_buffer_size, svf_fd);
498                    svf_total_lines++;
499                  }
500                 rewind(svf_fd);
501         }
502         while (ERROR_OK == svf_read_command_from_file(svf_fd))
503         {
504                 // Log Output
505                 if (svf_quiet)
506                 {
507                         if (svf_progress_enabled)
508                         {
509                                 svf_percentage = ((svf_line_number * 20) / svf_total_lines) * 5;
510                                 if (svf_last_printed_percentage != svf_percentage)
511                                 {
512                                         LOG_USER_N("\r%d%%    ", svf_percentage);
513                                         svf_last_printed_percentage = svf_percentage;
514                                 }
515                         }
516                 }
517                 else
518                 {
519                         if (svf_progress_enabled)
520                         {
521                                 svf_percentage = ((svf_line_number * 20) / svf_total_lines) * 5;
522                                 LOG_USER_N("%3d%%  %s", svf_percentage, svf_read_line);
523                         }
524                         else
525                         {
526                                 LOG_USER_N("%s",svf_read_line);
527                         }
528                 }
529                         // Run Command
530                 if (ERROR_OK != svf_run_command(CMD_CTX, svf_command_buffer))
531                 {
532                         LOG_ERROR("fail to run command at line %d", svf_line_number);
533                         ret = ERROR_FAIL;
534                         break;
535                 }
536                 command_num++;
537         }
538
539         if ((!svf_nil) && (ERROR_OK != jtag_execute_queue()))
540         {
541                 ret = ERROR_FAIL;
542         }
543         else if (ERROR_OK != svf_check_tdo())
544         {
545                 ret = ERROR_FAIL;
546         }
547
548         // print time
549         time_measure_ms = timeval_ms() - time_measure_ms;
550         time_measure_s = time_measure_ms / 1000;
551         time_measure_ms %= 1000;
552         time_measure_m = time_measure_s / 60;
553         time_measure_s %= 60;
554         if (time_measure_ms < 1000)
555         {
556                 command_print(CMD_CTX, "\r\nTime used: %dm%ds%lldms ", time_measure_m, time_measure_s, time_measure_ms);
557         }
558
559 free_all:
560
561         fclose(svf_fd);
562         svf_fd = 0;
563
564         // free buffers
565         if (svf_command_buffer)
566         {
567                 free(svf_command_buffer);
568                 svf_command_buffer = NULL;
569                 svf_command_buffer_size = 0;
570         }
571         if (svf_check_tdo_para)
572         {
573                 free(svf_check_tdo_para);
574                 svf_check_tdo_para = NULL;
575                 svf_check_tdo_para_index = 0;
576         }
577         if (svf_tdi_buffer)
578         {
579                 free(svf_tdi_buffer);
580                 svf_tdi_buffer = NULL;
581         }
582         if (svf_tdo_buffer)
583         {
584                 free(svf_tdo_buffer);
585                 svf_tdo_buffer = NULL;
586         }
587         if (svf_mask_buffer)
588         {
589                 free(svf_mask_buffer);
590                 svf_mask_buffer = NULL;
591         }
592         svf_buffer_index = 0;
593         svf_buffer_size = 0;
594
595         svf_free_xxd_para(&svf_para.hdr_para);
596         svf_free_xxd_para(&svf_para.hir_para);
597         svf_free_xxd_para(&svf_para.tdr_para);
598         svf_free_xxd_para(&svf_para.tir_para);
599         svf_free_xxd_para(&svf_para.sdr_para);
600         svf_free_xxd_para(&svf_para.sir_para);
601
602         if (ERROR_OK == ret)
603         {
604                 command_print(CMD_CTX, "svf file programmed successfully for %d commands", command_num);
605         }
606         else
607         {
608                 command_print(CMD_CTX, "svf file programmed failed");
609         }
610
611         return ret;
612 }
613
614 static int svf_getline (char **lineptr, size_t *n, FILE *stream)
615 {
616 #define MIN_CHUNK 16    //Buffer is increased by this size each time as required
617   size_t i = 0;
618
619   if (*lineptr == NULL)
620     {
621       *n = MIN_CHUNK;
622       *lineptr = (char *)malloc (*n);
623       if (!*lineptr)
624         {
625                   return -1;
626         }
627     }
628
629         (*lineptr)[0] = fgetc(stream);
630         while ((*lineptr)[i] != '\n')
631         {
632                 (*lineptr)[++i] = fgetc(stream);
633                 if (feof(stream))
634                 {
635                         (*lineptr)[0] = 0;
636                         return -1;
637                 }
638                 if ((i + 2) > *n)
639                 {
640                         *n += MIN_CHUNK;
641                         *lineptr = realloc(*lineptr, *n);
642                 }
643         }
644
645         (*lineptr)[++i] = 0;
646
647         return sizeof(*lineptr);
648 }
649
650 #define SVFP_CMD_INC_CNT                        1024
651 static int svf_read_command_from_file(FILE * fd)
652 {
653         unsigned char ch;
654         int i = 0;
655         size_t cmd_pos = 0;
656         int cmd_ok = 0, slash = 0, comment = 0;
657
658         if (svf_getline (&svf_read_line, &svf_read_line_size, svf_fd) <= 0)
659         {
660                 return ERROR_FAIL;
661         }
662         svf_line_number++;
663         ch = svf_read_line[0];
664         while (!cmd_ok && (ch != 0))
665         {
666                 switch (ch)
667                 {
668                 case '!':
669                         slash = 0;
670                         if (svf_getline (&svf_read_line, &svf_read_line_size, svf_fd) <= 0)
671                         {
672                                 return ERROR_FAIL;
673                         }
674                         svf_line_number++;
675                         i = -1;
676                         break;
677                 case '/':
678                         if (++slash == 2)
679                         {
680                                 slash = 0;
681                                 if (svf_getline (&svf_read_line, &svf_read_line_size, svf_fd) <= 0)
682                                 {
683                                         return ERROR_FAIL;
684                                 }
685                                 svf_line_number++;
686                                 i = -1;
687                         }
688                         break;
689                 case ';':
690                         slash = 0;
691                         cmd_ok = 1;
692                         break;
693                 case '\n':
694                         svf_line_number++;
695                         if (svf_getline (&svf_read_line, &svf_read_line_size, svf_fd) <= 0)
696                         {
697                                 return ERROR_FAIL;
698                         }
699                         i = -1;
700                 case '\r':
701                         slash = 0;
702                         comment = 0;
703                         /* Don't save '\r' and '\n' if no data is parsed */
704                         if (!cmd_pos)
705                                 break;
706                 default:
707                         /* The parsing code currently expects a space
708                          * before parentheses -- "TDI (123)".  Also a
709                          * space afterwards -- "TDI (123) TDO(456)".
710                          * But such spaces are optional... instead of
711                          * parser updates, cope with that by adding the
712                          * spaces as needed.
713                          *
714                          * Ensure there are 3 bytes available, for:
715                          *  - current character
716                          *  - added space.
717                          *  - terminating NUL ('\0')
718                          */
719                         if ((cmd_pos + 2) >= svf_command_buffer_size)
720                         {
721                                 svf_command_buffer = realloc(svf_command_buffer, (cmd_pos + 2));
722                                 if (svf_command_buffer == NULL)
723                                 {
724                                         LOG_ERROR("not enough memory");
725                                         return ERROR_FAIL;
726                                 }
727                         }
728
729                         /* insert a space before '(' */
730                         if ('(' == ch)
731                                 svf_command_buffer[cmd_pos++] = ' ';
732
733                         svf_command_buffer[cmd_pos++] = (char)toupper(ch);
734
735                         /* insert a space after ')' */
736                         if (')' == ch)
737                                 svf_command_buffer[cmd_pos++] = ' ';
738                         break;
739                 }
740                 ch = svf_read_line[++i];
741         }
742
743         if (cmd_ok)
744         {
745                 svf_command_buffer[cmd_pos] = '\0';
746                 return ERROR_OK;
747         }
748         else
749         {
750                 return ERROR_FAIL;
751         }
752 }
753
754 static int svf_parse_cmd_string(char *str, int len, char **argus, int *num_of_argu)
755 {
756         int pos = 0, num = 0, space_found = 1, in_bracket = 0;
757
758         while (pos < len)
759         {
760                 switch (str[pos])
761                 {
762                 case '!':
763                 case '/':
764                         LOG_ERROR("fail to parse svf command");
765                         return ERROR_FAIL;
766                 case '(':
767                         in_bracket = 1;
768                         goto parse_char;
769                 case ')':
770                         in_bracket = 0;
771                         goto parse_char;
772                 default:
773 parse_char:
774                         if (!in_bracket && isspace((int) str[pos]))
775                         {
776                                 space_found = 1;
777                                 str[pos] = '\0';
778                         }
779                         else if (space_found)
780                         {
781                                 argus[num++] = &str[pos];
782                                 space_found = 0;
783                         }
784                         break;
785                 }
786                 pos++;
787         }
788
789         *num_of_argu = num;
790
791         return ERROR_OK;
792 }
793
794 bool svf_tap_state_is_stable(tap_state_t state)
795 {
796         return (TAP_RESET == state) || (TAP_IDLE == state)
797                         || (TAP_DRPAUSE == state) || (TAP_IRPAUSE == state);
798 }
799
800 static int svf_find_string_in_array(char *str, char **strs, int num_of_element)
801 {
802         int i;
803
804         for (i = 0; i < num_of_element; i++)
805         {
806                 if (!strcmp(str, strs[i]))
807                 {
808                         return i;
809                 }
810         }
811         return 0xFF;
812 }
813
814 static int svf_adjust_array_length(uint8_t **arr, int orig_bit_len, int new_bit_len)
815 {
816         int new_byte_len = (new_bit_len + 7) >> 3;
817
818         if ((NULL == *arr) || (((orig_bit_len + 7) >> 3) < ((new_bit_len + 7) >> 3)))
819         {
820                 if (*arr != NULL)
821                 {
822                         free(*arr);
823                         *arr = NULL;
824                 }
825                 *arr = (uint8_t*)malloc(new_byte_len);
826                 if (NULL == *arr)
827                 {
828                         LOG_ERROR("not enough memory");
829                         return ERROR_FAIL;
830                 }
831                 memset(*arr, 0, new_byte_len);
832         }
833         return ERROR_OK;
834 }
835
836 static int svf_set_padding(struct svf_xxr_para *para, int len, unsigned char tdi)
837 {
838         int error = ERROR_OK;
839         error |= svf_adjust_array_length(&para->tdi, para->len, len);
840         memset(para->tdi, tdi, (len + 7) >> 3);
841         error |= svf_adjust_array_length(&para->tdo, para->len, len);
842         error |= svf_adjust_array_length(&para->mask, para->len, len);
843         para->len = len;
844         para->data_mask = XXR_TDI;
845
846         return error;
847 }
848
849 static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_len, int bit_len)
850 {
851         int i, str_len = strlen(str), str_hbyte_len = (bit_len + 3) >> 2;
852         uint8_t ch = 0;
853
854         if (ERROR_OK != svf_adjust_array_length(bin, orig_bit_len, bit_len))
855         {
856                 LOG_ERROR("fail to adjust length of array");
857                 return ERROR_FAIL;
858         }
859
860         /* fill from LSB (end of str) to MSB (beginning of str) */
861         for (i = 0; i < str_hbyte_len; i++)
862         {
863                 ch = 0;
864                 while (str_len > 0)
865                 {
866                         ch = str[--str_len];
867
868                         /* Skip whitespace.  The SVF specification (rev E) is
869                          * deficient in terms of basic lexical issues like
870                          * where whitespace is allowed.  Long bitstrings may
871                          * require line ends for correctness, since there is
872                          * a hard limit on line length.
873                          */
874                         if (!isspace(ch))
875                         {
876                                 if ((ch >= '0') && (ch <= '9'))
877                                 {
878                                         ch = ch - '0';
879                                         break;
880                                 }
881                                 else if ((ch >= 'A') && (ch <= 'F'))
882                                 {
883                                         ch = ch - 'A' + 10;
884                                         break;
885                                 }
886                                 else
887                                 {
888                                         LOG_ERROR("invalid hex string");
889                                         return ERROR_FAIL;
890                                 }
891                         }
892
893                         ch = 0;
894                 }
895
896                 // write bin
897                 if (i % 2)
898                 {
899                         // MSB
900                         (*bin)[i / 2] |= ch << 4;
901                 }
902                 else
903                 {
904                         // LSB
905                         (*bin)[i / 2] = 0;
906                         (*bin)[i / 2] |= ch;
907                 }
908         }
909
910         /* consume optional leading '0' MSBs or whitespace */
911         while (str_len > 0 && ((str[str_len - 1] == '0')
912                                 || isspace((int) str[str_len - 1])))
913                 str_len--;
914
915         /* check validity: we must have consumed everything */
916         if (str_len > 0 || (ch & ~((2 << ((bit_len - 1) % 4)) - 1)) != 0)
917         {
918                 LOG_ERROR("value execeeds length");
919                 return ERROR_FAIL;
920         }
921
922         return ERROR_OK;
923 }
924
925 static int svf_check_tdo(void)
926 {
927         int i, len, index_var;
928
929         for (i = 0; i < svf_check_tdo_para_index; i++)
930         {
931                 index_var = svf_check_tdo_para[i].buffer_offset;
932                 len = svf_check_tdo_para[i].bit_len;
933                 if ((svf_check_tdo_para[i].enabled)
934                         && buf_cmp_mask(&svf_tdi_buffer[index_var], &svf_tdo_buffer[index_var], &svf_mask_buffer[index_var], len))
935                 {
936                         unsigned bitmask;
937                         unsigned received, expected, tapmask;
938                         bitmask = svf_get_mask_u32(svf_check_tdo_para[i].bit_len);
939
940                         memcpy(&received, svf_tdi_buffer + index_var, sizeof(unsigned));
941                         memcpy(&expected, svf_tdo_buffer + index_var, sizeof(unsigned));
942                         memcpy(&tapmask, svf_mask_buffer + index_var, sizeof(unsigned));
943                         LOG_ERROR("tdo check error at line %d",
944                                           svf_check_tdo_para[i].line_num);
945                         LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X",
946                                           received & bitmask,
947                                           expected & bitmask,
948                                           tapmask & bitmask);
949                         return ERROR_FAIL;
950                 }
951         }
952         svf_check_tdo_para_index = 0;
953
954         return ERROR_OK;
955 }
956
957 static int svf_add_check_para(uint8_t enabled, int buffer_offset, int bit_len)
958 {
959         if (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE)
960         {
961                 LOG_ERROR("toooooo many operation undone");
962                 return ERROR_FAIL;
963         }
964
965         svf_check_tdo_para[svf_check_tdo_para_index].line_num = svf_line_number;
966         svf_check_tdo_para[svf_check_tdo_para_index].bit_len = bit_len;
967         svf_check_tdo_para[svf_check_tdo_para_index].enabled = enabled;
968         svf_check_tdo_para[svf_check_tdo_para_index].buffer_offset = buffer_offset;
969         svf_check_tdo_para_index++;
970
971         return ERROR_OK;
972 }
973
974 static int svf_execute_tap(void)
975 {
976         if ((!svf_nil) && (ERROR_OK != jtag_execute_queue()))
977         {
978                 return ERROR_FAIL;
979         }
980         else if (ERROR_OK != svf_check_tdo())
981         {
982                 return ERROR_FAIL;
983         }
984
985         svf_buffer_index = 0;
986
987         return ERROR_OK;
988 }
989
990 static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str)
991 {
992         char *argus[256], command;
993         int num_of_argu = 0, i;
994
995         // tmp variable
996         int i_tmp;
997
998         // for RUNTEST
999         int run_count;
1000         float min_time, max_time;
1001         // for XXR
1002         struct svf_xxr_para *xxr_para_tmp;
1003         uint8_t **pbuffer_tmp;
1004         struct scan_field field;
1005         // for STATE
1006         tap_state_t *path = NULL, state;
1007         // flag padding commands skipped due to -tap command
1008         int padding_command_skipped = 0;
1009
1010         if (ERROR_OK != svf_parse_cmd_string(cmd_str, strlen(cmd_str), argus, &num_of_argu))
1011         {
1012                 return ERROR_FAIL;
1013         }
1014
1015         /* NOTE: we're a bit loose here, because we ignore case in
1016          * TAP state names (instead of insisting on uppercase).
1017          */
1018
1019         command = svf_find_string_in_array(argus[0],
1020                         (char **)svf_command_name, ARRAY_SIZE(svf_command_name));
1021         switch (command)
1022         {
1023         case ENDDR:
1024         case ENDIR:
1025                 if (num_of_argu != 2)
1026                 {
1027                         LOG_ERROR("invalid parameter of %s", argus[0]);
1028                         return ERROR_FAIL;
1029                 }
1030
1031                 i_tmp = tap_state_by_name(argus[1]);
1032
1033                 if (svf_tap_state_is_stable(i_tmp))
1034                 {
1035                         if (command == ENDIR)
1036                         {
1037                                 svf_para.ir_end_state = i_tmp;
1038                                 LOG_DEBUG("\tIR end_state = %s",
1039                                                 tap_state_name(i_tmp));
1040                         }
1041                         else
1042                         {
1043                                 svf_para.dr_end_state = i_tmp;
1044                                 LOG_DEBUG("\tDR end_state = %s",
1045                                                 tap_state_name(i_tmp));
1046                         }
1047                 }
1048                 else
1049                 {
1050                         LOG_ERROR("%s: %s is not a stable state",
1051                                         argus[0], argus[1]);
1052                         return ERROR_FAIL;
1053                 }
1054                 break;
1055         case FREQUENCY:
1056                 if ((num_of_argu != 1) && (num_of_argu != 3))
1057                 {
1058                         LOG_ERROR("invalid parameter of %s", argus[0]);
1059                         return ERROR_FAIL;
1060                 }
1061                 if (1 == num_of_argu)
1062                 {
1063                         // TODO: set jtag speed to full speed
1064                         svf_para.frequency = 0;
1065                 }
1066                 else
1067                 {
1068                         if (strcmp(argus[2], "HZ"))
1069                         {
1070                                 LOG_ERROR("HZ not found in FREQUENCY command");
1071                                 return ERROR_FAIL;
1072                         }
1073                         if (ERROR_OK != svf_execute_tap())
1074                         {
1075                                 return ERROR_FAIL;
1076                         }
1077                         svf_para.frequency = atof(argus[1]);
1078                         // TODO: set jtag speed to
1079                         if (svf_para.frequency > 0)
1080                         {
1081                                 command_run_linef(cmd_ctx, "adapter_khz %d", (int)svf_para.frequency / 1000);
1082                                 LOG_DEBUG("\tfrequency = %f", svf_para.frequency);
1083                         }
1084                 }
1085                 break;
1086         case HDR:
1087                 if (svf_tap_is_specified)
1088                 {
1089                         padding_command_skipped = 1;
1090                         break;
1091                 }
1092                 xxr_para_tmp = &svf_para.hdr_para;
1093                 goto XXR_common;
1094         case HIR:
1095                 if (svf_tap_is_specified)
1096                 {
1097                         padding_command_skipped = 1;
1098                         break;
1099                 }
1100                 xxr_para_tmp = &svf_para.hir_para;
1101                 goto XXR_common;
1102         case TDR:
1103                 if (svf_tap_is_specified)
1104                 {
1105                         padding_command_skipped = 1;
1106                         break;
1107                 }
1108                 xxr_para_tmp = &svf_para.tdr_para;
1109                 goto XXR_common;
1110         case TIR:
1111                 if (svf_tap_is_specified)
1112                 {
1113                         padding_command_skipped = 1;
1114                         break;
1115                 }
1116                 xxr_para_tmp = &svf_para.tir_para;
1117                 goto XXR_common;
1118         case SDR:
1119                 xxr_para_tmp = &svf_para.sdr_para;
1120                 goto XXR_common;
1121         case SIR:
1122                 xxr_para_tmp = &svf_para.sir_para;
1123                 goto XXR_common;
1124                 XXR_common:
1125                 // XXR length [TDI (tdi)] [TDO (tdo)][MASK (mask)] [SMASK (smask)]
1126                 if ((num_of_argu > 10) || (num_of_argu % 2))
1127                 {
1128                         LOG_ERROR("invalid parameter of %s", argus[0]);
1129                         return ERROR_FAIL;
1130                 }
1131                 i_tmp = xxr_para_tmp->len;
1132                 xxr_para_tmp->len = atoi(argus[1]);
1133                 LOG_DEBUG("\tlength = %d", xxr_para_tmp->len);
1134                 xxr_para_tmp->data_mask = 0;
1135                 for (i = 2; i < num_of_argu; i += 2)
1136                 {
1137                         if ((strlen(argus[i + 1]) < 3) || (argus[i + 1][0] != '(') || (argus[i + 1][strlen(argus[i + 1]) - 1] != ')'))
1138                         {
1139                                 LOG_ERROR("data section error");
1140                                 return ERROR_FAIL;
1141                         }
1142                         argus[i + 1][strlen(argus[i + 1]) - 1] = '\0';
1143                         // TDI, TDO, MASK, SMASK
1144                         if (!strcmp(argus[i], "TDI"))
1145                         {
1146                                 // TDI
1147                                 pbuffer_tmp = &xxr_para_tmp->tdi;
1148                                 xxr_para_tmp->data_mask |= XXR_TDI;
1149                         }
1150                         else if (!strcmp(argus[i], "TDO"))
1151                         {
1152                                 // TDO
1153                                 pbuffer_tmp = &xxr_para_tmp->tdo;
1154                                 xxr_para_tmp->data_mask |= XXR_TDO;
1155                         }
1156                         else if (!strcmp(argus[i], "MASK"))
1157                         {
1158                                 // MASK
1159                                 pbuffer_tmp = &xxr_para_tmp->mask;
1160                                 xxr_para_tmp->data_mask |= XXR_MASK;
1161                         }
1162                         else if (!strcmp(argus[i], "SMASK"))
1163                         {
1164                                 // SMASK
1165                                 pbuffer_tmp = &xxr_para_tmp->smask;
1166                                 xxr_para_tmp->data_mask |= XXR_SMASK;
1167                         }
1168                         else
1169                         {
1170                                 LOG_ERROR("unknow parameter: %s", argus[i]);
1171                                 return ERROR_FAIL;
1172                         }
1173                         if (ERROR_OK != svf_copy_hexstring_to_binary(&argus[i + 1][1], pbuffer_tmp, i_tmp, xxr_para_tmp->len))
1174                         {
1175                                 LOG_ERROR("fail to parse hex value");
1176                                 return ERROR_FAIL;
1177                         }
1178                         LOG_DEBUG("\t%s = 0x%X", argus[i], (**(int**)pbuffer_tmp) & svf_get_mask_u32(xxr_para_tmp->len));
1179                 }
1180                 // If a command changes the length of the last scan of the same type and the MASK parameter is absent,
1181                 // the mask pattern used is all cares
1182                 if (!(xxr_para_tmp->data_mask & XXR_MASK) && (i_tmp != xxr_para_tmp->len))
1183                 {
1184                         // MASK not defined and length changed
1185                         if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->mask, i_tmp, xxr_para_tmp->len))
1186                         {
1187                                 LOG_ERROR("fail to adjust length of array");
1188                                 return ERROR_FAIL;
1189                         }
1190                         buf_set_ones(xxr_para_tmp->mask, xxr_para_tmp->len);
1191                 }
1192                 // If TDO is absent, no comparison is needed, set the mask to 0
1193                 if (!(xxr_para_tmp->data_mask & XXR_TDO))
1194                 {
1195                         if (NULL == xxr_para_tmp->tdo)
1196                         {
1197                                 if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->tdo, i_tmp, xxr_para_tmp->len))
1198                                 {
1199                                         LOG_ERROR("fail to adjust length of array");
1200                                         return ERROR_FAIL;
1201                                 }
1202                         }
1203                         if (NULL == xxr_para_tmp->mask)
1204                         {
1205                                 if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->mask, i_tmp, xxr_para_tmp->len))
1206                                 {
1207                                         LOG_ERROR("fail to adjust length of array");
1208                                         return ERROR_FAIL;
1209                                 }
1210                         }
1211                         memset(xxr_para_tmp->mask, 0, (xxr_para_tmp->len + 7) >> 3);
1212                 }
1213                 // do scan if necessary
1214                 if (SDR == command)
1215                 {
1216                         // check buffer size first, reallocate if necessary
1217                         i = svf_para.hdr_para.len + svf_para.sdr_para.len + svf_para.tdr_para.len;
1218                         if ((svf_buffer_size - svf_buffer_index) < ((i + 7) >> 3))
1219                         {
1220 #if 1
1221                                 // simply print error message
1222                                 LOG_ERROR("buffer is not enough, report to author");
1223                                 return ERROR_FAIL;
1224 #else
1225                                 uint8_t *buffer_tmp;
1226
1227                                 // reallocate buffer
1228                                 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1229                                 if (NULL == buffer_tmp)
1230                                 {
1231                                         LOG_ERROR("not enough memory");
1232                                         return ERROR_FAIL;
1233                                 }
1234                                 memcpy(buffer_tmp, svf_tdi_buffer, svf_buffer_index);
1235                                 // svf_tdi_buffer isn't NULL here
1236                                 free(svf_tdi_buffer);
1237                                 svf_tdi_buffer = buffer_tmp;
1238
1239                                 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1240                                 if (NULL == buffer_tmp)
1241                                 {
1242                                         LOG_ERROR("not enough memory");
1243                                         return ERROR_FAIL;
1244                                 }
1245                                 memcpy(buffer_tmp, svf_tdo_buffer, svf_buffer_index);
1246                                 // svf_tdo_buffer isn't NULL here
1247                                 free(svf_tdo_buffer);
1248                                 svf_tdo_buffer = buffer_tmp;
1249
1250                                 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1251                                 if (NULL == buffer_tmp)
1252                                 {
1253                                         LOG_ERROR("not enough memory");
1254                                         return ERROR_FAIL;
1255                                 }
1256                                 memcpy(buffer_tmp, svf_mask_buffer, svf_buffer_index);
1257                                 // svf_mask_buffer isn't NULL here
1258                                 free(svf_mask_buffer);
1259                                 svf_mask_buffer = buffer_tmp;
1260
1261                                 buffer_tmp = NULL;
1262                                 svf_buffer_size = svf_buffer_index + ((i + 7) >> 3);
1263 #endif
1264                         }
1265
1266                         // assemble dr data
1267                         i = 0;
1268                         buf_set_buf(svf_para.hdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
1269                         i += svf_para.hdr_para.len;
1270                         buf_set_buf(svf_para.sdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
1271                         i += svf_para.sdr_para.len;
1272                         buf_set_buf(svf_para.tdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
1273                         i += svf_para.tdr_para.len;
1274
1275                         // add check data
1276                         if (svf_para.sdr_para.data_mask & XXR_TDO)
1277                         {
1278                                 // assemble dr mask data
1279                                 i = 0;
1280                                 buf_set_buf(svf_para.hdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
1281                                 i += svf_para.hdr_para.len;
1282                                 buf_set_buf(svf_para.sdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
1283                                 i += svf_para.sdr_para.len;
1284                                 buf_set_buf(svf_para.tdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
1285                                 i += svf_para.tdr_para.len;
1286                                 // assemble dr check data
1287                                 i = 0;
1288                                 buf_set_buf(svf_para.hdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
1289                                 i += svf_para.hdr_para.len;
1290                                 buf_set_buf(svf_para.sdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
1291                                 i += svf_para.sdr_para.len;
1292                                 buf_set_buf(svf_para.tdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
1293                                 i += svf_para.tdr_para.len;
1294
1295                                 svf_add_check_para(1, svf_buffer_index, i);
1296                         }
1297                         else
1298                         {
1299                                 svf_add_check_para(0, svf_buffer_index, i);
1300                         }
1301                         field.num_bits = i;
1302                         field.out_value = &svf_tdi_buffer[svf_buffer_index];
1303                         field.in_value = &svf_tdi_buffer[svf_buffer_index];
1304                         if (!svf_nil)
1305                         {
1306                                 /* NOTE:  doesn't use SVF-specified state paths */
1307                                 jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, svf_para.dr_end_state);
1308                         }
1309
1310                         svf_buffer_index += (i + 7) >> 3;
1311                 }
1312                 else if (SIR == command)
1313                 {
1314                         // check buffer size first, reallocate if necessary
1315                         i = svf_para.hir_para.len + svf_para.sir_para.len + svf_para.tir_para.len;
1316                         if ((svf_buffer_size - svf_buffer_index) < ((i + 7) >> 3))
1317                         {
1318 #if 1
1319                                 // simply print error message
1320                                 LOG_ERROR("buffer is not enough, report to author");
1321                                 return ERROR_FAIL;
1322 #else
1323                                 uint8_t *buffer_tmp;
1324
1325                                 // reallocate buffer
1326                                 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1327                                 if (NULL == buffer_tmp)
1328                                 {
1329                                         LOG_ERROR("not enough memory");
1330                                         return ERROR_FAIL;
1331                                 }
1332                                 memcpy(buffer_tmp, svf_tdi_buffer, svf_buffer_index);
1333                                 // svf_tdi_buffer isn't NULL here
1334                                 free(svf_tdi_buffer);
1335                                 svf_tdi_buffer = buffer_tmp;
1336
1337                                 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1338                                 if (NULL == buffer_tmp)
1339                                 {
1340                                         LOG_ERROR("not enough memory");
1341                                         return ERROR_FAIL;
1342                                 }
1343                                 memcpy(buffer_tmp, svf_tdo_buffer, svf_buffer_index);
1344                                 // svf_tdo_buffer isn't NULL here
1345                                 free(svf_tdo_buffer);
1346                                 svf_tdo_buffer = buffer_tmp;
1347
1348                                 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1349                                 if (NULL == buffer_tmp)
1350                                 {
1351                                         LOG_ERROR("not enough memory");
1352                                         return ERROR_FAIL;
1353                                 }
1354                                 memcpy(buffer_tmp, svf_mask_buffer, svf_buffer_index);
1355                                 // svf_mask_buffer isn't NULL here
1356                                 free(svf_mask_buffer);
1357                                 svf_mask_buffer = buffer_tmp;
1358
1359                                 buffer_tmp = NULL;
1360                                 svf_buffer_size = svf_buffer_index + ((i + 7) >> 3);
1361 #endif
1362                         }
1363
1364                         // assemble ir data
1365                         i = 0;
1366                         buf_set_buf(svf_para.hir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.hir_para.len);
1367                         i += svf_para.hir_para.len;
1368                         buf_set_buf(svf_para.sir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.sir_para.len);
1369                         i += svf_para.sir_para.len;
1370                         buf_set_buf(svf_para.tir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.tir_para.len);
1371                         i += svf_para.tir_para.len;
1372
1373                         // add check data
1374                         if (svf_para.sir_para.data_mask & XXR_TDO)
1375                         {
1376                                 // assemble dr mask data
1377                                 i = 0;
1378                                 buf_set_buf(svf_para.hir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.hir_para.len);
1379                                 i += svf_para.hir_para.len;
1380                                 buf_set_buf(svf_para.sir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.sir_para.len);
1381                                 i += svf_para.sir_para.len;
1382                                 buf_set_buf(svf_para.tir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.tir_para.len);
1383                                 i += svf_para.tir_para.len;
1384                                 // assemble dr check data
1385                                 i = 0;
1386                                 buf_set_buf(svf_para.hir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.hir_para.len);
1387                                 i += svf_para.hir_para.len;
1388                                 buf_set_buf(svf_para.sir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.sir_para.len);
1389                                 i += svf_para.sir_para.len;
1390                                 buf_set_buf(svf_para.tir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.tir_para.len);
1391                                 i += svf_para.tir_para.len;
1392
1393                                 svf_add_check_para(1, svf_buffer_index, i);
1394                         }
1395                         else
1396                         {
1397                                 svf_add_check_para(0, svf_buffer_index, i);
1398                         }
1399                         field.num_bits = i;
1400                         field.out_value = &svf_tdi_buffer[svf_buffer_index];
1401                         field.in_value = &svf_tdi_buffer[svf_buffer_index];
1402                         if (!svf_nil)
1403                         {
1404                                 /* NOTE:  doesn't use SVF-specified state paths */
1405                                 jtag_add_plain_ir_scan(field.num_bits, field.out_value, field.in_value,
1406                                                 svf_para.ir_end_state);
1407                         }
1408
1409                         svf_buffer_index += (i + 7) >> 3;
1410                 }
1411                 break;
1412         case PIO:
1413         case PIOMAP:
1414                 LOG_ERROR("PIO and PIOMAP are not supported");
1415                 return ERROR_FAIL;
1416                 break;
1417         case RUNTEST:
1418                 // RUNTEST [run_state] run_count run_clk [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state]
1419                 // RUNTEST [run_state] min_time SEC [MAXIMUM max_time SEC] [ENDSTATE end_state]
1420                 if ((num_of_argu < 3) && (num_of_argu > 11))
1421                 {
1422                         LOG_ERROR("invalid parameter of %s", argus[0]);
1423                         return ERROR_FAIL;
1424                 }
1425                 // init
1426                 run_count = 0;
1427                 min_time = 0;
1428                 max_time = 0;
1429                 i = 1;
1430
1431                 // run_state
1432                 i_tmp = tap_state_by_name(argus[i]);
1433                 if (i_tmp != TAP_INVALID)
1434                 {
1435                         if (svf_tap_state_is_stable(i_tmp))
1436                         {
1437                                 svf_para.runtest_run_state = i_tmp;
1438
1439                                 /* When a run_state is specified, the new
1440                                  * run_state becomes the default end_state.
1441                                  */
1442                                 svf_para.runtest_end_state = i_tmp;
1443                                 LOG_DEBUG("\trun_state = %s",
1444                                                 tap_state_name(i_tmp));
1445                                 i++;
1446                         }
1447                         else
1448                         {
1449                                 LOG_ERROR("%s: %s is not a stable state",
1450                                         argus[0], tap_state_name(i_tmp));
1451                                 return ERROR_FAIL;
1452                         }
1453                 }
1454
1455                 // run_count run_clk
1456                 if (((i + 2) <= num_of_argu) && strcmp(argus[i + 1], "SEC"))
1457                 {
1458                         if (!strcmp(argus[i + 1], "TCK"))
1459                         {
1460                                 // clock source is TCK
1461                                 run_count = atoi(argus[i]);
1462                                 LOG_DEBUG("\trun_count@TCK = %d", run_count);
1463                         }
1464                         else
1465                         {
1466                                 LOG_ERROR("%s not supported for clock", argus[i + 1]);
1467                                 return ERROR_FAIL;
1468                         }
1469                         i += 2;
1470                 }
1471                 // min_time SEC
1472                 if (((i + 2) <= num_of_argu) && !strcmp(argus[i + 1], "SEC"))
1473                 {
1474                         min_time = atof(argus[i]);
1475                         LOG_DEBUG("\tmin_time = %fs", min_time);
1476                         i += 2;
1477                 }
1478                 // MAXIMUM max_time SEC
1479                 if (((i + 3) <= num_of_argu) && !strcmp(argus[i], "MAXIMUM") && !strcmp(argus[i + 2], "SEC"))
1480                 {
1481                         max_time = atof(argus[i + 1]);
1482                         LOG_DEBUG("\tmax_time = %fs", max_time);
1483                         i += 3;
1484                 }
1485                 // ENDSTATE end_state
1486                 if (((i + 2) <= num_of_argu) && !strcmp(argus[i], "ENDSTATE"))
1487                 {
1488                         i_tmp = tap_state_by_name(argus[i + 1]);
1489
1490                         if (svf_tap_state_is_stable(i_tmp))
1491                         {
1492                                 svf_para.runtest_end_state = i_tmp;
1493                                 LOG_DEBUG("\tend_state = %s",
1494                                         tap_state_name(i_tmp));
1495                         }
1496                         else
1497                         {
1498                                 LOG_ERROR("%s: %s is not a stable state",
1499                                         argus[0], tap_state_name(i_tmp));
1500                                 return ERROR_FAIL;
1501                         }
1502                         i += 2;
1503                 }
1504
1505                 // all parameter should be parsed
1506                 if (i == num_of_argu)
1507                 {
1508 #if 1
1509                         /* FIXME handle statemove failures */
1510                         int retval;
1511                         uint32_t min_usec = 1000000 * min_time;
1512
1513                         // enter into run_state if necessary
1514                         if (cmd_queue_cur_state != svf_para.runtest_run_state)
1515                         {
1516                                 retval = svf_add_statemove(svf_para.runtest_run_state);
1517                         }
1518
1519                         // add clocks and/or min wait
1520                         if (run_count > 0) {
1521                                 if (!svf_nil)
1522                                         jtag_add_clocks(run_count);
1523                         }
1524
1525                         if (min_usec > 0) {
1526                                 if (!svf_nil)
1527                                         jtag_add_sleep(min_usec);
1528                         }
1529
1530                         // move to end_state if necessary
1531                         if (svf_para.runtest_end_state != svf_para.runtest_run_state)
1532                         {
1533                                 retval = svf_add_statemove(svf_para.runtest_end_state);
1534                         }
1535 #else
1536                         if (svf_para.runtest_run_state != TAP_IDLE)
1537                         {
1538                                 LOG_ERROR("cannot runtest in %s state",
1539                                         tap_state_name(svf_para.runtest_run_state));
1540                                 return ERROR_FAIL;
1541                         }
1542
1543                         if (!svf_nil)
1544                                 jtag_add_runtest(run_count, svf_para.runtest_end_state);
1545 #endif
1546                 }
1547                 else
1548                 {
1549                         LOG_ERROR("fail to parse parameter of RUNTEST, %d out of %d is parsed", i, num_of_argu);
1550                         return ERROR_FAIL;
1551                 }
1552                 break;
1553         case STATE:
1554                 // STATE [pathstate1 [pathstate2 ...[pathstaten]]] stable_state
1555                 if (num_of_argu < 2)
1556                 {
1557                         LOG_ERROR("invalid parameter of %s", argus[0]);
1558                         return ERROR_FAIL;
1559                 }
1560                 if (num_of_argu > 2)
1561                 {
1562                         // STATE pathstate1 ... stable_state
1563                         path = (tap_state_t *)malloc((num_of_argu - 1) * sizeof(tap_state_t));
1564                         if (NULL == path)
1565                         {
1566                                 LOG_ERROR("not enough memory");
1567                                 return ERROR_FAIL;
1568                         }
1569                         num_of_argu--;          // num of path
1570                         i_tmp = 1;              /* path is from parameter 1 */
1571                         for (i = 0; i < num_of_argu; i++, i_tmp++)
1572                         {
1573                                 path[i] = tap_state_by_name(argus[i_tmp]);
1574                                 if (path[i] == TAP_INVALID)
1575                                 {
1576                                         LOG_ERROR("%s: %s is not a valid state",
1577                                                 argus[0], argus[i_tmp]);
1578                                         free(path);
1579                                         return ERROR_FAIL;
1580                                 }
1581                                 /* OpenOCD refuses paths containing TAP_RESET */
1582                                 if (TAP_RESET == path[i])
1583                                 {
1584                                         /* FIXME last state MUST be stable! */
1585                                         if (i > 0)
1586                                         {
1587                                                 if (!svf_nil)
1588                                                         jtag_add_pathmove(i, path);
1589                                         }
1590                                         if (!svf_nil)
1591                                                 jtag_add_tlr();
1592                                         num_of_argu -= i + 1;
1593                                         i = -1;
1594                                 }
1595                         }
1596                         if (num_of_argu > 0)
1597                         {
1598                                 // execute last path if necessary
1599                                 if (svf_tap_state_is_stable(path[num_of_argu - 1]))
1600                                 {
1601                                         // last state MUST be stable state
1602                                         if (!svf_nil)
1603                                                 jtag_add_pathmove(num_of_argu, path);
1604                                         LOG_DEBUG("\tmove to %s by path_move",
1605                                                 tap_state_name(path[num_of_argu - 1]));
1606                                 }
1607                                 else
1608                                 {
1609                                         LOG_ERROR("%s: %s is not a stable state",
1610                                                 argus[0],
1611                                                 tap_state_name(path[num_of_argu - 1]));
1612                                         free(path);
1613                                         return ERROR_FAIL;
1614                                 }
1615                         }
1616
1617                         free(path);
1618                         path = NULL;
1619                 }
1620                 else
1621                 {
1622                         // STATE stable_state
1623                         state = tap_state_by_name(argus[1]);
1624                         if (svf_tap_state_is_stable(state))
1625                         {
1626                                 LOG_DEBUG("\tmove to %s by svf_add_statemove",
1627                                                 tap_state_name(state));
1628                                 /* FIXME handle statemove failures */
1629                                 svf_add_statemove(state);
1630                         }
1631                         else
1632                         {
1633                                 LOG_ERROR("%s: %s is not a stable state",
1634                                         argus[0], tap_state_name(state));
1635                                 return ERROR_FAIL;
1636                         }
1637                 }
1638                 break;
1639         case TRST:
1640                 // TRST trst_mode
1641                 if (num_of_argu != 2)
1642                 {
1643                         LOG_ERROR("invalid parameter of %s", argus[0]);
1644                         return ERROR_FAIL;
1645                 }
1646                 if (svf_para.trst_mode != TRST_ABSENT)
1647                 {
1648                         if (ERROR_OK != svf_execute_tap())
1649                         {
1650                                 return ERROR_FAIL;
1651                         }
1652                         i_tmp = svf_find_string_in_array(argus[1],
1653                                         (char **)svf_trst_mode_name,
1654                                         ARRAY_SIZE(svf_trst_mode_name));
1655                         switch (i_tmp)
1656                         {
1657                         case TRST_ON:
1658                                 if (!svf_nil)
1659                                         jtag_add_reset(1, 0);
1660                                 break;
1661                         case TRST_Z:
1662                         case TRST_OFF:
1663                                 if (!svf_nil)
1664                                         jtag_add_reset(0, 0);
1665                                 break;
1666                         case TRST_ABSENT:
1667                                 break;
1668                         default:
1669                                 LOG_ERROR("unknown TRST mode: %s", argus[1]);
1670                                 return ERROR_FAIL;
1671                         }
1672                         svf_para.trst_mode = i_tmp;
1673                         LOG_DEBUG("\ttrst_mode = %s", svf_trst_mode_name[svf_para.trst_mode]);
1674                 }
1675                 else
1676                 {
1677                         LOG_ERROR("can not accpet TRST command if trst_mode is ABSENT");
1678                         return ERROR_FAIL;
1679                 }
1680                 break;
1681         default:
1682                 LOG_ERROR("invalid svf command: %s", argus[0]);
1683                 return ERROR_FAIL;
1684                 break;
1685         }
1686
1687         if (!svf_quiet)
1688         {
1689                 if (padding_command_skipped)
1690                 {
1691                         LOG_USER("(Above Padding command skipped, as per -tap argument)");
1692                 }
1693         }
1694
1695         if (debug_level >= LOG_LVL_DEBUG)
1696         {
1697                 // for convenient debugging, execute tap if possible
1698                 if ((svf_buffer_index > 0) && \
1699                         (((command != STATE) && (command != RUNTEST)) || \
1700                         ((command == STATE) && (num_of_argu == 2))))
1701                 {
1702                         if (ERROR_OK != svf_execute_tap())
1703                         {
1704                                 return ERROR_FAIL;
1705                         }
1706
1707                         // output debug info
1708                         if ((SIR == command) || (SDR == command))
1709                         {
1710                                 int read_value;
1711                                 memcpy(&read_value, svf_tdi_buffer, sizeof(int));
1712                                 // in debug mode, data is from index 0
1713                                 int read_mask = svf_get_mask_u32(svf_check_tdo_para[0].bit_len);
1714                                 LOG_DEBUG("\tTDO read = 0x%X", read_value & read_mask);
1715                         }
1716                 }
1717         }
1718         else
1719         {
1720                 // for fast executing, execute tap if necessary
1721                 // half of the buffer is for the next command
1722                 if (((svf_buffer_index >= SVF_MAX_BUFFER_SIZE_TO_COMMIT) || (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE / 2)) && \
1723                         (((command != STATE) && (command != RUNTEST)) || \
1724                         ((command == STATE) && (num_of_argu == 2))))
1725                 {
1726                         return svf_execute_tap();
1727                 }
1728         }
1729
1730         return ERROR_OK;
1731 }
1732
1733 static const struct command_registration svf_command_handlers[] = {
1734         {
1735                 .name = "svf",
1736                 .handler = handle_svf_command,
1737                 .mode = COMMAND_EXEC,
1738                 .help = "Runs a SVF file.",
1739                 .usage = "svf [-tap device.tap] <file> [quiet] [nil] [progress]",
1740         },
1741         COMMAND_REGISTRATION_DONE
1742 };
1743
1744 int svf_register_commands(struct command_context *cmd_ctx)
1745 {
1746         return register_commands(cmd_ctx, NULL, svf_command_handlers);
1747 }