OpenOCD
dsp563xx.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2009-2011 by Mathias Kuester *
5  * mkdorg@users.sourceforge.net *
6  ***************************************************************************/
7 
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif
11 
12 #include <jim.h>
13 
14 #include "target.h"
15 #include "breakpoints.h"
16 #include "target_type.h"
17 #include "algorithm.h"
18 #include "register.h"
19 #include "dsp563xx.h"
20 #include "dsp563xx_once.h"
21 
22 #define ASM_REG_W_R0 0x60F400
23 #define ASM_REG_W_R1 0x61F400
24 #define ASM_REG_W_R2 0x62F400
25 #define ASM_REG_W_R3 0x63F400
26 #define ASM_REG_W_R4 0x64F400
27 #define ASM_REG_W_R5 0x65F400
28 #define ASM_REG_W_R6 0x66F400
29 #define ASM_REG_W_R7 0x67F400
30 
31 #define ASM_REG_W_N0 0x70F400
32 #define ASM_REG_W_N1 0x71F400
33 #define ASM_REG_W_N2 0x72F400
34 #define ASM_REG_W_N3 0x73F400
35 #define ASM_REG_W_N4 0x74F400
36 #define ASM_REG_W_N5 0x75F400
37 #define ASM_REG_W_N6 0x76F400
38 #define ASM_REG_W_N7 0x77F400
39 
40 #define ASM_REG_W_M0 0x05F420
41 #define ASM_REG_W_M1 0x05F421
42 #define ASM_REG_W_M2 0x05F422
43 #define ASM_REG_W_M3 0x05F423
44 #define ASM_REG_W_M4 0x05F424
45 #define ASM_REG_W_M5 0x05F425
46 #define ASM_REG_W_M6 0x05F426
47 #define ASM_REG_W_M7 0x05F427
48 
49 #define ASM_REG_W_X0 0x44F400
50 #define ASM_REG_W_X1 0x45F400
51 
52 #define ASM_REG_W_Y0 0x46F400
53 #define ASM_REG_W_Y1 0x47F400
54 
55 #define ASM_REG_W_A0 0x50F400
56 #define ASM_REG_W_A1 0x54F400
57 #define ASM_REG_W_A2 0x52F400
58 
59 #define ASM_REG_W_B0 0x51F400
60 #define ASM_REG_W_B1 0x55F400
61 #define ASM_REG_W_B2 0x53F400
62 
63 #define ASM_REG_W_VBA 0x05F430
64 #define ASM_REG_W_OMR 0x05F43A
65 #define ASM_REG_W_EP 0x05F42A
66 #define ASM_REG_W_SC 0x05F431
67 #define ASM_REG_W_SZ 0x05F438
68 #define ASM_REG_W_SR 0x05F439
69 #define ASM_REG_W_SP 0x05F43B
70 #define ASM_REG_W_SSH 0x05F43C
71 #define ASM_REG_W_SSL 0x05F43D
72 #define ASM_REG_W_LA 0x05F43E
73 #define ASM_REG_W_LC 0x05F43F
74 #define ASM_REG_W_PC 0x000000
75 #define ASM_REG_W_IPRC 0xFFFFFF
76 #define ASM_REG_W_IPRP 0xFFFFFE
77 
78 #define ASM_REG_W_BCR 0xFFFFFB
79 #define ASM_REG_W_DCR 0xFFFFFA
80 #define ASM_REG_W_AAR0 0xFFFFF9
81 #define ASM_REG_W_AAR1 0xFFFFF8
82 #define ASM_REG_W_AAR2 0xFFFFF7
83 #define ASM_REG_W_AAR3 0xFFFFF6
84 
85 /*
86  * OBCR Register bit definitions
87  */
88 #define OBCR_B0_AND_B1 ((0x0) << 10)
89 #define OBCR_B0_OR_B1 ((0x1) << 10)
90 #define OBCR_B1_AFTER_B0 ((0x2) << 10)
91 #define OBCR_B0_AFTER_B1 ((0x3) << 10)
92 
93 #define OBCR_BP_DISABLED (0x0)
94 #define OBCR_BP_MEM_P (0x1)
95 #define OBCR_BP_MEM_X (0x2)
96 #define OBCR_BP_MEM_Y (0x3)
97 #define OBCR_BP_ON_READ ((0x2) << 0)
98 #define OBCR_BP_ON_WRITE ((0x1) << 0)
99 #define OBCR_BP_CC_NOT_EQUAL ((0x0) << 2)
100 #define OBCR_BP_CC_EQUAL ((0x1) << 2)
101 #define OBCR_BP_CC_LESS_THAN ((0x2) << 2)
102 #define OBCR_BP_CC_GREATER_THAN ((0x3) << 2)
103 
104 #define OBCR_BP_0(x) ((x)<<2)
105 #define OBCR_BP_1(x) ((x)<<6)
106 
107 
134 };
135 
136 static struct once_reg once_regs[] = {
137  {ONCE_REG_IDX_OSCR, DSP563XX_ONCE_OSCR, 24, "OSCR", 0},
138  {ONCE_REG_IDX_OMBC, DSP563XX_ONCE_OMBC, 24, "OMBC", 0},
139  {ONCE_REG_IDX_OBCR, DSP563XX_ONCE_OBCR, 24, "OBCR", 0},
140  {ONCE_REG_IDX_OMLR0, DSP563XX_ONCE_OMLR0, 24, "OMLR0", 0},
141  {ONCE_REG_IDX_OMLR1, DSP563XX_ONCE_OMLR1, 24, "OMLR1", 0},
142  {ONCE_REG_IDX_OGDBR, DSP563XX_ONCE_OGDBR, 24, "OGDBR", 0},
143  {ONCE_REG_IDX_OPDBR, DSP563XX_ONCE_OPDBR, 24, "OPDBR", 0},
144  {ONCE_REG_IDX_OPILR, DSP563XX_ONCE_OPILR, 24, "OPILR", 0},
145  {ONCE_REG_IDX_PDB, DSP563XX_ONCE_PDBGOTO, 24, "PDB", 0},
146  {ONCE_REG_IDX_OTC, DSP563XX_ONCE_OTC, 24, "OTC", 0},
147  {ONCE_REG_IDX_OPABFR, DSP563XX_ONCE_OPABFR, 24, "OPABFR", 0},
148  {ONCE_REG_IDX_OPABDR, DSP563XX_ONCE_OPABDR, 24, "OPABDR", 0},
149  {ONCE_REG_IDX_OPABEX, DSP563XX_ONCE_OPABEX, 24, "OPABEX", 0},
150  {ONCE_REG_IDX_OPABF0, DSP563XX_ONCE_OPABF11, 25, "OPABF0", 0},
151  {ONCE_REG_IDX_OPABF1, DSP563XX_ONCE_OPABF11, 25, "OPABF1", 0},
152  {ONCE_REG_IDX_OPABF2, DSP563XX_ONCE_OPABF11, 25, "OPABF2", 0},
153  {ONCE_REG_IDX_OPABF3, DSP563XX_ONCE_OPABF11, 25, "OPABF3", 0},
154  {ONCE_REG_IDX_OPABF4, DSP563XX_ONCE_OPABF11, 25, "OPABF4", 0},
155  {ONCE_REG_IDX_OPABF5, DSP563XX_ONCE_OPABF11, 25, "OPABF5", 0},
156  {ONCE_REG_IDX_OPABF6, DSP563XX_ONCE_OPABF11, 25, "OPABF6", 0},
157  {ONCE_REG_IDX_OPABF7, DSP563XX_ONCE_OPABF11, 25, "OPABF7", 0},
158  {ONCE_REG_IDX_OPABF8, DSP563XX_ONCE_OPABF11, 25, "OPABF8", 0},
159  {ONCE_REG_IDX_OPABF9, DSP563XX_ONCE_OPABF11, 25, "OPABF9", 0},
160  {ONCE_REG_IDX_OPABF10, DSP563XX_ONCE_OPABF11, 25, "OPABF10", 0},
161  {ONCE_REG_IDX_OPABF11, DSP563XX_ONCE_OPABF11, 25, "OPABF11", 0},
162 /* {25,0x1f,24,"NRSEL",0}, */
163 };
164 
220 };
221 
222 static const struct {
223  unsigned int id;
224  const char *name;
225  unsigned int bits;
226  /* effective addressing mode encoding */
227  uint8_t eame;
228  uint32_t instr_mask;
229 } dsp563xx_regs[] = {
230  /* *INDENT-OFF* */
231  /* address registers */
232  {DSP563XX_REG_IDX_R0, "r0", 24, 0x10, ASM_REG_W_R0},
233  {DSP563XX_REG_IDX_R1, "r1", 24, 0x11, ASM_REG_W_R1},
234  {DSP563XX_REG_IDX_R2, "r2", 24, 0x12, ASM_REG_W_R2},
235  {DSP563XX_REG_IDX_R3, "r3", 24, 0x13, ASM_REG_W_R3},
236  {DSP563XX_REG_IDX_R4, "r4", 24, 0x14, ASM_REG_W_R4},
237  {DSP563XX_REG_IDX_R5, "r5", 24, 0x15, ASM_REG_W_R5},
238  {DSP563XX_REG_IDX_R6, "r6", 24, 0x16, ASM_REG_W_R6},
239  {DSP563XX_REG_IDX_R7, "r7", 24, 0x17, ASM_REG_W_R7},
240  /* offset registers */
241  {DSP563XX_REG_IDX_N0, "n0", 24, 0x18, ASM_REG_W_N0},
242  {DSP563XX_REG_IDX_N1, "n1", 24, 0x19, ASM_REG_W_N1},
243  {DSP563XX_REG_IDX_N2, "n2", 24, 0x1a, ASM_REG_W_N2},
244  {DSP563XX_REG_IDX_N3, "n3", 24, 0x1b, ASM_REG_W_N3},
245  {DSP563XX_REG_IDX_N4, "n4", 24, 0x1c, ASM_REG_W_N4},
246  {DSP563XX_REG_IDX_N5, "n5", 24, 0x1d, ASM_REG_W_N5},
247  {DSP563XX_REG_IDX_N6, "n6", 24, 0x1e, ASM_REG_W_N6},
248  {DSP563XX_REG_IDX_N7, "n7", 24, 0x1f, ASM_REG_W_N7},
249  /* modifier registers */
250  {DSP563XX_REG_IDX_M0, "m0", 24, 0x20, ASM_REG_W_M0},
251  {DSP563XX_REG_IDX_M1, "m1", 24, 0x21, ASM_REG_W_M1},
252  {DSP563XX_REG_IDX_M2, "m2", 24, 0x22, ASM_REG_W_M2},
253  {DSP563XX_REG_IDX_M3, "m3", 24, 0x23, ASM_REG_W_M3},
254  {DSP563XX_REG_IDX_M4, "m4", 24, 0x24, ASM_REG_W_M4},
255  {DSP563XX_REG_IDX_M5, "m5", 24, 0x25, ASM_REG_W_M5},
256  {DSP563XX_REG_IDX_M6, "m6", 24, 0x26, ASM_REG_W_M6},
257  {DSP563XX_REG_IDX_M7, "m7", 24, 0x27, ASM_REG_W_M7},
258  /* data alu input register */
259  {DSP563XX_REG_IDX_X0, "x0", 24, 0x04, ASM_REG_W_X0},
260  {DSP563XX_REG_IDX_X1, "x1", 24, 0x05, ASM_REG_W_X1},
261  {DSP563XX_REG_IDX_Y0, "y0", 24, 0x06, ASM_REG_W_Y0},
262  {DSP563XX_REG_IDX_Y1, "y1", 24, 0x07, ASM_REG_W_Y1},
263  /* data alu accumulator register */
264  {DSP563XX_REG_IDX_A0, "a0", 24, 0x08, ASM_REG_W_A0},
265  {DSP563XX_REG_IDX_A1, "a1", 24, 0x0c, ASM_REG_W_A1},
266  {DSP563XX_REG_IDX_A2, "a2", 8, 0x0a, ASM_REG_W_A2},
267  {DSP563XX_REG_IDX_B0, "b0", 24, 0x09, ASM_REG_W_B0},
268  {DSP563XX_REG_IDX_B1, "b1", 24, 0x0d, ASM_REG_W_B1},
269  {DSP563XX_REG_IDX_B2, "b2", 8, 0x0b, ASM_REG_W_B2},
270  /* stack */
271  {DSP563XX_REG_IDX_SSH, "ssh", 24, 0x3c, ASM_REG_W_SSH},
272  {DSP563XX_REG_IDX_SSL, "ssl", 24, 0x3d, ASM_REG_W_SSL},
273  {DSP563XX_REG_IDX_SP, "sp", 24, 0x3b, ASM_REG_W_SP},
274  {DSP563XX_REG_IDX_EP, "ep", 24, 0x2a, ASM_REG_W_EP},
275  {DSP563XX_REG_IDX_SZ, "sz", 24, 0x38, ASM_REG_W_SZ},
276  {DSP563XX_REG_IDX_SC, "sc", 24, 0x31, ASM_REG_W_SC},
277  /* system */
278  {DSP563XX_REG_IDX_PC, "pc", 24, 0x00, ASM_REG_W_PC},
279  {DSP563XX_REG_IDX_SR, "sr", 24, 0x39, ASM_REG_W_SR},
280  {DSP563XX_REG_IDX_OMR, "omr", 24, 0x3a, ASM_REG_W_OMR},
281  {DSP563XX_REG_IDX_LA, "la", 24, 0x3e, ASM_REG_W_LA},
282  {DSP563XX_REG_IDX_LC, "lc", 24, 0x3f, ASM_REG_W_LC},
283  /* interrupt */
284  {DSP563XX_REG_IDX_VBA, "vba", 24, 0x30, ASM_REG_W_VBA},
285  {DSP563XX_REG_IDX_IPRC, "iprc", 24, 0x00, ASM_REG_W_IPRC},
286  {DSP563XX_REG_IDX_IPRP, "iprp", 24, 0x00, ASM_REG_W_IPRP},
287  /* port a */
288  {DSP563XX_REG_IDX_BCR, "bcr", 24, 0x00, ASM_REG_W_BCR},
289  {DSP563XX_REG_IDX_DCR, "dcr", 24, 0x00, ASM_REG_W_DCR},
290  {DSP563XX_REG_IDX_AAR0, "aar0", 24, 0x00, ASM_REG_W_AAR0},
291  {DSP563XX_REG_IDX_AAR1, "aar1", 24, 0x00, ASM_REG_W_AAR1},
292  {DSP563XX_REG_IDX_AAR2, "aar2", 24, 0x00, ASM_REG_W_AAR2},
293  {DSP563XX_REG_IDX_AAR3, "aar3", 24, 0x00, ASM_REG_W_AAR3},
294  /* *INDENT-ON* */
295 };
296 
298  MEM_X = 0,
299  MEM_Y = 1,
300  MEM_P = 2,
301  MEM_L = 3,
302 };
303 
308  LESS_THAN
309 };
310 
311 #define INSTR_JUMP 0x0AF080
312 /* Effective Addressing Mode Encoding */
313 #define EAME_R0 0x10
314 /* instruction encoder */
315 /* movep
316  * s - peripheral space X/Y (X=0,Y=1)
317  * w - write/read
318  * d - source/destination register
319  * p - IO short address
320  */
321 #define INSTR_MOVEP_REG_HIO(s, w, d, p) (0x084000 | \
322  ((s & 1) << 16) | ((w & 1) << 15) | ((d & 0x3f) << 8) | (p & 0x3f))
323 
324 /* the gdb register list is send in this order */
325 static const uint8_t gdb_reg_list_idx[] = {
340 };
341 
343  struct reg **reg_list[],
344  int *reg_list_size,
345  enum target_register_class reg_class)
346 {
347  int i;
348  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
349 
350  if (target->state != TARGET_HALTED)
352 
353  *reg_list_size = DSP563XX_NUMCOREREGS;
354  *reg_list = malloc(sizeof(struct reg *) * (*reg_list_size));
355 
356  if (!*reg_list)
358 
359  for (i = 0; i < DSP563XX_NUMCOREREGS; i++)
360  (*reg_list)[i] = &dsp563xx->core_cache->reg_list[gdb_reg_list_idx[i]];
361 
362  return ERROR_OK;
363 
364 }
365 
366 static int dsp563xx_read_core_reg(struct target *target, int num)
367 {
368  uint32_t reg_value;
369  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
370 
371  if ((num < 0) || (num >= DSP563XX_NUMCOREREGS))
373 
374  reg_value = dsp563xx->core_regs[num];
375  buf_set_u32(dsp563xx->core_cache->reg_list[num].value, 0, 32, reg_value);
376  dsp563xx->core_cache->reg_list[num].valid = true;
377  dsp563xx->core_cache->reg_list[num].dirty = false;
378 
379  return ERROR_OK;
380 }
381 
382 static int dsp563xx_write_core_reg(struct target *target, int num)
383 {
384  uint32_t reg_value;
385  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
386 
387  if ((num < 0) || (num >= DSP563XX_NUMCOREREGS))
389 
390  reg_value = buf_get_u32(dsp563xx->core_cache->reg_list[num].value, 0, 32);
391  dsp563xx->core_regs[num] = reg_value;
392  dsp563xx->core_cache->reg_list[num].valid = true;
393  dsp563xx->core_cache->reg_list[num].dirty = false;
394 
395  return ERROR_OK;
396 }
397 
398 static int dsp563xx_get_core_reg(struct reg *reg)
399 {
400  struct dsp563xx_core_reg *dsp563xx_reg = reg->arch_info;
401  struct target *target = dsp563xx_reg->target;
402  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
403 
404  LOG_DEBUG("%s", __func__);
405 
406  if (target->state != TARGET_HALTED)
408 
409  return dsp563xx->read_core_reg(target, dsp563xx_reg->num);
410 }
411 
412 static int dsp563xx_set_core_reg(struct reg *reg, uint8_t *buf)
413 {
414  LOG_DEBUG("%s", __func__);
415 
416  struct dsp563xx_core_reg *dsp563xx_reg = reg->arch_info;
417  struct target *target = dsp563xx_reg->target;
418  uint32_t value = buf_get_u32(buf, 0, 32);
419 
420  if (target->state != TARGET_HALTED)
422 
423  buf_set_u32(reg->value, 0, reg->size, value);
424  reg->dirty = true;
425  reg->valid = true;
426 
427  return ERROR_OK;
428 }
429 
430 static const struct reg_arch_type dsp563xx_reg_type = {
432  .set = dsp563xx_set_core_reg,
433 };
434 
436 {
437  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
438 
439  struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
440  struct reg_cache *cache = malloc(sizeof(struct reg_cache));
441  struct reg *reg_list = calloc(DSP563XX_NUMCOREREGS, sizeof(struct reg));
442  struct dsp563xx_core_reg *arch_info = malloc(
443  sizeof(struct dsp563xx_core_reg) * DSP563XX_NUMCOREREGS);
444  int i;
445 
446  /* Build the process context cache */
447  cache->name = "dsp563xx registers";
448  cache->next = NULL;
449  cache->reg_list = reg_list;
451  (*cache_p) = cache;
452  dsp563xx->core_cache = cache;
453 
454  for (i = 0; i < DSP563XX_NUMCOREREGS; i++) {
455  arch_info[i].num = dsp563xx_regs[i].id;
456  arch_info[i].name = dsp563xx_regs[i].name;
457  arch_info[i].size = dsp563xx_regs[i].bits;
458  arch_info[i].eame = dsp563xx_regs[i].eame;
459  arch_info[i].instr_mask = dsp563xx_regs[i].instr_mask;
460  arch_info[i].target = target;
461  arch_info[i].dsp563xx_common = dsp563xx;
462  reg_list[i].name = dsp563xx_regs[i].name;
463  reg_list[i].size = 32; /* dsp563xx_regs[i].bits; */
464  reg_list[i].value = calloc(1, 4);
465  reg_list[i].dirty = false;
466  reg_list[i].valid = false;
467  reg_list[i].exist = true;
468  reg_list[i].type = &dsp563xx_reg_type;
469  reg_list[i].arch_info = &arch_info[i];
470  }
471 }
472 
473 static int dsp563xx_read_register(struct target *target, int num, int force);
474 static int dsp563xx_write_register(struct target *target, int num, int force);
475 
476 static int dsp563xx_reg_read_high_io(struct target *target, uint32_t instr_mask, uint32_t *data)
477 {
478  int err;
479  uint32_t instr;
480  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
481 
482  /* we use r0 to store temporary data */
483  if (!dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].valid)
485 
486  /* move source memory to r0 */
488  err = dsp563xx_once_execute_sw_ir(target->tap, 0, instr);
489  if (err != ERROR_OK)
490  return err;
491  /* move r0 to debug register */
492  instr = INSTR_MOVEP_REG_HIO(MEM_X, 1, EAME_R0, 0xfffffc);
493  err = dsp563xx_once_execute_sw_ir(target->tap, 1, instr);
494  if (err != ERROR_OK)
495  return err;
496  /* read debug register */
498  if (err != ERROR_OK)
499  return err;
500  /* r0 is no longer valid on target */
501  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].dirty = true;
502 
503  return ERROR_OK;
504 }
505 
506 static int dsp563xx_reg_write_high_io(struct target *target, uint32_t instr_mask, uint32_t data)
507 {
508  int err;
509  uint32_t instr;
510  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
511 
512  /* we use r0 to store temporary data */
513  if (!dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].valid)
515 
516  /* move data to r0 */
517  err = dsp563xx_once_execute_dw_ir(target->tap, 0, 0x60F400, data);
518  if (err != ERROR_OK)
519  return err;
520  /* move r0 to destination memory */
522  err = dsp563xx_once_execute_sw_ir(target->tap, 1, instr);
523  if (err != ERROR_OK)
524  return err;
525 
526  /* r0 is no longer valid on target */
527  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].dirty = true;
528 
529  return ERROR_OK;
530 }
531 
532 static int dsp563xx_reg_read(struct target *target, uint32_t eame, uint32_t *data)
533 {
534  int err;
535  uint32_t instr;
536 
537  instr = INSTR_MOVEP_REG_HIO(MEM_X, 1, eame, 0xfffffc);
538  err = dsp563xx_once_execute_sw_ir(target->tap, 0, instr);
539  if (err != ERROR_OK)
540  return err;
541  /* nop */
542  err = dsp563xx_once_execute_sw_ir(target->tap, 1, 0x000000);
543  if (err != ERROR_OK)
544  return err;
545  /* read debug register */
547 }
548 
549 static int dsp563xx_reg_write(struct target *target, uint32_t instr_mask, uint32_t data)
550 {
551  int err;
552 
554  if (err != ERROR_OK)
555  return err;
556  /* nop */
557  return dsp563xx_once_execute_sw_ir(target->tap, 1, 0x000000);
558 }
559 
560 static int dsp563xx_reg_pc_read(struct target *target)
561 {
562  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
563 
564  /* pc was changed, nothing todo */
566  return ERROR_OK;
567 
568  /* conditional branch check */
570  if ((once_regs[ONCE_REG_IDX_OPABF11].reg & 1) == 0) {
571  LOG_DEBUG("%s conditional branch not supported yet (0x%" PRIx32 " 0x%" PRIx32 " 0x%" PRIx32 ")",
572  __func__,
576 
577  /* TODO: use disassembly to set correct pc offset
578  * read 2 words from OPABF11 and disasm the instruction
579  */
580  dsp563xx->core_regs[DSP563XX_REG_IDX_PC] =
581  (once_regs[ONCE_REG_IDX_OPABF11].reg >> 1) & 0x00FFFFFF;
582  } else {
585  dsp563xx->core_regs[DSP563XX_REG_IDX_PC] =
587  else
588  dsp563xx->core_regs[DSP563XX_REG_IDX_PC] =
590  }
591  } else
593 
595 
596  return ERROR_OK;
597 }
598 
600 {
601  int err;
602  uint32_t sp;
603  struct dsp563xx_core_reg *arch_info;
604  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
605 
606  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_SSH].arch_info;
607 
608  /* get a valid stack pointer */
610  if (err != ERROR_OK)
611  return err;
612  sp = dsp563xx->core_regs[DSP563XX_REG_IDX_SP];
614  if (err != ERROR_OK)
615  return err;
616 
617  /* get a valid stack count */
619  if (err != ERROR_OK)
620  return err;
621 
623  if (err != ERROR_OK)
624  return err;
625 
626  /* get a valid extended pointer */
628  if (err != ERROR_OK)
629  return err;
630 
632  if (err != ERROR_OK)
633  return err;
634 
635  if (!sp)
636  sp = 0x00FFFFFF;
637  else {
638  err = dsp563xx_reg_read(target, arch_info->eame, &sp);
639  if (err != ERROR_OK)
640  return err;
641 
643  if (err != ERROR_OK)
644  return err;
646  if (err != ERROR_OK)
647  return err;
649  if (err != ERROR_OK)
650  return err;
651  }
652 
653  dsp563xx->core_regs[DSP563XX_REG_IDX_SSH] = sp;
655 
656  return ERROR_OK;
657 }
658 
660 {
661  int err;
662  uint32_t sp;
663  struct dsp563xx_core_reg *arch_info;
664  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
665 
666  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_SSH].arch_info;
667 
668  /* get a valid stack pointer */
670  if (err != ERROR_OK)
671  return err;
672  sp = dsp563xx->core_regs[DSP563XX_REG_IDX_SP];
673 
674  if (sp) {
675  sp--;
676  /* write new stackpointer */
677  dsp563xx->core_regs[DSP563XX_REG_IDX_SP] = sp;
678  err = dsp563xx->read_core_reg(target, DSP563XX_REG_IDX_SP);
679  if (err != ERROR_OK)
680  return err;
682  if (err != ERROR_OK)
683  return err;
684 
685  err = dsp563xx_reg_write(target, arch_info->instr_mask,
686  dsp563xx->core_regs[DSP563XX_REG_IDX_SSH]);
687  if (err != ERROR_OK)
688  return err;
689 
691  if (err != ERROR_OK)
692  return err;
694  if (err != ERROR_OK)
695  return err;
696  }
697 
698  return ERROR_OK;
699 }
700 
702 {
703  int err;
704  uint32_t sp;
705  struct dsp563xx_core_reg *arch_info;
706  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
707 
708  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_SSL].arch_info;
709 
710  /* get a valid stack pointer */
712  if (err != ERROR_OK)
713  return err;
714  sp = dsp563xx->core_regs[DSP563XX_REG_IDX_SP];
715 
716  if (!sp)
717  sp = 0x00FFFFFF;
718  else {
719  err = dsp563xx_reg_read(target, arch_info->eame, &sp);
720  if (err != ERROR_OK)
721  return err;
722  }
723 
724  dsp563xx->core_regs[DSP563XX_REG_IDX_SSL] = sp;
726 
727  return ERROR_OK;
728 }
729 
730 static int dsp563xx_read_register(struct target *target, int num, int force)
731 {
732  int err = ERROR_OK;
733  uint32_t data = 0;
734  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
735  struct dsp563xx_core_reg *arch_info;
736 
737  if (force)
738  dsp563xx->core_cache->reg_list[num].valid = false;
739 
740  if (!dsp563xx->core_cache->reg_list[num].valid) {
741  arch_info = dsp563xx->core_cache->reg_list[num].arch_info;
742 
743  switch (arch_info->num) {
746  break;
749  break;
750  case DSP563XX_REG_IDX_PC:
752  break;
762  arch_info->instr_mask, &data);
763  if (err == ERROR_OK) {
764  dsp563xx->core_regs[num] = data;
765  dsp563xx->read_core_reg(target, num);
766  }
767  break;
768  default:
769  err = dsp563xx_reg_read(target, arch_info->eame, &data);
770  if (err == ERROR_OK) {
771  dsp563xx->core_regs[num] = data;
772  dsp563xx->read_core_reg(target, num);
773  }
774  break;
775  }
776  }
777 
778  return err;
779 }
780 
781 static int dsp563xx_write_register(struct target *target, int num, int force)
782 {
783  int err = ERROR_OK;
784  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
785  struct dsp563xx_core_reg *arch_info;
786 
787  if (force)
788  dsp563xx->core_cache->reg_list[num].dirty = true;
789 
790  if (dsp563xx->core_cache->reg_list[num].dirty) {
791  arch_info = dsp563xx->core_cache->reg_list[num].arch_info;
792 
793  dsp563xx->write_core_reg(target, num);
794 
795  switch (arch_info->num) {
798  break;
799  case DSP563XX_REG_IDX_PC:
800  /* pc is updated on resume, no need to write it here */
801  break;
811  arch_info->instr_mask,
812  dsp563xx->core_regs[num]);
813  break;
814  default:
816  arch_info->instr_mask,
817  dsp563xx->core_regs[num]);
818 
819  if (err == ERROR_OK && arch_info->num == DSP563XX_REG_IDX_SP) {
822  }
823  break;
824  }
825  }
826 
827  return err;
828 }
829 
831 {
832  int i, err = ERROR_OK;
833 
834  for (i = 0; i < DSP563XX_NUMCOREREGS; i++) {
835  err = dsp563xx_read_register(target, i, 0);
836  if (err != ERROR_OK)
837  break;
838  }
839 
840  return err;
841 }
842 
844 {
845  int i, err = ERROR_OK;
846 
847  for (i = 0; i < DSP563XX_NUMCOREREGS; i++) {
848  err = dsp563xx_write_register(target, i, 0);
849  if (err != ERROR_OK)
850  break;
851  }
852 
853  return err;
854 }
855 
857  uint32_t addr_start,
858  uint32_t addr_end)
859 {
860  int i;
861  struct dsp563xx_core_reg *arch_info;
862  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
863 
864  if (addr_start > ASM_REG_W_IPRC)
865  return;
866  if (addr_start < ASM_REG_W_AAR3)
867  return;
868 
869  for (i = DSP563XX_REG_IDX_IPRC; i < DSP563XX_NUMCOREREGS; i++) {
870  arch_info = dsp563xx->core_cache->reg_list[i].arch_info;
871 
872  if ((arch_info->instr_mask >= addr_start) &&
873  (arch_info->instr_mask <= addr_end)) {
874  dsp563xx->core_cache->reg_list[i].valid = false;
875  dsp563xx->core_cache->reg_list[i].dirty = false;
876  }
877  }
878 }
879 
881 {
882  struct dsp563xx_common *dsp563xx = calloc(1, sizeof(struct dsp563xx_common));
883 
884  if (!dsp563xx)
886 
887  dsp563xx->jtag_info.tap = target->tap;
888  target->arch_info = dsp563xx;
891 
892  return ERROR_OK;
893 }
894 
895 static int dsp563xx_init_target(struct command_context *cmd_ctx, struct target *target)
896 {
897  LOG_DEBUG("%s", __func__);
898 
900  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
901 
902  dsp563xx->hardware_breakpoints_cleared = false;
903  dsp563xx->hardware_breakpoint[0].used = BPU_NONE;
904 
905  return ERROR_OK;
906 }
907 
908 static int dsp563xx_examine(struct target *target)
909 {
910  uint32_t chip;
911 
912  if (!target->tap->has_idcode) {
913  LOG_ERROR("no IDCODE present on device");
915  }
916 
917  if (!target_was_examined(target)) {
919 
920  /* examine core and chip derivate number */
921  chip = (target->tap->idcode>>12) & 0x3ff;
922  /* core number 0 means DSP563XX */
923  if (((chip>>5)&0x1f) == 0)
924  chip += 300;
925 
926  LOG_INFO("DSP56%03" PRIu32 " device found", chip);
927 
928  /* Clear all breakpoints */
930  }
931 
932  return ERROR_OK;
933 }
934 
935 static int dsp563xx_arch_state(struct target *target)
936 {
937  LOG_DEBUG("%s", __func__);
938  return ERROR_OK;
939 }
940 
941 #define DSP563XX_SR_SA (1<<17)
942 #define DSP563XX_SR_SC (1<<13)
943 
945 {
947 }
948 
949 static int dsp563xx_debug_init(struct target *target)
950 {
951  int err;
952  uint32_t sr;
953  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
954  struct dsp563xx_core_reg *arch_info;
955 
957  if (err != ERROR_OK)
958  return err;
959 
960  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_SR].arch_info;
961 
962  /* check 24bit mode */
964  if (err != ERROR_OK)
965  return err;
966 
967  sr = dsp563xx->core_regs[DSP563XX_REG_IDX_SR];
968 
969  if (sr & (DSP563XX_SR_SA | DSP563XX_SR_SC)) {
970  sr &= ~(DSP563XX_SR_SA | DSP563XX_SR_SC);
971 
972  err = dsp563xx_once_execute_dw_ir(target->tap, 1, arch_info->instr_mask, sr);
973  if (err != ERROR_OK)
974  return err;
975  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_SR].dirty = true;
976  }
977 
979  if (err != ERROR_OK)
980  return err;
982  if (err != ERROR_OK)
983  return err;
985  if (err != ERROR_OK)
986  return err;
988  if (err != ERROR_OK)
989  return err;
990 
991  if (dsp563xx->core_regs[DSP563XX_REG_IDX_N0] != 0x000000) {
992  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_N0].arch_info;
993  err = dsp563xx_reg_write(target, arch_info->instr_mask, 0x000000);
994  if (err != ERROR_OK)
995  return err;
996  }
997  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_N0].dirty = true;
998 
999  if (dsp563xx->core_regs[DSP563XX_REG_IDX_N1] != 0x000000) {
1000  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_N1].arch_info;
1001  err = dsp563xx_reg_write(target, arch_info->instr_mask, 0x000000);
1002  if (err != ERROR_OK)
1003  return err;
1004  }
1005  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_N1].dirty = true;
1006 
1007  if (dsp563xx->core_regs[DSP563XX_REG_IDX_M0] != 0xffffff) {
1008  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_M0].arch_info;
1009  err = dsp563xx_reg_write(target, arch_info->instr_mask, 0xffffff);
1010  if (err != ERROR_OK)
1011  return err;
1012  }
1013  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_M0].dirty = true;
1014 
1015  if (dsp563xx->core_regs[DSP563XX_REG_IDX_M1] != 0xffffff) {
1016  arch_info = dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_M1].arch_info;
1017  err = dsp563xx_reg_write(target, arch_info->instr_mask, 0xffffff);
1018  if (err != ERROR_OK)
1019  return err;
1020  }
1021  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_M1].dirty = true;
1022 
1024  if (err != ERROR_OK)
1025  return err;
1026 
1027  return ERROR_OK;
1028 }
1029 
1031 {
1033 }
1034 
1035 static int dsp563xx_poll(struct target *target)
1036 {
1037  int err;
1038  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1039  uint32_t once_status = 0;
1040  int state;
1041 
1043 
1044  if (state == TARGET_UNKNOWN) {
1045  target->state = state;
1046  LOG_ERROR("jtag status contains invalid mode value - communication failure");
1047  return ERROR_TARGET_FAILURE;
1048  }
1049 
1050  err = dsp563xx_once_reg_read(target->tap, 1, DSP563XX_ONCE_OSCR, &once_status);
1051  if (err != ERROR_OK)
1052  return err;
1053 
1054  if ((once_status & DSP563XX_ONCE_OSCR_DEBUG_M) == DSP563XX_ONCE_OSCR_DEBUG_M) {
1055  if (target->state != TARGET_HALTED) {
1057 
1058  err = dsp563xx_debug_init(target);
1059  if (err != ERROR_OK)
1060  return err;
1061 
1062  if (once_status & (DSP563XX_ONCE_OSCR_MBO|DSP563XX_ONCE_OSCR_SWO))
1064  else
1066 
1067  LOG_DEBUG("target->state: %s (%" PRIx32 ")", target_state_name(target), once_status);
1068  LOG_INFO("halted: PC: 0x%" PRIx32, dsp563xx->core_regs[DSP563XX_REG_IDX_PC]);
1069  }
1070  }
1071 
1072  if (!dsp563xx->hardware_breakpoints_cleared) {
1074  if (err != ERROR_OK)
1075  return err;
1076 
1078  if (err != ERROR_OK)
1079  return err;
1080 
1082  if (err != ERROR_OK)
1083  return err;
1084 
1085  dsp563xx->hardware_breakpoints_cleared = true;
1086  }
1087 
1088  return ERROR_OK;
1089 }
1090 
1091 static int dsp563xx_halt(struct target *target)
1092 {
1093  int err;
1094 
1095  LOG_DEBUG("%s", __func__);
1096 
1097  if (target->state == TARGET_HALTED) {
1098  LOG_DEBUG("target was already halted");
1099  return ERROR_OK;
1100  }
1101 
1102  if (target->state == TARGET_UNKNOWN)
1103  LOG_WARNING("target was in unknown state when halt was requested");
1104 
1106  if (err != ERROR_OK)
1107  return err;
1108 
1110 
1111  return ERROR_OK;
1112 }
1113 
1114 static int dsp563xx_resume(struct target *target,
1115  bool current,
1117  bool handle_breakpoints,
1118  bool debug_execution)
1119 {
1120  int err;
1121  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1122 
1123  /* check if pc was changed and resume want to execute the next address
1124  * if pc was changed from gdb or other interface we will
1125  * jump to this address and don't execute the next address
1126  * this will not affect the resume command with an address argument
1127  * because current is set to zero then
1128  */
1129  if (current && dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_PC].dirty) {
1131  address = dsp563xx->core_regs[DSP563XX_REG_IDX_PC];
1132  current = false;
1133  }
1134 
1135  LOG_DEBUG("%s %08X %08" TARGET_PRIXADDR, __func__, current, address);
1136 
1138  if (err != ERROR_OK)
1139  return err;
1141 
1142  if (current) {
1143  /* restore pipeline registers and go */
1146  if (err != ERROR_OK)
1147  return err;
1151  if (err != ERROR_OK)
1152  return err;
1153  } else {
1154  /* set to go register and jump */
1156  if (err != ERROR_OK)
1157  return err;
1160  if (err != ERROR_OK)
1161  return err;
1162  }
1163 
1165 
1167 
1168  return ERROR_OK;
1169 }
1170 
1171 static int dsp563xx_step_ex(struct target *target,
1172  bool current,
1173  uint32_t address,
1174  bool handle_breakpoints,
1175  int steps)
1176 {
1177  int err;
1178  uint32_t once_status;
1179  uint32_t dr_in, cnt;
1180  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1181 
1182  if (target->state != TARGET_HALTED) {
1183  LOG_DEBUG("target was not halted");
1184  return ERROR_OK;
1185  }
1186 
1187  /* check if pc was changed and step want to execute the next address
1188  * if pc was changed from gdb or other interface we will
1189  * jump to this address and don't execute the next address
1190  * this will not affect the step command with an address argument
1191  * because current is set to zero then
1192  */
1193  if (current && dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_PC].dirty) {
1195  address = dsp563xx->core_regs[DSP563XX_REG_IDX_PC];
1196  current = false;
1197  }
1198 
1199  LOG_DEBUG("%s %08X %08" PRIX32, __func__, current, address);
1200 
1202  if (err != ERROR_OK)
1203  return err;
1205  if (err != ERROR_OK)
1206  return err;
1207 
1208  /* reset trace mode */
1209  err = dsp563xx_once_reg_write(target->tap, 1, DSP563XX_ONCE_OSCR, 0x000000);
1210  if (err != ERROR_OK)
1211  return err;
1212  /* enable trace mode */
1214  if (err != ERROR_OK)
1215  return err;
1216 
1217  cnt = steps;
1218 
1219  /* on JUMP we need one extra cycle */
1220  if (!current)
1221  cnt++;
1222 
1223  /* load step counter with N-1 */
1225  if (err != ERROR_OK)
1226  return err;
1227 
1228  if (current) {
1229  /* restore pipeline registers and go */
1232  if (err != ERROR_OK)
1233  return err;
1237  if (err != ERROR_OK)
1238  return err;
1239  } else {
1240  /* set to go register and jump */
1242  if (err != ERROR_OK)
1243  return err;
1246  address);
1247  if (err != ERROR_OK)
1248  return err;
1249  }
1250 
1251  while (1) {
1252  err = dsp563xx_once_reg_read(target->tap, 1, DSP563XX_ONCE_OSCR, &once_status);
1253  if (err != ERROR_OK)
1254  return err;
1255 
1256  if (once_status & DSP563XX_ONCE_OSCR_TO) {
1258  if (err != ERROR_OK)
1259  return err;
1260  LOG_DEBUG("fetch: %08" PRIX32, dr_in & 0x00ffffff);
1262  if (err != ERROR_OK)
1263  return err;
1264  LOG_DEBUG("decode: %08" PRIX32, dr_in & 0x00ffffff);
1266  if (err != ERROR_OK)
1267  return err;
1268  LOG_DEBUG("execute: %08" PRIX32, dr_in & 0x00ffffff);
1269 
1270  /* reset trace mode */
1271  err = dsp563xx_once_reg_write(target->tap, 1, DSP563XX_ONCE_OSCR, 0x000000);
1272  if (err != ERROR_OK)
1273  return err;
1274 
1276  err = dsp563xx_debug_init(target);
1277  if (err != ERROR_OK)
1278  return err;
1279 
1280  break;
1281  }
1282  }
1283 
1284  return ERROR_OK;
1285 }
1286 
1287 static int dsp563xx_step(struct target *target,
1288  bool current,
1290  bool handle_breakpoints)
1291 {
1292  int err;
1293  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1294 
1295  if (target->state != TARGET_HALTED) {
1296  LOG_TARGET_ERROR(target, "not halted");
1297  return ERROR_TARGET_NOT_HALTED;
1298  }
1299 
1300  err = dsp563xx_step_ex(target, current, address, handle_breakpoints, 0);
1301  if (err != ERROR_OK)
1302  return err;
1303 
1306 
1307  LOG_INFO("halted: PC: 0x%" PRIx32, dsp563xx->core_regs[DSP563XX_REG_IDX_PC]);
1308 
1309  return err;
1310 }
1311 
1313 {
1314  int retval = 0;
1315  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1317 
1319  /* default to asserting srst */
1321  jtag_add_reset(1, 1);
1322  else
1323  jtag_add_reset(0, 1);
1324  }
1325 
1327  jtag_add_sleep(5000);
1328 
1329  /* registers are now invalid */
1331 
1332  if (target->reset_halt) {
1333  retval = target_halt(target);
1334  if (retval != ERROR_OK)
1335  return retval;
1336  }
1337 
1338  LOG_DEBUG("%s", __func__);
1339  return ERROR_OK;
1340 }
1341 
1343 {
1344  int err;
1345 
1346  /* deassert reset lines */
1347  jtag_add_reset(0, 0);
1348 
1349  err = dsp563xx_poll(target);
1350  if (err != ERROR_OK)
1351  return err;
1352 
1353  if (target->reset_halt) {
1354  if (target->state == TARGET_HALTED) {
1355  /* after a reset the cpu jmp to the
1356  * reset vector and need 2 cycles to fill
1357  * the cache (fetch,decode,execute)
1358  */
1359  err = dsp563xx_step_ex(target, true, 0, true, 1);
1360  if (err != ERROR_OK)
1361  return err;
1362  }
1363  } else
1365 
1366  LOG_DEBUG("%s", __func__);
1367  return ERROR_OK;
1368 }
1369 
1371  int num_mem_params, struct mem_param *mem_params,
1372  int num_reg_params, struct reg_param *reg_params,
1373  target_addr_t entry_point, target_addr_t exit_point,
1374  unsigned int timeout_ms, void *arch_info)
1375 {
1376  int i;
1377  int retval = ERROR_OK;
1378  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1379 
1380  if (target->state != TARGET_HALTED) {
1381  LOG_TARGET_ERROR(target, "not halted (run target algo)");
1382  return ERROR_TARGET_NOT_HALTED;
1383  }
1384 
1385  for (i = 0; i < num_mem_params; i++) {
1386  if (mem_params[i].direction == PARAM_IN)
1387  continue;
1388  retval = target_write_buffer(target, mem_params[i].address,
1389  mem_params[i].size, mem_params[i].value);
1390  if (retval != ERROR_OK)
1391  return retval;
1392  }
1393 
1394  for (i = 0; i < num_reg_params; i++) {
1395  if (reg_params[i].direction == PARAM_IN)
1396  continue;
1397 
1398  struct reg *reg = register_get_by_name(dsp563xx->core_cache,
1399  reg_params[i].reg_name,
1400  false);
1401 
1402  if (!reg) {
1403  LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
1404  continue;
1405  }
1406 
1407  if (reg->size != reg_params[i].size) {
1408  LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size",
1409  reg_params[i].reg_name);
1410  continue;
1411  }
1412 
1413  retval = dsp563xx_set_core_reg(reg, reg_params[i].value);
1414  if (retval != ERROR_OK)
1415  return retval;
1416  }
1417 
1418  /* exec */
1419  retval = target_resume(target, false, entry_point, true, true);
1420  if (retval != ERROR_OK)
1421  return retval;
1422 
1423  retval = target_wait_state(target, TARGET_HALTED, timeout_ms);
1424  if (retval != ERROR_OK)
1425  return retval;
1426 
1427  for (i = 0; i < num_mem_params; i++) {
1428  if (mem_params[i].direction != PARAM_OUT)
1429  retval = target_read_buffer(target,
1430  mem_params[i].address,
1431  mem_params[i].size,
1432  mem_params[i].value);
1433  if (retval != ERROR_OK)
1434  return retval;
1435  }
1436 
1437  for (i = 0; i < num_reg_params; i++) {
1438  if (reg_params[i].direction != PARAM_OUT) {
1439 
1440  struct reg *reg = register_get_by_name(dsp563xx->core_cache,
1441  reg_params[i].reg_name,
1442  false);
1443  if (!reg) {
1444  LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
1445  continue;
1446  }
1447 
1448  if (reg->size != reg_params[i].size) {
1449  LOG_ERROR(
1450  "BUG: register '%s' size doesn't match reg_params[i].size",
1451  reg_params[i].reg_name);
1452  continue;
1453  }
1454 
1455  buf_set_u32(reg_params[i].value, 0, 32, buf_get_u32(reg->value, 0, 32));
1456  }
1457  }
1458 
1459  return ERROR_OK;
1460 }
1461 
1462 /* global command context from openocd.c */
1463 extern struct command_context *global_cmd_ctx;
1464 
1466 {
1467  Jim_Interp *interp;
1468  Jim_Obj *memspace;
1469  char *c;
1470 
1471  if (!global_cmd_ctx)
1472  return MEM_P;
1473 
1475 
1476  if (!interp)
1477  return MEM_P;
1478 
1479  memspace = Jim_GetGlobalVariableStr(interp, "memspace", JIM_NONE);
1480 
1481  if (!memspace)
1482  return MEM_P;
1483 
1484  c = (char *)Jim_GetString(memspace, NULL);
1485 
1486  if (!c)
1487  return MEM_P;
1488 
1489  switch (c[0]) {
1490  case '1':
1491  return MEM_X;
1492  case '2':
1493  return MEM_Y;
1494  case '3':
1495  return MEM_L;
1496  default:
1497  break;
1498  }
1499 
1500  return MEM_P;
1501 }
1502 
1504  int mem_type,
1505  uint32_t address,
1506  uint32_t size,
1507  uint32_t count,
1508  uint8_t *buffer)
1509 {
1510  int err;
1511  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1512  uint32_t i, x;
1513  uint32_t data, move_cmd = 0;
1514  uint8_t *b;
1515 
1516  LOG_DEBUG(
1517  "memtype: %d address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32,
1518  mem_type,
1519  address,
1520  size,
1521  count);
1522 
1523  if (target->state != TARGET_HALTED) {
1524  LOG_WARNING("target not halted");
1525  return ERROR_TARGET_NOT_HALTED;
1526  }
1527 
1528  switch (mem_type) {
1529  case MEM_X:
1530  /* TODO: mark effected queued registers */
1531  move_cmd = 0x61d800;
1532  break;
1533  case MEM_Y:
1534  move_cmd = 0x69d800;
1535  break;
1536  case MEM_P:
1537  move_cmd = 0x07d891;
1538  break;
1539  default:
1541  }
1542 
1543  /* we use r0 to store temporary data */
1544  if (!dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].valid)
1546  /* we use r1 to store temporary data */
1547  if (!dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R1].valid)
1549 
1550  /* r0 is no longer valid on target */
1551  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].dirty = true;
1552  /* r1 is no longer valid on target */
1553  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R1].dirty = true;
1554 
1555  x = count;
1556  b = buffer;
1557 
1558  err = dsp563xx_once_execute_dw_ir(target->tap, 1, 0x60F400, address);
1559  if (err != ERROR_OK)
1560  return err;
1561 
1562  for (i = 0; i < x; i++) {
1563  err = dsp563xx_once_execute_sw_ir(target->tap, 0, move_cmd);
1564  if (err != ERROR_OK)
1565  return err;
1566  err = dsp563xx_once_execute_sw_ir(target->tap, 0, 0x08D13C);
1567  if (err != ERROR_OK)
1568  return err;
1569  err = dsp563xx_once_reg_read(target->tap, 0,
1570  DSP563XX_ONCE_OGDBR, (uint32_t *)(void *)b);
1571  if (err != ERROR_OK)
1572  return err;
1573  b += 4;
1574  }
1575 
1576  /* flush the jtag queue */
1577  err = jtag_execute_queue();
1578  if (err != ERROR_OK)
1579  return err;
1580 
1581  /* walk over the buffer and fix target endianness */
1582  b = buffer;
1583 
1584  for (i = 0; i < x; i++) {
1585  data = buf_get_u32(b, 0, 32) & 0x00FFFFFF;
1586 /* LOG_DEBUG("R: %08X", *((uint32_t*)b)); */
1587  target_buffer_set_u32(target, b, data);
1588  b += 4;
1589  }
1590 
1591  return ERROR_OK;
1592 }
1593 
1595  int mem_type,
1597  uint32_t size,
1598  uint32_t count,
1599  uint8_t *buffer)
1600 {
1601  int err;
1602  uint32_t i, i1;
1603  uint8_t *buffer_y, *buffer_x;
1604 
1605  /* if size equals zero we are called from target read memory
1606  * and have to handle the parameter here */
1607  if ((size == 0) && (count != 0)) {
1608  size = count % 4;
1609 
1610  if (size)
1611  LOG_DEBUG("size is not aligned to 4 byte");
1612 
1613  count = (count - size) / 4;
1614  size = 4;
1615  }
1616 
1617  /* we only support 4 byte aligned data */
1618  if ((size != 4) || (!count))
1620 
1621  if (mem_type != MEM_L)
1623 
1624  buffer_y = malloc(size * count);
1625  if (!buffer_y)
1627 
1628  buffer_x = malloc(size * count);
1629  if (!buffer_x) {
1630  free(buffer_y);
1632  }
1633 
1634  err = dsp563xx_read_memory_core(target, MEM_Y, address, size, count / 2, buffer_y);
1635 
1636  if (err != ERROR_OK) {
1637  free(buffer_y);
1638  free(buffer_x);
1639  return err;
1640  }
1641 
1642  err = dsp563xx_read_memory_core(target, MEM_X, address, size, count / 2, buffer_x);
1643 
1644  if (err != ERROR_OK) {
1645  free(buffer_y);
1646  free(buffer_x);
1647  return err;
1648  }
1649 
1650  for (i = 0, i1 = 0; i < count; i += 2, i1++) {
1651  buf_set_u32(buffer + i*sizeof(uint32_t), 0, 32,
1652  buf_get_u32(buffer_y + i1 * sizeof(uint32_t), 0, 32));
1653  buf_set_u32(buffer + (i + 1) * sizeof(uint32_t), 0, 32,
1654  buf_get_u32(buffer_x + i1 * sizeof(uint32_t), 0, 32));
1655  }
1656 
1657  free(buffer_y);
1658  free(buffer_x);
1659 
1660  return ERROR_OK;
1661 }
1662 
1665  uint32_t size,
1666  uint32_t count,
1667  uint8_t *buffer)
1668 {
1669 
1672 }
1673 
1676  uint32_t size,
1677  uint8_t *buffer)
1678 {
1679 
1681  buffer);
1682 }
1683 
1685  int mem_type,
1687  uint32_t size,
1688  uint32_t count,
1689  const uint8_t *buffer)
1690 {
1691  int err;
1692  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1693  uint32_t i, x;
1694  uint32_t data, move_cmd = 0;
1695  const uint8_t *b;
1696 
1697  LOG_DEBUG(
1698  "memtype: %d address: 0x%8.8" TARGET_PRIxADDR ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32,
1699  mem_type,
1700  address,
1701  size,
1702  count);
1703 
1704  if (target->state != TARGET_HALTED) {
1705  LOG_TARGET_ERROR(target, "not halted");
1706  return ERROR_TARGET_NOT_HALTED;
1707  }
1708 
1709  switch (mem_type) {
1710  case MEM_X:
1711  /* invalidate affected x registers */
1713  move_cmd = 0x615800;
1714  break;
1715  case MEM_Y:
1716  move_cmd = 0x695800;
1717  break;
1718  case MEM_P:
1719  move_cmd = 0x075891;
1720  break;
1721  default:
1723  }
1724 
1725  /* we use r0 to store temporary data */
1726  if (!dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].valid)
1728  /* we use r1 to store temporary data */
1729  if (!dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R1].valid)
1731 
1732  /* r0 is no longer valid on target */
1733  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R0].dirty = true;
1734  /* r1 is no longer valid on target */
1735  dsp563xx->core_cache->reg_list[DSP563XX_REG_IDX_R1].dirty = true;
1736 
1737  x = count;
1738  b = buffer;
1739 
1740  err = dsp563xx_once_execute_dw_ir(target->tap, 1, 0x60F400, address);
1741  if (err != ERROR_OK)
1742  return err;
1743 
1744  for (i = 0; i < x; i++) {
1745  data = target_buffer_get_u32(target, b);
1746 
1747 /* LOG_DEBUG("W: %08X", data); */
1748 
1749  data &= 0x00ffffff;
1750 
1751  err = dsp563xx_once_execute_dw_ir(target->tap, 0, 0x61F400, data);
1752  if (err != ERROR_OK)
1753  return err;
1754  err = dsp563xx_once_execute_sw_ir(target->tap, 0, move_cmd);
1755  if (err != ERROR_OK)
1756  return err;
1757  b += 4;
1758  }
1759 
1760  /* flush the jtag queue */
1761  err = jtag_execute_queue();
1762  if (err != ERROR_OK)
1763  return err;
1764 
1765  return ERROR_OK;
1766 }
1767 
1769  int mem_type,
1771  uint32_t size,
1772  uint32_t count,
1773  const uint8_t *buffer)
1774 {
1775  int err;
1776  uint32_t i, i1;
1777  uint8_t *buffer_y, *buffer_x;
1778 
1779  /* if size equals zero we are called from target write memory
1780  * and have to handle the parameter here */
1781  if ((size == 0) && (count != 0)) {
1782  size = count % 4;
1783 
1784  if (size)
1785  LOG_DEBUG("size is not aligned to 4 byte");
1786 
1787  count = (count - size) / 4;
1788  size = 4;
1789  }
1790 
1791  /* we only support 4 byte aligned data */
1792  if ((size != 4) || (!count))
1794 
1795  if (mem_type != MEM_L)
1797 
1798  buffer_y = malloc(size * count);
1799  if (!buffer_y)
1801 
1802  buffer_x = malloc(size * count);
1803  if (!buffer_x) {
1804  free(buffer_y);
1806  }
1807 
1808  for (i = 0, i1 = 0; i < count; i += 2, i1++) {
1809  buf_set_u32(buffer_y + i1 * sizeof(uint32_t), 0, 32,
1810  buf_get_u32(buffer + i * sizeof(uint32_t), 0, 32));
1811  buf_set_u32(buffer_x + i1 * sizeof(uint32_t), 0, 32,
1812  buf_get_u32(buffer + (i + 1) * sizeof(uint32_t), 0, 32));
1813  }
1814 
1815  err = dsp563xx_write_memory_core(target, MEM_Y, address, size, count / 2, buffer_y);
1816 
1817  if (err != ERROR_OK) {
1818  free(buffer_y);
1819  free(buffer_x);
1820  return err;
1821  }
1822 
1823  err = dsp563xx_write_memory_core(target, MEM_X, address, size, count / 2, buffer_x);
1824 
1825  if (err != ERROR_OK) {
1826  free(buffer_y);
1827  free(buffer_x);
1828  return err;
1829  }
1830 
1831  free(buffer_y);
1832  free(buffer_x);
1833 
1834  return ERROR_OK;
1835 }
1836 
1839  uint32_t size,
1840  uint32_t count,
1841  const uint8_t *buffer)
1842 {
1845 }
1846 
1849  uint32_t size,
1850  const uint8_t *buffer)
1851 {
1853  buffer);
1854 }
1855 
1856 /*
1857  * Exit with error here, because we support watchpoints over a custom command.
1858  * This is because the DSP has separate X,Y,P memspace which is not compatible to the
1859  * traditional watchpoint logic.
1860  */
1862 {
1864 }
1865 
1866 /*
1867  * @see dsp563xx_add_watchpoint
1868  */
1870 {
1872 }
1873 
1874 static int dsp563xx_add_custom_watchpoint(struct target *target, uint32_t address, uint32_t mem_type,
1875  enum watchpoint_rw rw, enum watchpoint_condition cond)
1876 {
1877  int err = ERROR_OK;
1878  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1879 
1880  bool was_running = false;
1881  /* Only set breakpoint when halted */
1882  if (target->state != TARGET_HALTED) {
1884  was_running = true;
1885  }
1886 
1887  if (dsp563xx->hardware_breakpoint[0].used) {
1888  LOG_ERROR("Cannot add watchpoint. Hardware resource already used.");
1890  }
1891 
1892  uint32_t obcr_value = 0;
1893  if (err == ERROR_OK) {
1894  obcr_value |= OBCR_B0_OR_B1;
1895  switch (mem_type) {
1896  case MEM_X:
1897  obcr_value |= OBCR_BP_MEM_X;
1898  break;
1899  case MEM_Y:
1900  obcr_value |= OBCR_BP_MEM_Y;
1901  break;
1902  case MEM_P:
1903  obcr_value |= OBCR_BP_MEM_P;
1904  break;
1905  default:
1906  LOG_ERROR("Unknown mem_type parameter (%" PRIu32 ")", mem_type);
1907  err = ERROR_TARGET_INVALID;
1908  }
1909  }
1910 
1911  if (err == ERROR_OK) {
1912  switch (rw) {
1913  case WPT_READ:
1914  obcr_value |= OBCR_BP_0(OBCR_BP_ON_READ);
1915  break;
1916  case WPT_WRITE:
1917  obcr_value |= OBCR_BP_0(OBCR_BP_ON_WRITE);
1918  break;
1919  case WPT_ACCESS:
1920  obcr_value |= OBCR_BP_0(OBCR_BP_ON_READ | OBCR_BP_ON_WRITE);
1921  break;
1922  default:
1923  LOG_ERROR("Unsupported write mode (%d)", rw);
1924  err = ERROR_TARGET_INVALID;
1925  }
1926  }
1927 
1928  if (err == ERROR_OK) {
1929  switch (cond) {
1930  case EQUAL:
1931  obcr_value |= OBCR_BP_0(OBCR_BP_CC_EQUAL);
1932  break;
1933  case NOT_EQUAL:
1934  obcr_value |= OBCR_BP_0(OBCR_BP_CC_NOT_EQUAL);
1935  break;
1936  case LESS_THAN:
1937  obcr_value |= OBCR_BP_0(OBCR_BP_CC_LESS_THAN);
1938  break;
1939  case GREATER:
1940  obcr_value |= OBCR_BP_0(OBCR_BP_CC_GREATER_THAN);
1941  break;
1942  default:
1943  LOG_ERROR("Unsupported condition code (%d)", cond);
1944  err = ERROR_TARGET_INVALID;
1945  }
1946  }
1947 
1948  if (err == ERROR_OK)
1950 
1951  if (err == ERROR_OK)
1953 
1954  if (err == ERROR_OK)
1955  err = dsp563xx_once_reg_write(target->tap, 1, DSP563XX_ONCE_OBCR, obcr_value);
1956 
1957  if (err == ERROR_OK) {
1958  /* You should write the memory breakpoint counter to 0 */
1960  }
1961 
1962  if (err == ERROR_OK) {
1963  /* You should write the memory breakpoint counter to 0 */
1965  }
1966 
1967  if (err == ERROR_OK)
1968  dsp563xx->hardware_breakpoint[0].used = BPU_WATCHPOINT;
1969 
1970  if (err == ERROR_OK && was_running) {
1971  /* Resume from current PC */
1972  err = dsp563xx_resume(target, true, 0x0, false, false);
1973  }
1974 
1975  return err;
1976 }
1977 
1979 {
1980  int err = ERROR_OK;
1981  struct dsp563xx_common *dsp563xx = target_to_dsp563xx(target);
1982 
1983  if (dsp563xx->hardware_breakpoint[0].used != BPU_WATCHPOINT) {
1984  LOG_ERROR("Cannot remove watchpoint, as no watchpoint is currently configured!");
1985  err = ERROR_TARGET_INVALID;
1986  }
1987 
1988  if (err == ERROR_OK) {
1989  /* Clear watchpoint by clearing OBCR. */
1991  }
1992 
1993  if (err == ERROR_OK)
1994  dsp563xx->hardware_breakpoint[0].used = BPU_NONE;
1995 
1996  return err;
1997 }
1998 
1999 COMMAND_HANDLER(dsp563xx_add_watchpoint_command)
2000 {
2001  int err = ERROR_OK;
2003 
2004  uint32_t mem_type = 0;
2005  switch (CMD_NAME[2]) {
2006  case 'x':
2007  mem_type = MEM_X;
2008  break;
2009  case 'y':
2010  mem_type = MEM_Y;
2011  break;
2012  case 'p':
2013  mem_type = MEM_P;
2014  break;
2015  default:
2017  }
2018 
2019  if (CMD_ARGC < 2)
2021 
2022  uint32_t address = 0;
2023  if (CMD_ARGC > 2)
2025 
2026  enum watchpoint_condition cond;
2027  switch (CMD_ARGV[0][0]) {
2028  case '>':
2029  cond = GREATER;
2030  break;
2031  case '<':
2032  cond = LESS_THAN;
2033  break;
2034  case '=':
2035  cond = EQUAL;
2036  break;
2037  case '!':
2038  cond = NOT_EQUAL;
2039  break;
2040  default:
2042  }
2043 
2044  enum watchpoint_rw rw;
2045  switch (CMD_ARGV[1][0]) {
2046  case 'r':
2047  rw = WPT_READ;
2048  break;
2049  case 'w':
2050  rw = WPT_WRITE;
2051  break;
2052  case 'a':
2053  rw = WPT_ACCESS;
2054  break;
2055  default:
2057  }
2058 
2060 
2061  return err;
2062 }
2063 
2064 /* Adding a breakpoint using the once breakpoint logic.
2065  * Note that this mechanism is a true hw breakpoint and is share between the watchpoint logic.
2066  * This means, you can only have one breakpoint/watchpoint at any time.
2067  */
2069 {
2071 }
2072 
2074 {
2076 }
2077 
2078 COMMAND_HANDLER(dsp563xx_remove_watchpoint_command)
2079 {
2081 
2083 }
2084 
2085 COMMAND_HANDLER(dsp563xx_mem_command)
2086 {
2088  int err = ERROR_OK;
2089  int read_mem;
2090  uint32_t address = 0;
2091  uint32_t count = 1, i;
2092  uint32_t pattern = 0;
2093  uint32_t mem_type;
2094  uint8_t *buffer, *b;
2095 
2096  switch (CMD_NAME[1]) {
2097  case 'w':
2098  read_mem = 0;
2099  break;
2100  case 'd':
2101  read_mem = 1;
2102  break;
2103  default:
2105  }
2106 
2107  switch (CMD_NAME[3]) {
2108  case 'x':
2109  mem_type = MEM_X;
2110  break;
2111  case 'y':
2112  mem_type = MEM_Y;
2113  break;
2114  case 'p':
2115  mem_type = MEM_P;
2116  break;
2117  default:
2119  }
2120 
2121  if (CMD_ARGC > 0)
2123 
2124  if (read_mem == 0) {
2125  if (CMD_ARGC < 2)
2127  if (CMD_ARGC > 1)
2129  if (CMD_ARGC > 2)
2131  }
2132 
2133  if (read_mem == 1) {
2134  if (CMD_ARGC < 1)
2136  if (CMD_ARGC > 1)
2138  }
2139 
2140  buffer = calloc(count, 4);
2141 
2142  if (read_mem == 1) {
2143  err = dsp563xx_read_memory(target, mem_type, address, sizeof(uint32_t),
2144  count, buffer);
2145  if (err == ERROR_OK)
2146  target_handle_md_output(CMD, target, address, sizeof(uint32_t), count, buffer);
2147 
2148  } else {
2149  b = buffer;
2150 
2151  for (i = 0; i < count; i++) {
2153  b += 4;
2154  }
2155 
2157  mem_type,
2158  address,
2159  sizeof(uint32_t),
2160  count,
2161  buffer);
2162  }
2163 
2164  free(buffer);
2165 
2166  return err;
2167 }
2168 
2169 static const struct command_registration dsp563xx_command_handlers[] = {
2170  {
2171  .name = "mwwx",
2172  .handler = dsp563xx_mem_command,
2173  .mode = COMMAND_EXEC,
2174  .help = "write x memory words",
2175  .usage = "address value [count]",
2176  },
2177  {
2178  .name = "mwwy",
2179  .handler = dsp563xx_mem_command,
2180  .mode = COMMAND_EXEC,
2181  .help = "write y memory words",
2182  .usage = "address value [count]",
2183  },
2184  {
2185  .name = "mwwp",
2186  .handler = dsp563xx_mem_command,
2187  .mode = COMMAND_EXEC,
2188  .help = "write p memory words",
2189  .usage = "address value [count]",
2190  },
2191  {
2192  .name = "mdwx",
2193  .handler = dsp563xx_mem_command,
2194  .mode = COMMAND_EXEC,
2195  .help = "display x memory words",
2196  .usage = "address [count]",
2197  },
2198  {
2199  .name = "mdwy",
2200  .handler = dsp563xx_mem_command,
2201  .mode = COMMAND_EXEC,
2202  .help = "display y memory words",
2203  .usage = "address [count]",
2204  },
2205  {
2206  .name = "mdwp",
2207  .handler = dsp563xx_mem_command,
2208  .mode = COMMAND_EXEC,
2209  .help = "display p memory words",
2210  .usage = "address [count]",
2211  },
2212  /*
2213  * Watchpoint commands
2214  */
2215  {
2216  .name = "wpp",
2217  .handler = dsp563xx_add_watchpoint_command,
2218  .mode = COMMAND_EXEC,
2219  .help = "Create p memspace watchpoint",
2220  .usage = "(>|<|=|!) (r|w|a) address",
2221  },
2222  {
2223  .name = "wpx",
2224  .handler = dsp563xx_add_watchpoint_command,
2225  .mode = COMMAND_EXEC,
2226  .help = "Create x memspace watchpoint",
2227  .usage = "(>|<|=|!) (r|w|a) address",
2228  },
2229  {
2230  .name = "wpy",
2231  .handler = dsp563xx_add_watchpoint_command,
2232  .mode = COMMAND_EXEC,
2233  .help = "Create y memspace watchpoint",
2234  .usage = "(>|<|=|!) (r|w|a) address",
2235  },
2236  {
2237  .name = "rwpc",
2238  .handler = dsp563xx_remove_watchpoint_command,
2239  .mode = COMMAND_EXEC,
2240  .help = "remove watchpoint custom",
2241  .usage = "",
2242  },
2244 };
2245 
2247 struct target_type dsp563xx_target = {
2248  .name = "dsp563xx",
2249 
2250  .poll = dsp563xx_poll,
2251  .arch_state = dsp563xx_arch_state,
2252 
2253  .get_gdb_reg_list = dsp563xx_get_gdb_reg_list,
2254 
2255  .halt = dsp563xx_halt,
2256  .resume = dsp563xx_resume,
2257  .step = dsp563xx_step,
2258 
2259  .assert_reset = dsp563xx_assert_reset,
2260  .deassert_reset = dsp563xx_deassert_reset,
2261 
2262  .read_memory = dsp563xx_read_memory_default,
2263  .write_memory = dsp563xx_write_memory_default,
2264 
2265  .read_buffer = dsp563xx_read_buffer_default,
2266  .write_buffer = dsp563xx_write_buffer_default,
2267 
2268  .run_algorithm = dsp563xx_run_algorithm,
2269 
2270  .add_breakpoint = dsp563xx_add_breakpoint,
2271  .remove_breakpoint = dsp563xx_remove_breakpoint,
2272  .add_watchpoint = dsp563xx_add_watchpoint,
2273  .remove_watchpoint = dsp563xx_remove_watchpoint,
2274 
2275  .commands = dsp563xx_command_handlers,
2276  .target_create = dsp563xx_target_create,
2277  .init_target = dsp563xx_init_target,
2278  .examine = dsp563xx_examine,
2279 };
@ PARAM_OUT
Definition: algorithm.h:16
@ PARAM_IN
Definition: algorithm.h:15
static uint32_t buf_get_u32(const uint8_t *_buffer, unsigned int first, unsigned int num)
Retrieves num bits from _buffer, starting at the first bit, returning the bits in a 32-bit word.
Definition: binarybuffer.h:104
static void buf_set_u32(uint8_t *_buffer, unsigned int first, unsigned int num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:34
watchpoint_rw
Definition: breakpoints.h:22
@ WPT_ACCESS
Definition: breakpoints.h:23
@ WPT_READ
Definition: breakpoints.h:23
@ WPT_WRITE
Definition: breakpoints.h:23
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:141
#define CMD_NAME
Use this macro to access the name of the command being handled, rather than accessing the variable di...
Definition: command.h:166
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:156
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:400
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:151
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
Definition: command.h:440
#define CMD_CTX
Use this macro to access the context of the command being handled, rather than accessing the variable...
Definition: command.h:146
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:251
@ COMMAND_EXEC
Definition: command.h:40
#define ASM_REG_W_PC
Definition: dsp563xx.c:74
#define ASM_REG_W_Y0
Definition: dsp563xx.c:52
#define ASM_REG_W_M7
Definition: dsp563xx.c:47
#define ASM_REG_W_IPRC
Definition: dsp563xx.c:75
static const struct reg_arch_type dsp563xx_reg_type
Definition: dsp563xx.c:430
static int dsp563xx_deassert_reset(struct target *target)
Definition: dsp563xx.c:1342
#define ASM_REG_W_N3
Definition: dsp563xx.c:34
static int dsp563xx_write_memory(struct target *target, int mem_type, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: dsp563xx.c:1768
static int dsp563xx_add_custom_watchpoint(struct target *target, uint32_t address, uint32_t mem_type, enum watchpoint_rw rw, enum watchpoint_condition cond)
Definition: dsp563xx.c:1874
#define OBCR_BP_MEM_Y
Definition: dsp563xx.c:96
#define INSTR_JUMP
Definition: dsp563xx.c:311
#define ASM_REG_W_M5
Definition: dsp563xx.c:45
#define OBCR_BP_CC_NOT_EQUAL
Definition: dsp563xx.c:99
static int dsp563xx_remove_watchpoint(struct target *target, struct watchpoint *watchpoint)
Definition: dsp563xx.c:1869
static int dsp563xx_reg_read(struct target *target, uint32_t eame, uint32_t *data)
Definition: dsp563xx.c:532
struct command_context * global_cmd_ctx
Definition: openocd.c:234
static int dsp563xx_read_memory(struct target *target, int mem_type, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: dsp563xx.c:1594
static int dsp563xx_debug_once_init(struct target *target)
Definition: dsp563xx.c:944
static int dsp563xx_reg_read_high_io(struct target *target, uint32_t instr_mask, uint32_t *data)
Definition: dsp563xx.c:476
static struct once_reg once_regs[]
Definition: dsp563xx.c:136
static int dsp563xx_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: dsp563xx.c:2073
static int dsp563xx_arch_state(struct target *target)
Definition: dsp563xx.c:935
#define OBCR_B0_OR_B1
Definition: dsp563xx.c:89
#define OBCR_BP_MEM_P
Definition: dsp563xx.c:94
static int dsp563xx_reg_ssh_read(struct target *target)
Definition: dsp563xx.c:599
static int dsp563xx_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: dsp563xx.c:2068
once_reg_idx
Definition: dsp563xx.c:108
@ ONCE_REG_IDX_OTC
Definition: dsp563xx.c:118
@ ONCE_REG_IDX_OSCR
Definition: dsp563xx.c:109
@ ONCE_REG_IDX_OMLR0
Definition: dsp563xx.c:112
@ ONCE_REG_IDX_OPABF9
Definition: dsp563xx.c:131
@ ONCE_REG_IDX_OPABF8
Definition: dsp563xx.c:130
@ ONCE_REG_IDX_OPILR
Definition: dsp563xx.c:116
@ ONCE_REG_IDX_OPABF0
Definition: dsp563xx.c:122
@ ONCE_REG_IDX_OPABF1
Definition: dsp563xx.c:123
@ ONCE_REG_IDX_OPABF7
Definition: dsp563xx.c:129
@ ONCE_REG_IDX_OPABF6
Definition: dsp563xx.c:128
@ ONCE_REG_IDX_OPABF11
Definition: dsp563xx.c:133
@ ONCE_REG_IDX_OMBC
Definition: dsp563xx.c:110
@ ONCE_REG_IDX_OPABF3
Definition: dsp563xx.c:125
@ ONCE_REG_IDX_OPABEX
Definition: dsp563xx.c:121
@ ONCE_REG_IDX_OPDBR
Definition: dsp563xx.c:115
@ ONCE_REG_IDX_OPABF5
Definition: dsp563xx.c:127
@ ONCE_REG_IDX_OPABF2
Definition: dsp563xx.c:124
@ ONCE_REG_IDX_OPABDR
Definition: dsp563xx.c:120
@ ONCE_REG_IDX_OGDBR
Definition: dsp563xx.c:114
@ ONCE_REG_IDX_OMLR1
Definition: dsp563xx.c:113
@ ONCE_REG_IDX_PDB
Definition: dsp563xx.c:117
@ ONCE_REG_IDX_OPABF10
Definition: dsp563xx.c:132
@ ONCE_REG_IDX_OPABFR
Definition: dsp563xx.c:119
@ ONCE_REG_IDX_OPABF4
Definition: dsp563xx.c:126
@ ONCE_REG_IDX_OBCR
Definition: dsp563xx.c:111
#define ASM_REG_W_A2
Definition: dsp563xx.c:57
static int dsp563xx_examine(struct target *target)
Definition: dsp563xx.c:908
static int dsp563xx_write_memory_default(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: dsp563xx.c:1837
#define ASM_REG_W_M0
Definition: dsp563xx.c:40
dsp563xx_reg_idx
Definition: dsp563xx.c:165
@ DSP563XX_REG_IDX_R0
Definition: dsp563xx.c:166
@ DSP563XX_REG_IDX_AAR2
Definition: dsp563xx.c:218
@ DSP563XX_REG_IDX_B0
Definition: dsp563xx.c:197
@ DSP563XX_REG_IDX_R5
Definition: dsp563xx.c:171
@ DSP563XX_REG_IDX_SP
Definition: dsp563xx.c:202
@ DSP563XX_REG_IDX_BCR
Definition: dsp563xx.c:214
@ DSP563XX_REG_IDX_Y1
Definition: dsp563xx.c:193
@ DSP563XX_REG_IDX_M7
Definition: dsp563xx.c:189
@ DSP563XX_REG_IDX_A0
Definition: dsp563xx.c:194
@ DSP563XX_REG_IDX_SSL
Definition: dsp563xx.c:201
@ DSP563XX_REG_IDX_LA
Definition: dsp563xx.c:209
@ DSP563XX_REG_IDX_OMR
Definition: dsp563xx.c:208
@ DSP563XX_REG_IDX_M0
Definition: dsp563xx.c:182
@ DSP563XX_REG_IDX_N3
Definition: dsp563xx.c:177
@ DSP563XX_REG_IDX_X1
Definition: dsp563xx.c:191
@ DSP563XX_REG_IDX_R6
Definition: dsp563xx.c:172
@ DSP563XX_REG_IDX_N0
Definition: dsp563xx.c:174
@ DSP563XX_REG_IDX_N1
Definition: dsp563xx.c:175
@ DSP563XX_REG_IDX_N6
Definition: dsp563xx.c:180
@ DSP563XX_REG_IDX_B2
Definition: dsp563xx.c:199
@ DSP563XX_REG_IDX_R4
Definition: dsp563xx.c:170
@ DSP563XX_REG_IDX_M3
Definition: dsp563xx.c:185
@ DSP563XX_REG_IDX_AAR1
Definition: dsp563xx.c:217
@ DSP563XX_REG_IDX_AAR0
Definition: dsp563xx.c:216
@ DSP563XX_REG_IDX_A2
Definition: dsp563xx.c:196
@ DSP563XX_REG_IDX_N2
Definition: dsp563xx.c:176
@ DSP563XX_REG_IDX_EP
Definition: dsp563xx.c:203
@ DSP563XX_REG_IDX_R3
Definition: dsp563xx.c:169
@ DSP563XX_REG_IDX_SR
Definition: dsp563xx.c:207
@ DSP563XX_REG_IDX_M2
Definition: dsp563xx.c:184
@ DSP563XX_REG_IDX_N5
Definition: dsp563xx.c:179
@ DSP563XX_REG_IDX_DCR
Definition: dsp563xx.c:215
@ DSP563XX_REG_IDX_M6
Definition: dsp563xx.c:188
@ DSP563XX_REG_IDX_N7
Definition: dsp563xx.c:181
@ DSP563XX_REG_IDX_SZ
Definition: dsp563xx.c:204
@ DSP563XX_REG_IDX_M1
Definition: dsp563xx.c:183
@ DSP563XX_REG_IDX_B1
Definition: dsp563xx.c:198
@ DSP563XX_REG_IDX_LC
Definition: dsp563xx.c:210
@ DSP563XX_REG_IDX_Y0
Definition: dsp563xx.c:192
@ DSP563XX_REG_IDX_R1
Definition: dsp563xx.c:167
@ DSP563XX_REG_IDX_SC
Definition: dsp563xx.c:205
@ DSP563XX_REG_IDX_R7
Definition: dsp563xx.c:173
@ DSP563XX_REG_IDX_M5
Definition: dsp563xx.c:187
@ DSP563XX_REG_IDX_A1
Definition: dsp563xx.c:195
@ DSP563XX_REG_IDX_N4
Definition: dsp563xx.c:178
@ DSP563XX_REG_IDX_X0
Definition: dsp563xx.c:190
@ DSP563XX_REG_IDX_VBA
Definition: dsp563xx.c:211
@ DSP563XX_REG_IDX_IPRC
Definition: dsp563xx.c:212
@ DSP563XX_REG_IDX_M4
Definition: dsp563xx.c:186
@ DSP563XX_REG_IDX_R2
Definition: dsp563xx.c:168
@ DSP563XX_REG_IDX_AAR3
Definition: dsp563xx.c:219
@ DSP563XX_REG_IDX_PC
Definition: dsp563xx.c:206
@ DSP563XX_REG_IDX_IPRP
Definition: dsp563xx.c:213
@ DSP563XX_REG_IDX_SSH
Definition: dsp563xx.c:200
#define DSP563XX_SR_SC
Definition: dsp563xx.c:942
static int dsp563xx_jtag_debug_request(struct target *target)
Definition: dsp563xx.c:1030
COMMAND_HANDLER(dsp563xx_add_watchpoint_command)
Definition: dsp563xx.c:1999
static int dsp563xx_read_core_reg(struct target *target, int num)
Definition: dsp563xx.c:366
static int dsp563xx_remove_custom_watchpoint(struct target *target)
Definition: dsp563xx.c:1978
#define ASM_REG_W_X0
Definition: dsp563xx.c:49
#define OBCR_BP_MEM_X
Definition: dsp563xx.c:95
#define ASM_REG_W_N2
Definition: dsp563xx.c:33
static int dsp563xx_write_core_reg(struct target *target, int num)
Definition: dsp563xx.c:382
#define OBCR_BP_ON_WRITE
Definition: dsp563xx.c:98
static int dsp563xx_write_memory_core(struct target *target, int mem_type, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: dsp563xx.c:1684
uint32_t instr_mask
Definition: dsp563xx.c:228
#define ASM_REG_W_EP
Definition: dsp563xx.c:65
#define ASM_REG_W_AAR3
Definition: dsp563xx.c:83
#define ASM_REG_W_SP
Definition: dsp563xx.c:69
memory_type
Definition: dsp563xx.c:297
@ MEM_Y
Definition: dsp563xx.c:299
@ MEM_P
Definition: dsp563xx.c:300
@ MEM_X
Definition: dsp563xx.c:298
@ MEM_L
Definition: dsp563xx.c:301
#define ASM_REG_W_SSH
Definition: dsp563xx.c:70
static const struct @89 dsp563xx_regs[]
#define ASM_REG_W_AAR1
Definition: dsp563xx.c:81
#define ASM_REG_W_DCR
Definition: dsp563xx.c:79
#define ASM_REG_W_IPRP
Definition: dsp563xx.c:76
#define ASM_REG_W_N5
Definition: dsp563xx.c:36
static int dsp563xx_init_target(struct command_context *cmd_ctx, struct target *target)
Definition: dsp563xx.c:895
#define ASM_REG_W_X1
Definition: dsp563xx.c:50
static int dsp563xx_read_memory_core(struct target *target, int mem_type, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: dsp563xx.c:1503
#define ASM_REG_W_R3
Definition: dsp563xx.c:25
static int dsp563xx_reg_write_high_io(struct target *target, uint32_t instr_mask, uint32_t data)
Definition: dsp563xx.c:506
#define ASM_REG_W_AAR2
Definition: dsp563xx.c:82
#define ASM_REG_W_R1
Definition: dsp563xx.c:23
#define ASM_REG_W_AAR0
Definition: dsp563xx.c:80
static int dsp563xx_halt(struct target *target)
Definition: dsp563xx.c:1091
#define ASM_REG_W_SR
Definition: dsp563xx.c:68
#define ASM_REG_W_N7
Definition: dsp563xx.c:38
#define ASM_REG_W_R4
Definition: dsp563xx.c:26
#define ASM_REG_W_N4
Definition: dsp563xx.c:35
watchpoint_condition
Definition: dsp563xx.c:304
@ GREATER
Definition: dsp563xx.c:307
@ LESS_THAN
Definition: dsp563xx.c:308
@ EQUAL
Definition: dsp563xx.c:305
@ NOT_EQUAL
Definition: dsp563xx.c:306
#define OBCR_BP_0(x)
Definition: dsp563xx.c:104
#define ASM_REG_W_Y1
Definition: dsp563xx.c:53
static void dsp563xx_build_reg_cache(struct target *target)
Definition: dsp563xx.c:435
#define OBCR_BP_CC_GREATER_THAN
Definition: dsp563xx.c:102
static int dsp563xx_get_default_memory(void)
Definition: dsp563xx.c:1465
static int dsp563xx_write_buffer_default(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
Definition: dsp563xx.c:1847
#define ASM_REG_W_A0
Definition: dsp563xx.c:55
static const uint8_t gdb_reg_list_idx[]
Definition: dsp563xx.c:325
uint8_t eame
Definition: dsp563xx.c:227
#define EAME_R0
Definition: dsp563xx.c:313
static int dsp563xx_read_memory_default(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: dsp563xx.c:1663
static int dsp563xx_reg_write(struct target *target, uint32_t instr_mask, uint32_t data)
Definition: dsp563xx.c:549
#define ASM_REG_W_M2
Definition: dsp563xx.c:42
#define ASM_REG_W_M4
Definition: dsp563xx.c:44
static int dsp563xx_step_ex(struct target *target, bool current, uint32_t address, bool handle_breakpoints, int steps)
Definition: dsp563xx.c:1171
#define ASM_REG_W_R5
Definition: dsp563xx.c:27
#define ASM_REG_W_OMR
Definition: dsp563xx.c:64
static void dsp563xx_invalidate_x_context(struct target *target, uint32_t addr_start, uint32_t addr_end)
Definition: dsp563xx.c:856
static int dsp563xx_write_register(struct target *target, int num, int force)
Definition: dsp563xx.c:781
static int dsp563xx_poll(struct target *target)
Definition: dsp563xx.c:1035
static int dsp563xx_reg_ssh_write(struct target *target)
Definition: dsp563xx.c:659
#define ASM_REG_W_B1
Definition: dsp563xx.c:60
static int dsp563xx_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Definition: dsp563xx.c:342
unsigned int bits
Definition: dsp563xx.c:225
static int dsp563xx_debug_init(struct target *target)
Definition: dsp563xx.c:949
#define ASM_REG_W_N0
Definition: dsp563xx.c:31
static int dsp563xx_set_core_reg(struct reg *reg, uint8_t *buf)
Definition: dsp563xx.c:412
#define ASM_REG_W_BCR
Definition: dsp563xx.c:78
#define ASM_REG_W_VBA
Definition: dsp563xx.c:63
static int dsp563xx_reg_ssl_read(struct target *target)
Definition: dsp563xx.c:701
static int dsp563xx_run_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t entry_point, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Definition: dsp563xx.c:1370
#define OBCR_BP_CC_LESS_THAN
Definition: dsp563xx.c:101
#define ASM_REG_W_R7
Definition: dsp563xx.c:29
static const struct command_registration dsp563xx_command_handlers[]
Definition: dsp563xx.c:2169
unsigned int id
Definition: dsp563xx.c:223
#define ASM_REG_W_R0
Definition: dsp563xx.c:22
static int dsp563xx_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Definition: dsp563xx.c:1287
#define ASM_REG_W_LC
Definition: dsp563xx.c:73
#define ASM_REG_W_A1
Definition: dsp563xx.c:56
static int dsp563xx_save_context(struct target *target)
Definition: dsp563xx.c:830
static int dsp563xx_get_core_reg(struct reg *reg)
Definition: dsp563xx.c:398
static int dsp563xx_restore_context(struct target *target)
Definition: dsp563xx.c:843
#define ASM_REG_W_M6
Definition: dsp563xx.c:46
static int dsp563xx_read_buffer_default(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
Definition: dsp563xx.c:1674
#define OBCR_BP_CC_EQUAL
Definition: dsp563xx.c:100
#define ASM_REG_W_SC
Definition: dsp563xx.c:66
#define ASM_REG_W_N6
Definition: dsp563xx.c:37
#define ASM_REG_W_B2
Definition: dsp563xx.c:61
#define ASM_REG_W_LA
Definition: dsp563xx.c:72
static int dsp563xx_read_register(struct target *target, int num, int force)
Definition: dsp563xx.c:730
#define ASM_REG_W_R6
Definition: dsp563xx.c:28
struct target_type dsp563xx_target
Holds methods for DSP563XX targets.
Definition: dsp563xx.c:2247
#define ASM_REG_W_M1
Definition: dsp563xx.c:41
#define ASM_REG_W_SSL
Definition: dsp563xx.c:71
#define ASM_REG_W_M3
Definition: dsp563xx.c:43
static int dsp563xx_reg_pc_read(struct target *target)
Definition: dsp563xx.c:560
#define DSP563XX_SR_SA
Definition: dsp563xx.c:941
#define ASM_REG_W_B0
Definition: dsp563xx.c:59
#define OBCR_BP_ON_READ
Definition: dsp563xx.c:97
static int dsp563xx_assert_reset(struct target *target)
Definition: dsp563xx.c:1312
static int dsp563xx_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
Definition: dsp563xx.c:1861
#define ASM_REG_W_R2
Definition: dsp563xx.c:24
static int dsp563xx_target_create(struct target *target)
Definition: dsp563xx.c:880
static int dsp563xx_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Definition: dsp563xx.c:1114
#define ASM_REG_W_N1
Definition: dsp563xx.c:32
#define INSTR_MOVEP_REG_HIO(s, w, d, p)
Definition: dsp563xx.c:321
#define ASM_REG_W_SZ
Definition: dsp563xx.c:67
#define DSP563XX_NUMONCEREGS
Definition: dsp563xx.h:15
@ BPU_NONE
Definition: dsp563xx.h:22
@ BPU_WATCHPOINT
Definition: dsp563xx.h:24
#define DSP563XX_NUMCOREREGS
Definition: dsp563xx.h:14
static struct dsp563xx_common * target_to_dsp563xx(struct target *target)
Definition: dsp563xx.h:57
int dsp563xx_once_execute_sw_ir(struct jtag_tap *tap, int flush, uint32_t opcode)
single word instruction
int dsp563xx_once_reg_write(struct jtag_tap *tap, int flush, uint8_t reg, uint32_t data)
once write register
int dsp563xx_once_execute_dw_ir(struct jtag_tap *tap, int flush, uint32_t opcode, uint32_t operand)
double word instruction
int dsp563xx_once_target_status(struct jtag_tap *tap)
Definition: dsp563xx_once.c:92
int dsp563xx_once_reg_read(struct jtag_tap *tap, int flush, uint8_t reg, uint32_t *data)
once read register
int dsp563xx_once_read_register(struct jtag_tap *tap, int flush, struct once_reg *regs, int len)
once read registers
int dsp563xx_once_request_debug(struct jtag_tap *tap, int reset_state)
#define DSP563XX_ONCE_PDBGOTO
Definition: dsp563xx_once.h:43
#define DSP563XX_ONCE_OBCR
Definition: dsp563xx_once.h:37
#define DSP563XX_ONCE_OSCR_DEBUG_M
Definition: dsp563xx_once.h:33
#define DSP563XX_ONCE_OSCR_MBO
Definition: dsp563xx_once.h:25
#define DSP563XX_ONCE_OPABFR
Definition: dsp563xx_once.h:46
#define DSP563XX_ONCE_OPABF11
Definition: dsp563xx_once.h:49
#define DSP563XX_ONCE_OSCR_TME
Definition: dsp563xx_once.h:28
#define DSP563XX_ONCE_OPDBR
Definition: dsp563xx_once.h:41
#define DSP563XX_ONCE_OCR_EX
Definition: dsp563xx_once.h:17
#define DSP563XX_ONCE_OPABEX
Definition: dsp563xx_once.h:48
#define DSP563XX_ONCE_OGDBR
Definition: dsp563xx_once.h:40
#define DSP563XX_ONCE_OSCR_TO
Definition: dsp563xx_once.h:24
#define DSP563XX_ONCE_OTC
Definition: dsp563xx_once.h:44
#define DSP563XX_ONCE_OPILR
Definition: dsp563xx_once.h:42
#define DSP563XX_ONCE_OMLR0
Definition: dsp563xx_once.h:38
#define DSP563XX_ONCE_OCR_GO
Definition: dsp563xx_once.h:18
#define DSP563XX_ONCE_OMLR1
Definition: dsp563xx_once.h:39
#define DSP563XX_ONCE_OPABDR
Definition: dsp563xx_once.h:47
#define DSP563XX_ONCE_OSCR
Definition: dsp563xx_once.h:35
#define DSP563XX_ONCE_OSCR_SWO
Definition: dsp563xx_once.h:26
#define DSP563XX_ONCE_OMBC
Definition: dsp563xx_once.h:36
uint8_t pattern
Fill pattern.
Definition: dw-spi-helper.h:8
uint64_t buffer
Pointer to data buffer to send over SPI.
Definition: dw-spi-helper.h:0
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
uint32_t address
Starting address. Sector aligned.
Definition: dw-spi-helper.h:0
static uint16_t direction
Definition: ftdi.c:120
void jtag_add_reset(int req_tlr_or_trst, int req_srst)
A reset of the TAP state machine can be requested.
Definition: jtag/core.c:771
int jtag_execute_queue(void)
For software FIFO implementations, the queued commands can be executed during this call or earlier.
Definition: jtag/core.c:1050
static enum reset_types jtag_reset_config
Definition: jtag/core.c:89
void jtag_add_sleep(uint32_t us)
Definition: jtag/core.c:883
enum reset_types jtag_get_reset_config(void)
Definition: jtag/core.c:1747
reset_types
Definition: jtag.h:215
@ RESET_HAS_SRST
Definition: jtag.h:218
@ RESET_SRST_PULLS_TRST
Definition: jtag.h:220
#define LOG_WARNING(expr ...)
Definition: log.h:130
#define LOG_TARGET_ERROR(target, fmt_str,...)
Definition: log.h:162
#define LOG_ERROR(expr ...)
Definition: log.h:133
#define LOG_INFO(expr ...)
Definition: log.h:127
#define LOG_DEBUG(expr ...)
Definition: log.h:110
#define ERROR_OK
Definition: log.h:168
#define sp
Definition: mips32.c:222
struct reg * register_get_by_name(struct reg_cache *first, const char *name, bool search_all)
Definition: register.c:50
struct reg_cache ** register_get_last_cache_p(struct reg_cache **first)
Definition: register.c:72
void register_cache_invalidate(struct reg_cache *cache)
Marks the contents of the register cache as invalid (and clean).
Definition: register.c:94
struct target * target
Definition: rtt/rtt.c:26
mem_type
Definition: stm8.c:137
target_addr_t address
Definition: breakpoints.h:27
Jim_Interp * interp
Definition: command.h:53
const char * name
Definition: command.h:234
uint32_t core_regs[DSP563XX_NUMCOREREGS]
Definition: dsp563xx.h:34
int(* read_core_reg)(struct target *target, int num)
Definition: dsp563xx.h:38
bool hardware_breakpoints_cleared
Definition: dsp563xx.h:44
struct mcu_jtag jtag_info
Definition: dsp563xx.h:32
struct hardware_breakpoint hardware_breakpoint[1]
Definition: dsp563xx.h:41
int(* write_core_reg)(struct target *target, int num)
Definition: dsp563xx.h:39
struct reg_cache * core_cache
Definition: dsp563xx.h:33
uint32_t instr_mask
Definition: dsp563xx.h:52
uint32_t size
Definition: dsp563xx.h:50
struct dsp563xx_common * dsp563xx_common
Definition: dsp563xx.h:54
struct target * target
Definition: dsp563xx.h:53
uint32_t num
Definition: dsp563xx.h:48
uint8_t eame
Definition: dsp563xx.h:51
const char * name
Definition: dsp563xx.h:49
enum breakpoint_usage used
Definition: dsp563xx.h:28
bool has_idcode
not all devices have idcode, we'll discover this during chain examination
Definition: jtag.h:118
uint32_t idcode
device identification code
Definition: jtag.h:115
struct jtag_tap * tap
Definition: avrt.h:14
const char * name
Definition: dsp563xx_once.h:56
uint32_t reg
Definition: dsp563xx_once.h:57
int(* get)(struct reg *reg)
Definition: register.h:152
const char * name
Definition: register.h:145
unsigned int num_regs
Definition: register.h:148
struct reg * reg_list
Definition: register.h:147
struct reg_cache * next
Definition: register.h:146
uint32_t size
Definition: algorithm.h:29
const char * reg_name
Definition: algorithm.h:28
Definition: register.h:111
bool valid
Definition: register.h:126
bool exist
Definition: register.h:128
uint32_t size
Definition: register.h:132
uint8_t * value
Definition: register.h:122
void * arch_info
Definition: register.h:140
bool dirty
Definition: register.h:124
const struct reg_arch_type * type
Definition: register.h:141
const char * name
Definition: register.h:113
This holds methods shared between all instances of a given target type.
Definition: target_type.h:26
const char * name
Name of this type of target.
Definition: target_type.h:31
Definition: target.h:119
struct jtag_tap * tap
Definition: target.h:122
enum target_debug_reason debug_reason
Definition: target.h:157
enum target_state state
Definition: target.h:160
struct reg_cache * reg_cache
Definition: target.h:161
void * arch_info
Definition: target.h:167
bool reset_halt
Definition: target.h:147
int target_call_event_callbacks(struct target *target, enum target_event event)
Definition: target.c:1774
int target_halt(struct target *target)
Definition: target.c:516
void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value)
Definition: target.c:361
int target_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
Definition: target.c:2351
int target_read_buffer(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
Definition: target.c:2416
const char * target_state_name(const struct target *t)
Return the name of this targets current state.
Definition: target.c:269
int target_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Make the target (re)start executing using its saved execution context (possibly with some modificatio...
Definition: target.c:565
void target_handle_md_output(struct command_invocation *cmd, struct target *target, target_addr_t address, unsigned int size, unsigned int count, const uint8_t *buffer)
Definition: target.c:3350
int target_wait_state(struct target *target, enum target_state state, unsigned int ms)
Definition: target.c:3220
struct target * get_current_target(struct command_context *cmd_ctx)
Definition: target.c:467
uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer)
Definition: target.c:325
@ DBG_REASON_DBGRQ
Definition: target.h:72
@ DBG_REASON_SINGLESTEP
Definition: target.h:76
target_register_class
Definition: target.h:113
#define ERROR_TARGET_NOT_HALTED
Definition: target.h:786
static bool target_was_examined(const struct target *target)
Definition: target.h:432
#define ERROR_TARGET_INVALID
Definition: target.h:783
@ TARGET_EVENT_DEBUG_RESUMED
Definition: target.h:275
@ TARGET_EVENT_HALTED
Definition: target.h:255
@ TARGET_EVENT_DEBUG_HALTED
Definition: target.h:274
@ TARGET_RESET
Definition: target.h:59
@ TARGET_UNKNOWN
Definition: target.h:56
@ TARGET_HALTED
Definition: target.h:58
@ TARGET_RUNNING
Definition: target.h:57
#define ERROR_TARGET_RESOURCE_NOT_AVAILABLE
Definition: target.h:790
static void target_set_examined(struct target *target)
Sets the examined flag for the given target.
Definition: target.h:439
#define ERROR_TARGET_FAILURE
Definition: target.h:787
uint64_t target_addr_t
Definition: types.h:279
#define TARGET_PRIXADDR
Definition: types.h:285
#define TARGET_PRIxADDR
Definition: types.h:284
#define NULL
Definition: usb.h:16
uint8_t state[4]
Definition: vdebug.c:21
uint8_t count[4]
Definition: vdebug.c:22
static int read_mem(struct target *t, uint32_t size, uint32_t addr, uint8_t *buf)