OpenOCD
aarch64.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2015 by David Ung *
5  * *
6  ***************************************************************************/
7 
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif
11 
12 #include "breakpoints.h"
13 #include "aarch64.h"
14 #include "a64_disassembler.h"
15 #include "register.h"
16 #include "target_request.h"
17 #include "target_type.h"
18 #include "armv8_opcodes.h"
19 #include "armv8_cache.h"
20 #include "arm_coresight.h"
21 #include "arm_semihosting.h"
22 #include "jtag/interface.h"
23 #include "smp.h"
24 #include <helper/nvp.h>
25 #include <helper/time_support.h>
26 
30 };
31 
32 enum halt_mode {
35 };
36 
39  struct arm_cti *cti;
40 };
41 
42 static int aarch64_poll_smp(struct target *target, bool smp,
43  bool postpone_event);
44 static int aarch64_debug_entry(struct target *target);
45 static int aarch64_restore_context(struct target *target, bool bpwp);
46 static int aarch64_set_breakpoint(struct target *target,
47  struct breakpoint *breakpoint, uint8_t matchmode);
49  struct breakpoint *breakpoint, uint8_t matchmode);
51  struct breakpoint *breakpoint);
52 static int aarch64_unset_breakpoint(struct target *target,
53  struct breakpoint *breakpoint);
54 static int aarch64_mmu(struct target *target, bool *enabled);
55 static int aarch64_virt2phys(struct target *target,
56  target_addr_t virt, target_addr_t *phys);
57 static int aarch64_read_cpu_memory(struct target *target,
58  uint64_t address, uint32_t size, uint32_t count, uint8_t *buffer);
59 
61 {
62  enum arm_mode target_mode = ARM_MODE_ANY;
63  int retval = ERROR_OK;
64  uint32_t instr;
65 
66  struct aarch64_common *aarch64 = target_to_aarch64(target);
67  struct armv8_common *armv8 = target_to_armv8(target);
68 
69  if (aarch64->system_control_reg != aarch64->system_control_reg_curr) {
70  aarch64->system_control_reg_curr = aarch64->system_control_reg;
71  /* LOG_INFO("cp15_control_reg: %8.8" PRIx32, cortex_v8->cp15_control_reg); */
72 
73  switch (armv8->arm.core_mode) {
74  case ARMV8_64_EL0T:
75  target_mode = ARMV8_64_EL1H;
76  /* fall through */
77  case ARMV8_64_EL1T:
78  case ARMV8_64_EL1H:
79  instr = ARMV8_MSR_GP(SYSTEM_SCTLR_EL1, 0);
80  break;
81  case ARMV8_64_EL2T:
82  case ARMV8_64_EL2H:
83  instr = ARMV8_MSR_GP(SYSTEM_SCTLR_EL2, 0);
84  break;
85  case ARMV8_64_EL3H:
86  case ARMV8_64_EL3T:
87  instr = ARMV8_MSR_GP(SYSTEM_SCTLR_EL3, 0);
88  break;
89 
90  case ARM_MODE_SVC:
91  case ARM_MODE_ABT:
92  case ARM_MODE_FIQ:
93  case ARM_MODE_IRQ:
94  case ARM_MODE_HYP:
95  case ARM_MODE_UND:
96  case ARM_MODE_SYS:
97  case ARM_MODE_MON:
98  instr = ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
99  break;
100 
101  default:
102  LOG_ERROR("cannot read system control register in this mode: (%s : 0x%x)",
103  armv8_mode_name(armv8->arm.core_mode), armv8->arm.core_mode);
104  return ERROR_FAIL;
105  }
106 
107  if (target_mode != ARM_MODE_ANY)
108  armv8_dpm_modeswitch(&armv8->dpm, target_mode);
109 
110  retval = armv8->dpm.instr_write_data_r0_64(&armv8->dpm, instr, aarch64->system_control_reg);
111  if (retval != ERROR_OK)
112  return retval;
113 
114  if (target_mode != ARM_MODE_ANY)
116  }
117 
118  return retval;
119 }
120 
121 /* modify system_control_reg in order to enable or disable mmu for :
122  * - virt2phys address conversion
123  * - read or write memory in phys or virt address */
124 static int aarch64_mmu_modify(struct target *target, int enable)
125 {
126  struct aarch64_common *aarch64 = target_to_aarch64(target);
127  struct armv8_common *armv8 = &aarch64->armv8_common;
128  int retval = ERROR_OK;
129  enum arm_mode target_mode = ARM_MODE_ANY;
130  uint32_t instr = 0;
131 
132  if (enable) {
133  /* if mmu enabled at target stop and mmu not enable */
134  if (!(aarch64->system_control_reg & 0x1U)) {
135  LOG_ERROR("trying to enable mmu on target stopped with mmu disable");
136  return ERROR_FAIL;
137  }
138  if (!(aarch64->system_control_reg_curr & 0x1U))
139  aarch64->system_control_reg_curr |= 0x1U;
140  } else {
141  if (aarch64->system_control_reg_curr & 0x4U) {
142  /* data cache is active */
143  aarch64->system_control_reg_curr &= ~0x4U;
144  /* flush data cache armv8 function to be called */
147  }
148  if ((aarch64->system_control_reg_curr & 0x1U)) {
149  aarch64->system_control_reg_curr &= ~0x1U;
150  }
151  }
152 
153  switch (armv8->arm.core_mode) {
154  case ARMV8_64_EL0T:
155  target_mode = ARMV8_64_EL1H;
156  /* fall through */
157  case ARMV8_64_EL1T:
158  case ARMV8_64_EL1H:
159  instr = ARMV8_MSR_GP(SYSTEM_SCTLR_EL1, 0);
160  break;
161  case ARMV8_64_EL2T:
162  case ARMV8_64_EL2H:
163  instr = ARMV8_MSR_GP(SYSTEM_SCTLR_EL2, 0);
164  break;
165  case ARMV8_64_EL3H:
166  case ARMV8_64_EL3T:
167  instr = ARMV8_MSR_GP(SYSTEM_SCTLR_EL3, 0);
168  break;
169 
170  case ARM_MODE_SVC:
171  case ARM_MODE_ABT:
172  case ARM_MODE_FIQ:
173  case ARM_MODE_IRQ:
174  case ARM_MODE_HYP:
175  case ARM_MODE_UND:
176  case ARM_MODE_SYS:
177  case ARM_MODE_MON:
178  instr = ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
179  break;
180 
181  default:
182  LOG_DEBUG("unknown cpu state 0x%x", armv8->arm.core_mode);
183  break;
184  }
185  if (target_mode != ARM_MODE_ANY)
186  armv8_dpm_modeswitch(&armv8->dpm, target_mode);
187 
188  retval = armv8->dpm.instr_write_data_r0_64(&armv8->dpm, instr,
189  aarch64->system_control_reg_curr);
190 
191  if (target_mode != ARM_MODE_ANY)
193 
194  return retval;
195 }
196 
197 static int aarch64_read_prsr(struct target *target, uint32_t *prsr)
198 {
199  struct armv8_common *armv8 = target_to_armv8(target);
200  int retval;
201 
202  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
203  armv8->debug_base + CPUV8_DBG_PRSR, prsr);
204  if (retval != ERROR_OK)
205  return retval;
206 
207  armv8->sticky_reset |= *prsr & PRSR_SR;
208  return ERROR_OK;
209 }
210 
211 /*
212  * Basic debug access, very low level assumes state is saved
213  */
215 {
216  struct armv8_common *armv8 = target_to_armv8(target);
217  int retval;
218  uint32_t dummy;
219 
220  LOG_DEBUG("%s", target_name(target));
221 
222  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
223  armv8->debug_base + CPUV8_DBG_OSLAR, 0);
224  if (retval != ERROR_OK) {
225  LOG_DEBUG("Examine %s failed", "oslock");
226  return retval;
227  }
228 
229  /* Clear Sticky Power Down status Bit in PRSR to enable access to
230  the registers in the Core Power Domain */
231  retval = aarch64_read_prsr(target, &dummy);
232  if (retval != ERROR_OK)
233  return retval;
234 
235  /*
236  * Static CTI configuration:
237  * Channel 0 -> trigger outputs HALT request to PE
238  * Channel 1 -> trigger outputs Resume request to PE
239  * Gate all channel trigger events from entering the CTM
240  */
241 
242  /* Enable CTI */
243  retval = arm_cti_enable(armv8->cti, true);
244  /* By default, gate all channel events to and from the CTM */
245  if (retval == ERROR_OK)
246  retval = arm_cti_write_reg(armv8->cti, CTI_GATE, 0);
247  /* output halt requests to PE on channel 0 event */
248  if (retval == ERROR_OK)
249  retval = arm_cti_write_reg(armv8->cti, CTI_OUTEN0, CTI_CHNL(0));
250  /* output restart requests to PE on channel 1 event */
251  if (retval == ERROR_OK)
252  retval = arm_cti_write_reg(armv8->cti, CTI_OUTEN1, CTI_CHNL(1));
253  if (retval != ERROR_OK)
254  return retval;
255 
256  /* Resync breakpoint registers */
257 
258  return ERROR_OK;
259 }
260 
261 /* Write to memory mapped registers directly with no cache or mmu handling */
264  uint32_t value)
265 {
266  int retval;
267  struct armv8_common *armv8 = target_to_armv8(target);
268 
269  retval = mem_ap_write_atomic_u32(armv8->debug_ap, address, value);
270 
271  return retval;
272 }
273 
274 static int aarch64_dpm_setup(struct aarch64_common *a8, uint64_t debug)
275 {
276  struct arm_dpm *dpm = &a8->armv8_common.dpm;
277  int retval;
278 
279  dpm->arm = &a8->armv8_common.arm;
280  dpm->didr = debug;
281 
282  retval = armv8_dpm_setup(dpm);
283  if (retval == ERROR_OK)
284  retval = armv8_dpm_initialize(dpm);
285 
286  return retval;
287 }
288 
289 static int aarch64_set_dscr_bits(struct target *target, unsigned long bit_mask, unsigned long value)
290 {
291  struct armv8_common *armv8 = target_to_armv8(target);
292  return armv8_set_dbgreg_bits(armv8, CPUV8_DBG_DSCR, bit_mask, value);
293 }
294 
296  uint32_t mask, uint32_t val, int *p_result, uint32_t *p_prsr)
297 {
298  uint32_t prsr;
299  int retval;
300 
301  retval = aarch64_read_prsr(target, &prsr);
302  if (retval != ERROR_OK)
303  return retval;
304 
305  if (p_prsr)
306  *p_prsr = prsr;
307 
308  if (p_result)
309  *p_result = (prsr & mask) == (val & mask);
310 
311  return ERROR_OK;
312 }
313 
315 {
316  int retval = ERROR_OK;
317  uint32_t prsr;
318 
319  int64_t then = timeval_ms();
320  for (;;) {
321  int halted;
322 
324  if (retval != ERROR_OK || halted)
325  break;
326 
327  if (timeval_ms() > then + 1000) {
328  retval = ERROR_TARGET_TIMEOUT;
329  LOG_DEBUG("target %s timeout, prsr=0x%08"PRIx32, target_name(target), prsr);
330  break;
331  }
332  }
333  return retval;
334 }
335 
336 static int aarch64_prepare_halt_smp(struct target *target, bool exc_target, struct target **p_first)
337 {
338  int retval = ERROR_OK;
339  struct target_list *head;
340  struct target *first = NULL;
341 
342  LOG_DEBUG("target %s exc %i", target_name(target), exc_target);
343 
345  struct target *curr = head->target;
346  struct armv8_common *armv8 = target_to_armv8(curr);
347 
348  if (exc_target && curr == target)
349  continue;
350  if (!target_was_examined(curr))
351  continue;
352  if (curr->state != TARGET_RUNNING)
353  continue;
354 
355  /* HACK: mark this target as prepared for halting */
357 
358  /* open the gate for channel 0 to let HALT requests pass to the CTM */
359  retval = arm_cti_ungate_channel(armv8->cti, 0);
360  if (retval == ERROR_OK)
361  retval = aarch64_set_dscr_bits(curr, DSCR_HDE, DSCR_HDE);
362  if (retval != ERROR_OK)
363  break;
364 
365  LOG_DEBUG("target %s prepared", target_name(curr));
366 
367  if (!first)
368  first = curr;
369  }
370 
371  if (p_first) {
372  if (exc_target && first)
373  *p_first = first;
374  else
375  *p_first = target;
376  }
377 
378  return retval;
379 }
380 
381 static int aarch64_halt_one(struct target *target, enum halt_mode mode)
382 {
383  int retval = ERROR_OK;
384  struct armv8_common *armv8 = target_to_armv8(target);
385 
386  LOG_DEBUG("%s", target_name(target));
387 
388  /* allow Halting Debug Mode */
390  if (retval != ERROR_OK)
391  return retval;
392 
393  /* trigger an event on channel 0, this outputs a halt request to the PE */
394  retval = arm_cti_pulse_channel(armv8->cti, 0);
395  if (retval != ERROR_OK)
396  return retval;
397 
398  if (mode == HALT_SYNC) {
399  retval = aarch64_wait_halt_one(target);
400  if (retval != ERROR_OK) {
401  if (retval == ERROR_TARGET_TIMEOUT)
402  LOG_ERROR("Timeout waiting for target %s halt", target_name(target));
403  return retval;
404  }
405  }
406 
407  return ERROR_OK;
408 }
409 
410 static int aarch64_halt_smp(struct target *target, bool exc_target)
411 {
412  struct target *next = target;
413  int retval;
414 
415  /* prepare halt on all PEs of the group */
416  retval = aarch64_prepare_halt_smp(target, exc_target, &next);
417 
418  if (exc_target && next == target)
419  return retval;
420 
421  /* halt the target PE */
422  if (retval == ERROR_OK)
423  retval = aarch64_halt_one(next, HALT_LAZY);
424 
425  if (retval != ERROR_OK)
426  return retval;
427 
428  /* wait for all PEs to halt */
429  int64_t then = timeval_ms();
430  for (;;) {
431  bool all_halted = true;
432  struct target_list *head;
433  struct target *curr;
434 
436  int halted;
437 
438  curr = head->target;
439 
440  if (!target_was_examined(curr))
441  continue;
442 
444  if (retval != ERROR_OK || !halted) {
445  all_halted = false;
446  break;
447  }
448  }
449 
450  if (all_halted)
451  break;
452 
453  if (timeval_ms() > then + 1000) {
454  retval = ERROR_TARGET_TIMEOUT;
455  break;
456  }
457 
458  /*
459  * HACK: on Hi6220 there are 8 cores organized in 2 clusters
460  * and it looks like the CTI's are not connected by a common
461  * trigger matrix. It seems that we need to halt one core in each
462  * cluster explicitly. So if we find that a core has not halted
463  * yet, we trigger an explicit halt for the second cluster.
464  */
465  retval = aarch64_halt_one(curr, HALT_LAZY);
466  if (retval != ERROR_OK)
467  break;
468  }
469 
470  return retval;
471 }
472 
474 {
475  struct target_list *head;
476  struct target *curr;
477 
479  LOG_DEBUG("Halting remaining targets in SMP group");
480  aarch64_halt_smp(target, true);
481  }
482 
483  /* poll all targets in the group */
485  curr = head->target;
486  /* skip calling context */
487  if (curr == target)
488  continue;
489  if (!target_was_examined(curr))
490  continue;
491  /* skip targets that were already halted */
492  if (curr->state == TARGET_HALTED)
493  continue;
494 
495  const bool smp = false;
496  const bool postpone_event = true;
497  aarch64_poll_smp(curr, smp, postpone_event);
498  }
499 
500  return ERROR_OK;
501 }
502 
506 };
507 
510 {
511  struct target_list *head;
512  foreach_smp_target(head, smp_targets) {
513  struct target *t = head->target;
514  if (!t->smp_halt_event_postponed)
515  continue;
516 
517  if (op == POSTPONED_HALT_EVENT_EMIT) {
518  LOG_TARGET_DEBUG(t, "sending postponed target event 'halted'");
520  }
521  t->smp_halt_event_postponed = false;
522  }
523 }
524 
525 /*
526  * Aarch64 Run control
527  */
528 
529 static int aarch64_poll_smp(struct target *target, bool smp,
530  bool postpone_event)
531 {
532  struct armv8_common *armv8 = target_to_armv8(target);
533  enum target_state prev_target_state;
534  int retval = ERROR_OK;
535  uint32_t prsr;
536 
537  retval = aarch64_read_prsr(target, &prsr);
538  if (retval != ERROR_OK)
539  return retval;
540 
541  if (armv8->sticky_reset) {
542  armv8->sticky_reset = false;
543  if (target->state != TARGET_RESET) {
545  LOG_TARGET_INFO(target, "external reset detected");
546  if (armv8->arm.core_cache) {
549  }
550  }
551  }
552 
553  if (prsr & PRSR_HALT) {
554  prev_target_state = target->state;
555  if (prev_target_state != TARGET_HALTED) {
556  enum target_debug_reason debug_reason = target->debug_reason;
557 
558  /* We have a halting debug event */
560  LOG_DEBUG("Target %s halted", target_name(target));
561  retval = aarch64_debug_entry(target);
562  if (retval != ERROR_OK)
563  return retval;
564 
565  if (smp)
566  aarch64_update_halt_gdb(target, debug_reason);
567 
568  if (arm_semihosting(target, &retval) != 0) {
569  if (smp)
572 
573  return retval;
574  }
575 
576  switch (prev_target_state) {
577  case TARGET_RUNNING:
578  case TARGET_UNKNOWN:
579  case TARGET_RESET:
580  if (postpone_event)
582  else
584  break;
587  break;
588  default:
589  break;
590  }
591 
592  if (smp)
595  }
596  } else if (prsr & PRSR_RESET) {
598  } else {
600  }
601 
602  return retval;
603 }
604 
605 static int aarch64_poll(struct target *target)
606 {
607  const bool postpone_event = false;
608  return aarch64_poll_smp(target, target->smp != 0, postpone_event);
609 }
610 
611 static int aarch64_halt(struct target *target)
612 {
613  struct armv8_common *armv8 = target_to_armv8(target);
615 
616  if (target->smp)
617  return aarch64_halt_smp(target, false);
618 
620 }
621 
622 static int aarch64_restore_one(struct target *target, bool current,
623  uint64_t *address, bool handle_breakpoints, bool debug_execution)
624 {
625  struct armv8_common *armv8 = target_to_armv8(target);
626  struct arm *arm = &armv8->arm;
627  int retval;
628  uint64_t resume_pc;
629 
630  LOG_DEBUG("%s", target_name(target));
631 
632  if (!debug_execution)
634 
635  /* current = true: continue on current pc, otherwise continue at <address> */
636  resume_pc = buf_get_u64(arm->pc->value, 0, 64);
637  if (!current)
638  resume_pc = *address;
639  else
640  *address = resume_pc;
641 
642  /* Make sure that the Armv7 gdb thumb fixups does not
643  * kill the return address
644  */
645  switch (arm->core_state) {
646  case ARM_STATE_ARM:
647  resume_pc &= 0xFFFFFFFC;
648  break;
649  case ARM_STATE_AARCH64:
650  resume_pc &= 0xFFFFFFFFFFFFFFFCULL;
651  break;
652  case ARM_STATE_THUMB:
653  case ARM_STATE_THUMB_EE:
654  /* When the return address is loaded into PC
655  * bit 0 must be 1 to stay in Thumb state
656  */
657  resume_pc |= 0x1;
658  break;
659  case ARM_STATE_JAZELLE:
660  LOG_ERROR("How do I resume into Jazelle state??");
661  return ERROR_FAIL;
662  }
663  LOG_DEBUG("resume pc = 0x%016" PRIx64, resume_pc);
664  buf_set_u64(arm->pc->value, 0, 64, resume_pc);
665  arm->pc->dirty = true;
666  arm->pc->valid = true;
667 
668  /* called it now before restoring context because it uses cpu
669  * register r0 for restoring system control register */
671  if (retval == ERROR_OK)
672  retval = aarch64_restore_context(target, handle_breakpoints);
673 
674  return retval;
675 }
676 
683 {
684  struct armv8_common *armv8 = target_to_armv8(target);
685  int retval;
686  uint32_t dscr;
687  uint32_t tmp;
688 
689  LOG_DEBUG("%s", target_name(target));
690 
691  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
692  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
693  if (retval != ERROR_OK)
694  return retval;
695 
696  if ((dscr & DSCR_ITE) == 0)
697  LOG_ERROR("DSCR.ITE must be set before leaving debug!");
698  if ((dscr & DSCR_ERR) != 0)
699  LOG_ERROR("DSCR.ERR must be cleared before leaving debug!");
700 
701  /* acknowledge a pending CTI halt event */
702  retval = arm_cti_ack_events(armv8->cti, CTI_TRIG(HALT));
703  /*
704  * open the CTI gate for channel 1 so that the restart events
705  * get passed along to all PEs. Also close gate for channel 0
706  * to isolate the PE from halt events.
707  */
708  if (retval == ERROR_OK)
709  retval = arm_cti_ungate_channel(armv8->cti, 1);
710  if (retval == ERROR_OK)
711  retval = arm_cti_gate_channel(armv8->cti, 0);
712 
713  /* make sure that DSCR.HDE is set */
714  if (retval == ERROR_OK) {
715  dscr |= DSCR_HDE;
716  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
717  armv8->debug_base + CPUV8_DBG_DSCR, dscr);
718  }
719 
720  if (retval == ERROR_OK) {
721  /* clear sticky bits in PRSR, SDR is now 0 */
722  retval = aarch64_read_prsr(target, &tmp);
723  }
724 
725  return retval;
726 }
727 
729 {
730  struct armv8_common *armv8 = target_to_armv8(target);
731  int retval;
732 
733  LOG_DEBUG("%s", target_name(target));
734 
735  /* trigger an event on channel 1, generates a restart request to the PE */
736  retval = arm_cti_pulse_channel(armv8->cti, 1);
737  if (retval != ERROR_OK)
738  return retval;
739 
740  if (mode == RESTART_SYNC) {
741  int64_t then = timeval_ms();
742  for (;;) {
743  int resumed;
744  /*
745  * if PRSR.SDR is set now, the target did restart, even
746  * if it's now already halted again (e.g. due to breakpoint)
747  */
749  PRSR_SDR, PRSR_SDR, &resumed, NULL);
750  if (retval != ERROR_OK || resumed)
751  break;
752 
753  if (timeval_ms() > then + 1000) {
754  LOG_ERROR("%s: Timeout waiting for resume"PRIx32, target_name(target));
755  retval = ERROR_TARGET_TIMEOUT;
756  break;
757  }
758  }
759  }
760 
761  if (retval != ERROR_OK)
762  return retval;
763 
766 
767  return ERROR_OK;
768 }
769 
771 {
772  int retval;
773 
774  LOG_DEBUG("%s", target_name(target));
775 
777  if (retval == ERROR_OK)
779 
780  return retval;
781 }
782 
783 /*
784  * prepare all but the current target for restart
785  */
787  bool handle_breakpoints, struct target **p_first)
788 {
789  int retval = ERROR_OK;
790  struct target_list *head;
791  struct target *first = NULL;
792  uint64_t address;
793 
795  struct target *curr = head->target;
796 
797  /* skip calling target */
798  if (curr == target)
799  continue;
800  if (!target_was_examined(curr))
801  continue;
802  if (curr->state != TARGET_HALTED)
803  continue;
804 
805  /* resume at current address, not in step mode */
806  retval = aarch64_restore_one(curr, true, &address, handle_breakpoints,
807  false);
808  if (retval == ERROR_OK)
809  retval = aarch64_prepare_restart_one(curr);
810  if (retval != ERROR_OK) {
811  LOG_ERROR("failed to restore target %s", target_name(curr));
812  break;
813  }
814  /* remember the first valid target in the group */
815  if (!first)
816  first = curr;
817  }
818 
819  if (p_first)
820  *p_first = first;
821 
822  return retval;
823 }
824 
825 
827 {
828  int retval = ERROR_OK;
829  struct target_list *head;
830  struct target *first = NULL;
831 
832  LOG_DEBUG("%s", target_name(target));
833 
834  retval = aarch64_prep_restart_smp(target, false, &first);
835  if (retval != ERROR_OK)
836  return retval;
837 
838  if (first)
839  retval = aarch64_do_restart_one(first, RESTART_LAZY);
840  if (retval != ERROR_OK) {
841  LOG_DEBUG("error restarting target %s", target_name(first));
842  return retval;
843  }
844 
845  int64_t then = timeval_ms();
846  for (;;) {
847  struct target *curr = target;
848  bool all_resumed = true;
849 
851  uint32_t prsr;
852  int resumed;
853 
854  curr = head->target;
855 
856  if (curr == target)
857  continue;
858 
859  if (!target_was_examined(curr))
860  continue;
861 
862  retval = aarch64_check_state_one(curr,
863  PRSR_SDR, PRSR_SDR, &resumed, &prsr);
864  if (retval != ERROR_OK || (!resumed && (prsr & PRSR_HALT))) {
865  all_resumed = false;
866  break;
867  }
868 
869  if (curr->state != TARGET_RUNNING) {
870  curr->state = TARGET_RUNNING;
873  }
874  }
875 
876  if (all_resumed)
877  break;
878 
879  if (timeval_ms() > then + 1000) {
880  LOG_ERROR("%s: timeout waiting for target resume", __func__);
881  retval = ERROR_TARGET_TIMEOUT;
882  break;
883  }
884  /*
885  * HACK: on Hi6220 there are 8 cores organized in 2 clusters
886  * and it looks like the CTI's are not connected by a common
887  * trigger matrix. It seems that we need to halt one core in each
888  * cluster explicitly. So if we find that a core has not halted
889  * yet, we trigger an explicit resume for the second cluster.
890  */
891  retval = aarch64_do_restart_one(curr, RESTART_LAZY);
892  if (retval != ERROR_OK)
893  break;
894  }
895 
896  return retval;
897 }
898 
899 static int aarch64_resume(struct target *target, bool current,
900  target_addr_t address, bool handle_breakpoints, bool debug_execution)
901 {
902  int retval = 0;
903  uint64_t addr = address;
904 
905  struct armv8_common *armv8 = target_to_armv8(target);
907 
908  if (target->state != TARGET_HALTED) {
909  LOG_TARGET_ERROR(target, "not halted");
911  }
912 
913  /*
914  * If this target is part of a SMP group, prepare the others
915  * targets for resuming. This involves restoring the complete
916  * target register context and setting up CTI gates to accept
917  * resume events from the trigger matrix.
918  */
919  if (target->smp) {
920  retval = aarch64_prep_restart_smp(target, handle_breakpoints, NULL);
921  if (retval != ERROR_OK)
922  return retval;
923  }
924 
925  /* all targets prepared, restore and restart the current target */
926  retval = aarch64_restore_one(target, current, &addr, handle_breakpoints,
927  debug_execution);
928  if (retval == ERROR_OK)
930  if (retval != ERROR_OK)
931  return retval;
932 
933  if (target->smp) {
934  int64_t then = timeval_ms();
935  for (;;) {
936  struct target *curr = target;
937  struct target_list *head;
938  bool all_resumed = true;
939 
941  uint32_t prsr;
942  int resumed;
943 
944  curr = head->target;
945  if (curr == target)
946  continue;
947  if (!target_was_examined(curr))
948  continue;
949 
950  retval = aarch64_check_state_one(curr,
951  PRSR_SDR, PRSR_SDR, &resumed, &prsr);
952  if (retval != ERROR_OK || (!resumed && (prsr & PRSR_HALT))) {
953  all_resumed = false;
954  break;
955  }
956 
957  if (curr->state != TARGET_RUNNING) {
958  struct armv8_common *curr_armv8 = target_to_armv8(curr);
960  curr->state = TARGET_RUNNING;
963  }
964  }
965 
966  if (all_resumed)
967  break;
968 
969  if (timeval_ms() > then + 1000) {
970  LOG_ERROR("%s: timeout waiting for target %s to resume", __func__, target_name(curr));
971  retval = ERROR_TARGET_TIMEOUT;
972  break;
973  }
974 
975  /*
976  * HACK: on Hi6220 there are 8 cores organized in 2 clusters
977  * and it looks like the CTI's are not connected by a common
978  * trigger matrix. It seems that we need to halt one core in each
979  * cluster explicitly. So if we find that a core has not halted
980  * yet, we trigger an explicit resume for the second cluster.
981  */
982  retval = aarch64_do_restart_one(curr, RESTART_LAZY);
983  if (retval != ERROR_OK)
984  break;
985  }
986  }
987 
988  if (retval != ERROR_OK)
989  return retval;
990 
992 
993  if (!debug_execution) {
996  LOG_DEBUG("target resumed at 0x%" PRIx64, addr);
997  } else {
1000  LOG_DEBUG("target debug resumed at 0x%" PRIx64, addr);
1001  }
1002 
1003  return ERROR_OK;
1004 }
1005 
1006 static int aarch64_debug_entry(struct target *target)
1007 {
1008  int retval = ERROR_OK;
1009  struct armv8_common *armv8 = target_to_armv8(target);
1010  struct arm_dpm *dpm = &armv8->dpm;
1011  enum arm_state core_state;
1012  uint32_t dscr;
1013 
1014  /* make sure to clear all sticky errors */
1015  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
1016  armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
1017  if (retval == ERROR_OK)
1018  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
1019  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
1020  if (retval == ERROR_OK)
1021  retval = arm_cti_ack_events(armv8->cti, CTI_TRIG(HALT));
1022 
1023  if (retval != ERROR_OK)
1024  return retval;
1025 
1026  LOG_DEBUG("%s dscr = 0x%08" PRIx32, target_name(target), dscr);
1027 
1028  dpm->dscr = dscr;
1029  core_state = armv8_dpm_get_core_state(dpm);
1030  armv8_select_opcodes(armv8, core_state == ARM_STATE_AARCH64);
1031  armv8_select_reg_access(armv8, core_state == ARM_STATE_AARCH64);
1032 
1033  /* close the CTI gate for all events */
1034  if (retval == ERROR_OK)
1035  retval = arm_cti_write_reg(armv8->cti, CTI_GATE, 0);
1036  /* discard async exceptions */
1037  if (retval == ERROR_OK)
1038  retval = dpm->instr_cpsr_sync(dpm);
1039  if (retval != ERROR_OK)
1040  return retval;
1041 
1042  /* Examine debug reason */
1044 
1045  /* save the memory address that triggered the watchpoint */
1047  uint32_t tmp;
1048 
1049  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
1050  armv8->debug_base + CPUV8_DBG_EDWAR0, &tmp);
1051  if (retval != ERROR_OK)
1052  return retval;
1053  target_addr_t edwar = tmp;
1054 
1055  /* EDWAR[63:32] has unknown content in aarch32 state */
1056  if (core_state == ARM_STATE_AARCH64) {
1057  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
1058  armv8->debug_base + CPUV8_DBG_EDWAR1, &tmp);
1059  if (retval != ERROR_OK)
1060  return retval;
1061  edwar |= ((target_addr_t)tmp) << 32;
1062  }
1063 
1064  armv8->dpm.wp_addr = edwar;
1065  }
1066 
1067  retval = armv8_dpm_read_current_registers(&armv8->dpm);
1068 
1069  if (retval == ERROR_OK && armv8->post_debug_entry)
1070  retval = armv8->post_debug_entry(target);
1071 
1072  return retval;
1073 }
1074 
1076 {
1077  struct aarch64_common *aarch64 = target_to_aarch64(target);
1078  struct armv8_common *armv8 = &aarch64->armv8_common;
1079  int retval;
1080  enum arm_mode target_mode = ARM_MODE_ANY;
1081  uint32_t instr;
1082 
1083  switch (armv8->arm.core_mode) {
1084  case ARMV8_64_EL0T:
1085  target_mode = ARMV8_64_EL1H;
1086  /* fall through */
1087  case ARMV8_64_EL1T:
1088  case ARMV8_64_EL1H:
1089  instr = ARMV8_MRS(SYSTEM_SCTLR_EL1, 0);
1090  break;
1091  case ARMV8_64_EL2T:
1092  case ARMV8_64_EL2H:
1093  instr = ARMV8_MRS(SYSTEM_SCTLR_EL2, 0);
1094  break;
1095  case ARMV8_64_EL3H:
1096  case ARMV8_64_EL3T:
1097  instr = ARMV8_MRS(SYSTEM_SCTLR_EL3, 0);
1098  break;
1099 
1100  case ARM_MODE_SVC:
1101  case ARM_MODE_ABT:
1102  case ARM_MODE_FIQ:
1103  case ARM_MODE_IRQ:
1104  case ARM_MODE_HYP:
1105  case ARM_MODE_UND:
1106  case ARM_MODE_SYS:
1107  case ARM_MODE_MON:
1108  instr = ARMV4_5_MRC(15, 0, 0, 1, 0, 0);
1109  break;
1110 
1111  default:
1112  LOG_ERROR("cannot read system control register in this mode: (%s : 0x%x)",
1113  armv8_mode_name(armv8->arm.core_mode), armv8->arm.core_mode);
1114  return ERROR_FAIL;
1115  }
1116 
1117  if (target_mode != ARM_MODE_ANY)
1118  armv8_dpm_modeswitch(&armv8->dpm, target_mode);
1119 
1120  retval = armv8->dpm.instr_read_data_r0_64(&armv8->dpm, instr, &aarch64->system_control_reg);
1121  if (retval != ERROR_OK)
1122  return retval;
1123 
1124  if (target_mode != ARM_MODE_ANY)
1126 
1127  LOG_DEBUG("System_register: %8.8" PRIx64, aarch64->system_control_reg);
1128  aarch64->system_control_reg_curr = aarch64->system_control_reg;
1129 
1130  if (!armv8->armv8_mmu.armv8_cache.info_valid) {
1131  armv8_identify_cache(armv8);
1132  armv8_read_mpidr(armv8);
1133  }
1134  if (armv8->is_armv8r) {
1135  armv8->armv8_mmu.mmu_enabled = false;
1136  } else {
1137  armv8->armv8_mmu.mmu_enabled = aarch64->system_control_reg & 0x1U;
1138  }
1140  aarch64->system_control_reg & 0x4U;
1142  aarch64->system_control_reg & 0x1000U;
1143  return ERROR_OK;
1144 }
1145 
1146 /*
1147  * single-step a target
1148  */
1149 static int aarch64_step(struct target *target, bool current, target_addr_t address,
1150  bool handle_breakpoints)
1151 {
1152  struct armv8_common *armv8 = target_to_armv8(target);
1153  struct aarch64_common *aarch64 = target_to_aarch64(target);
1154  int saved_retval = ERROR_OK;
1155  int poll_retval;
1156  int retval;
1157  uint32_t edecr;
1158 
1160 
1161  if (target->state != TARGET_HALTED) {
1162  LOG_TARGET_ERROR(target, "not halted");
1163  return ERROR_TARGET_NOT_HALTED;
1164  }
1165 
1166  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
1167  armv8->debug_base + CPUV8_DBG_EDECR, &edecr);
1168  /* make sure EDECR.SS is not set when restoring the register */
1169 
1170  if (retval == ERROR_OK) {
1171  edecr &= ~0x4;
1172  /* set EDECR.SS to enter hardware step mode */
1173  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
1174  armv8->debug_base + CPUV8_DBG_EDECR, (edecr|0x4));
1175  }
1176  /* disable interrupts while stepping */
1177  if (retval == ERROR_OK && aarch64->isrmasking_mode == AARCH64_ISRMASK_ON)
1178  retval = aarch64_set_dscr_bits(target, 0x3 << 22, 0x3 << 22);
1179  /* bail out if stepping setup has failed */
1180  if (retval != ERROR_OK)
1181  return retval;
1182 
1183  if (target->smp && current) {
1184  /*
1185  * isolate current target so that it doesn't get resumed
1186  * together with the others
1187  */
1188  retval = arm_cti_gate_channel(armv8->cti, 1);
1189  /* resume all other targets in the group */
1190  if (retval == ERROR_OK)
1191  retval = aarch64_step_restart_smp(target);
1192  if (retval != ERROR_OK) {
1193  LOG_ERROR("Failed to restart non-stepping targets in SMP group");
1194  return retval;
1195  }
1196  LOG_DEBUG("Restarted all non-stepping targets in SMP group");
1197  }
1198 
1199  /* all other targets running, restore and restart the current target */
1200  retval = aarch64_restore_one(target, current, &address, false, false);
1201  if (retval == ERROR_OK)
1203 
1204  if (retval != ERROR_OK)
1205  return retval;
1206 
1207  LOG_DEBUG("target step-resumed at 0x%" PRIx64, address);
1208  if (!handle_breakpoints)
1210 
1211  int64_t then = timeval_ms();
1212  for (;;) {
1213  int stepped;
1214  uint32_t prsr;
1215 
1217  PRSR_SDR|PRSR_HALT, PRSR_SDR|PRSR_HALT, &stepped, &prsr);
1218  if (retval != ERROR_OK || stepped)
1219  break;
1220 
1221  if (timeval_ms() > then + 100) {
1222  LOG_ERROR("timeout waiting for target %s halt after step",
1223  target_name(target));
1224  retval = ERROR_TARGET_TIMEOUT;
1225  break;
1226  }
1227  }
1228 
1229  /*
1230  * At least on one SoC (Renesas R8A7795) stepping over a WFI instruction
1231  * causes a timeout. The core takes the step but doesn't complete it and so
1232  * debug state is never entered. However, you can manually halt the core
1233  * as an external debug even is also a WFI wakeup event.
1234  */
1235  if (retval == ERROR_TARGET_TIMEOUT)
1236  saved_retval = aarch64_halt_one(target, HALT_SYNC);
1237 
1238  poll_retval = aarch64_poll(target);
1239 
1240  /* restore EDECR */
1241  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
1242  armv8->debug_base + CPUV8_DBG_EDECR, edecr);
1243  if (retval != ERROR_OK)
1244  return retval;
1245 
1246  /* restore interrupts */
1247  if (aarch64->isrmasking_mode == AARCH64_ISRMASK_ON) {
1248  retval = aarch64_set_dscr_bits(target, 0x3 << 22, 0);
1249  if (retval != ERROR_OK)
1250  return ERROR_OK;
1251  }
1252 
1253  if (saved_retval != ERROR_OK)
1254  return saved_retval;
1255 
1256  if (poll_retval != ERROR_OK)
1257  return poll_retval;
1258 
1259  return ERROR_OK;
1260 }
1261 
1262 static int aarch64_restore_context(struct target *target, bool bpwp)
1263 {
1264  struct armv8_common *armv8 = target_to_armv8(target);
1265  struct arm *arm = &armv8->arm;
1266 
1267  int retval;
1268 
1269  LOG_DEBUG("%s", target_name(target));
1270 
1271  if (armv8->pre_restore_context)
1272  armv8->pre_restore_context(target);
1273 
1274  retval = armv8_dpm_write_dirty_registers(&armv8->dpm, bpwp);
1275  if (retval == ERROR_OK) {
1276  /* registers are now invalid */
1279  }
1280 
1281  return retval;
1282 }
1283 
1284 /*
1285  * Cortex-A8 Breakpoint and watchpoint functions
1286  */
1287 
1288 /* Setup hardware Breakpoint Register Pair */
1290  struct breakpoint *breakpoint, uint8_t matchmode)
1291 {
1292  int retval;
1293  int brp_i = 0;
1294  uint32_t control;
1295  uint8_t byte_addr_select = 0x0F;
1296  struct aarch64_common *aarch64 = target_to_aarch64(target);
1297  struct armv8_common *armv8 = &aarch64->armv8_common;
1298  struct aarch64_brp *brp_list = aarch64->brp_list;
1299 
1300  if (breakpoint->is_set) {
1301  LOG_WARNING("breakpoint already set");
1302  return ERROR_OK;
1303  }
1304 
1305  if (breakpoint->type == BKPT_HARD) {
1306  int64_t bpt_value;
1307  while (brp_list[brp_i].used && (brp_i < aarch64->brp_num))
1308  brp_i++;
1309  if (brp_i >= aarch64->brp_num) {
1310  LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1312  }
1313  breakpoint_hw_set(breakpoint, brp_i);
1314  if (breakpoint->length == 2)
1315  byte_addr_select = (3 << (breakpoint->address & 0x02));
1316  control = ((matchmode & 0x7) << 20)
1317  | (1 << 13)
1318  | (byte_addr_select << 5)
1319  | (3 << 1) | 1;
1320  brp_list[brp_i].used = 1;
1321  brp_list[brp_i].value = breakpoint->address & 0xFFFFFFFFFFFFFFFCULL;
1322  brp_list[brp_i].control = control;
1323  bpt_value = brp_list[brp_i].value;
1324 
1326  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
1327  (uint32_t)(bpt_value & 0xFFFFFFFF));
1328  if (retval != ERROR_OK)
1329  return retval;
1331  + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].brpn,
1332  (uint32_t)(bpt_value >> 32));
1333  if (retval != ERROR_OK)
1334  return retval;
1335 
1337  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
1338  brp_list[brp_i].control);
1339  if (retval != ERROR_OK)
1340  return retval;
1341  LOG_DEBUG("brp %i control 0x%0" PRIx32 " value 0x%" TARGET_PRIxADDR, brp_i,
1342  brp_list[brp_i].control,
1343  brp_list[brp_i].value);
1344 
1345  } else if (breakpoint->type == BKPT_SOFT) {
1346  uint32_t opcode;
1347  uint8_t code[4];
1348 
1350  opcode = ARMV8_HLT(11);
1351 
1352  if (breakpoint->length != 4)
1353  LOG_ERROR("bug: breakpoint length should be 4 in AArch64 mode");
1354  } else {
1363  opcode = (breakpoint->length == 4) ? ARMV8_HLT_A1(11) :
1364  (uint32_t) (ARMV8_HLT_T1(11) | ARMV8_HLT_T1(11) << 16);
1365 
1366  if (breakpoint->length == 3)
1367  breakpoint->length = 4;
1368  }
1369 
1370  buf_set_u32(code, 0, 32, opcode);
1371 
1372  retval = target_read_memory(target,
1373  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1374  breakpoint->length, 1,
1376  if (retval != ERROR_OK)
1377  return retval;
1378 
1380  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1381  breakpoint->length);
1382 
1383  retval = target_write_memory(target,
1384  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1385  breakpoint->length, 1, code);
1386  if (retval != ERROR_OK)
1387  return retval;
1388 
1390  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1391  breakpoint->length);
1392 
1394  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1395  breakpoint->length);
1396 
1397  breakpoint->is_set = true;
1398  }
1399 
1400  /* Ensure that halting debug mode is enable */
1402  if (retval != ERROR_OK) {
1403  LOG_DEBUG("Failed to set DSCR.HDE");
1404  return retval;
1405  }
1406 
1407  return ERROR_OK;
1408 }
1409 
1411  struct breakpoint *breakpoint, uint8_t matchmode)
1412 {
1413  int retval = ERROR_FAIL;
1414  int brp_i = 0;
1415  uint32_t control;
1416  uint8_t byte_addr_select = 0x0F;
1417  struct aarch64_common *aarch64 = target_to_aarch64(target);
1418  struct armv8_common *armv8 = &aarch64->armv8_common;
1419  struct aarch64_brp *brp_list = aarch64->brp_list;
1420 
1421  if (breakpoint->is_set) {
1422  LOG_WARNING("breakpoint already set");
1423  return retval;
1424  }
1425  /*check available context BRPs*/
1426  while ((brp_list[brp_i].used ||
1427  (brp_list[brp_i].type != BRP_CONTEXT)) && (brp_i < aarch64->brp_num))
1428  brp_i++;
1429 
1430  if (brp_i >= aarch64->brp_num) {
1431  LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1432  return ERROR_FAIL;
1433  }
1434 
1435  breakpoint_hw_set(breakpoint, brp_i);
1436  control = ((matchmode & 0x7) << 20)
1437  | (1 << 13)
1438  | (byte_addr_select << 5)
1439  | (3 << 1) | 1;
1440  brp_list[brp_i].used = 1;
1441  brp_list[brp_i].value = (breakpoint->asid);
1442  brp_list[brp_i].control = control;
1444  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
1445  brp_list[brp_i].value);
1446  if (retval != ERROR_OK)
1447  return retval;
1449  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
1450  brp_list[brp_i].control);
1451  if (retval != ERROR_OK)
1452  return retval;
1453  LOG_DEBUG("brp %i control 0x%0" PRIx32 " value 0x%" TARGET_PRIxADDR, brp_i,
1454  brp_list[brp_i].control,
1455  brp_list[brp_i].value);
1456  return ERROR_OK;
1457 
1458 }
1459 
1461 {
1462  int retval = ERROR_FAIL;
1463  int brp_1 = 0; /* holds the contextID pair */
1464  int brp_2 = 0; /* holds the IVA pair */
1465  uint32_t control_ctx, control_iva;
1466  uint8_t ctx_byte_addr_select = 0x0F;
1467  uint8_t iva_byte_addr_select = 0x0F;
1468  uint8_t ctx_machmode = 0x03;
1469  uint8_t iva_machmode = 0x01;
1470  struct aarch64_common *aarch64 = target_to_aarch64(target);
1471  struct armv8_common *armv8 = &aarch64->armv8_common;
1472  struct aarch64_brp *brp_list = aarch64->brp_list;
1473 
1474  if (breakpoint->is_set) {
1475  LOG_WARNING("breakpoint already set");
1476  return retval;
1477  }
1478  /*check available context BRPs*/
1479  while ((brp_list[brp_1].used ||
1480  (brp_list[brp_1].type != BRP_CONTEXT)) && (brp_1 < aarch64->brp_num))
1481  brp_1++;
1482 
1483  LOG_DEBUG("brp(CTX) found num: %d", brp_1);
1484  if (brp_1 >= aarch64->brp_num) {
1485  LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1486  return ERROR_FAIL;
1487  }
1488 
1489  while ((brp_list[brp_2].used ||
1490  (brp_list[brp_2].type != BRP_NORMAL)) && (brp_2 < aarch64->brp_num))
1491  brp_2++;
1492 
1493  LOG_DEBUG("brp(IVA) found num: %d", brp_2);
1494  if (brp_2 >= aarch64->brp_num) {
1495  LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1496  return ERROR_FAIL;
1497  }
1498 
1499  breakpoint_hw_set(breakpoint, brp_1);
1500  breakpoint->linked_brp = brp_2;
1501  control_ctx = ((ctx_machmode & 0x7) << 20)
1502  | (brp_2 << 16)
1503  | (0 << 14)
1504  | (ctx_byte_addr_select << 5)
1505  | (3 << 1) | 1;
1506  brp_list[brp_1].used = 1;
1507  brp_list[brp_1].value = (breakpoint->asid);
1508  brp_list[brp_1].control = control_ctx;
1510  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_1].brpn,
1511  brp_list[brp_1].value);
1512  if (retval != ERROR_OK)
1513  return retval;
1515  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_1].brpn,
1516  brp_list[brp_1].control);
1517  if (retval != ERROR_OK)
1518  return retval;
1519 
1520  control_iva = ((iva_machmode & 0x7) << 20)
1521  | (brp_1 << 16)
1522  | (1 << 13)
1523  | (iva_byte_addr_select << 5)
1524  | (3 << 1) | 1;
1525  brp_list[brp_2].used = 1;
1526  brp_list[brp_2].value = breakpoint->address & 0xFFFFFFFFFFFFFFFCULL;
1527  brp_list[brp_2].control = control_iva;
1529  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_2].brpn,
1530  brp_list[brp_2].value & 0xFFFFFFFF);
1531  if (retval != ERROR_OK)
1532  return retval;
1534  + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_2].brpn,
1535  brp_list[brp_2].value >> 32);
1536  if (retval != ERROR_OK)
1537  return retval;
1539  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_2].brpn,
1540  brp_list[brp_2].control);
1541  if (retval != ERROR_OK)
1542  return retval;
1543 
1544  return ERROR_OK;
1545 }
1546 
1548 {
1549  int retval;
1550  struct aarch64_common *aarch64 = target_to_aarch64(target);
1551  struct armv8_common *armv8 = &aarch64->armv8_common;
1552  struct aarch64_brp *brp_list = aarch64->brp_list;
1553 
1554  if (!breakpoint->is_set) {
1555  LOG_WARNING("breakpoint not set");
1556  return ERROR_OK;
1557  }
1558 
1559  if (breakpoint->type == BKPT_HARD) {
1560  if ((breakpoint->address != 0) && (breakpoint->asid != 0)) {
1561  int brp_i = breakpoint->number;
1562  int brp_j = breakpoint->linked_brp;
1563  if (brp_i >= aarch64->brp_num) {
1564  LOG_DEBUG("Invalid BRP number in breakpoint");
1565  return ERROR_OK;
1566  }
1567  LOG_DEBUG("rbp %i control 0x%0" PRIx32 " value 0x%" TARGET_PRIxADDR, brp_i,
1568  brp_list[brp_i].control, brp_list[brp_i].value);
1569  brp_list[brp_i].used = 0;
1570  brp_list[brp_i].value = 0;
1571  brp_list[brp_i].control = 0;
1573  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
1574  brp_list[brp_i].control);
1575  if (retval != ERROR_OK)
1576  return retval;
1578  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
1579  (uint32_t)brp_list[brp_i].value);
1580  if (retval != ERROR_OK)
1581  return retval;
1583  + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].brpn,
1584  (uint32_t)brp_list[brp_i].value);
1585  if (retval != ERROR_OK)
1586  return retval;
1587  if ((brp_j < 0) || (brp_j >= aarch64->brp_num)) {
1588  LOG_DEBUG("Invalid BRP number in breakpoint");
1589  return ERROR_OK;
1590  }
1591  LOG_DEBUG("rbp %i control 0x%0" PRIx32 " value 0x%0" PRIx64, brp_j,
1592  brp_list[brp_j].control, brp_list[brp_j].value);
1593  brp_list[brp_j].used = 0;
1594  brp_list[brp_j].value = 0;
1595  brp_list[brp_j].control = 0;
1597  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_j].brpn,
1598  brp_list[brp_j].control);
1599  if (retval != ERROR_OK)
1600  return retval;
1602  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_j].brpn,
1603  (uint32_t)brp_list[brp_j].value);
1604  if (retval != ERROR_OK)
1605  return retval;
1607  + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_j].brpn,
1608  (uint32_t)brp_list[brp_j].value);
1609  if (retval != ERROR_OK)
1610  return retval;
1611 
1612  breakpoint->linked_brp = 0;
1613  breakpoint->is_set = false;
1614  return ERROR_OK;
1615 
1616  } else {
1617  int brp_i = breakpoint->number;
1618  if (brp_i >= aarch64->brp_num) {
1619  LOG_DEBUG("Invalid BRP number in breakpoint");
1620  return ERROR_OK;
1621  }
1622  LOG_DEBUG("rbp %i control 0x%0" PRIx32 " value 0x%0" PRIx64, brp_i,
1623  brp_list[brp_i].control, brp_list[brp_i].value);
1624  brp_list[brp_i].used = 0;
1625  brp_list[brp_i].value = 0;
1626  brp_list[brp_i].control = 0;
1628  + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
1629  brp_list[brp_i].control);
1630  if (retval != ERROR_OK)
1631  return retval;
1633  + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
1634  brp_list[brp_i].value);
1635  if (retval != ERROR_OK)
1636  return retval;
1637 
1639  + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].brpn,
1640  (uint32_t)brp_list[brp_i].value);
1641  if (retval != ERROR_OK)
1642  return retval;
1643  breakpoint->is_set = false;
1644  return ERROR_OK;
1645  }
1646  } else {
1647  /* restore original instruction (kept in target endianness) */
1648 
1650  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1651  breakpoint->length);
1652 
1653  if (breakpoint->length == 4) {
1654  retval = target_write_memory(target,
1655  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1656  4, 1, breakpoint->orig_instr);
1657  if (retval != ERROR_OK)
1658  return retval;
1659  } else {
1660  retval = target_write_memory(target,
1661  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1662  2, 1, breakpoint->orig_instr);
1663  if (retval != ERROR_OK)
1664  return retval;
1665  }
1666 
1668  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1669  breakpoint->length);
1670 
1672  breakpoint->address & 0xFFFFFFFFFFFFFFFEULL,
1673  breakpoint->length);
1674  }
1675  breakpoint->is_set = false;
1676 
1677  return ERROR_OK;
1678 }
1679 
1681  struct breakpoint *breakpoint)
1682 {
1683  struct aarch64_common *aarch64 = target_to_aarch64(target);
1684 
1685  if ((breakpoint->type == BKPT_HARD) && (aarch64->brp_num_available < 1)) {
1686  LOG_INFO("no hardware breakpoint available");
1688  }
1689 
1690  if (breakpoint->type == BKPT_HARD)
1691  aarch64->brp_num_available--;
1692 
1693  return aarch64_set_breakpoint(target, breakpoint, 0x00); /* Exact match */
1694 }
1695 
1697  struct breakpoint *breakpoint)
1698 {
1699  struct aarch64_common *aarch64 = target_to_aarch64(target);
1700 
1701  if ((breakpoint->type == BKPT_HARD) && (aarch64->brp_num_available < 1)) {
1702  LOG_INFO("no hardware breakpoint available");
1704  }
1705 
1706  if (breakpoint->type == BKPT_HARD)
1707  aarch64->brp_num_available--;
1708 
1709  return aarch64_set_context_breakpoint(target, breakpoint, 0x02); /* asid match */
1710 }
1711 
1713  struct breakpoint *breakpoint)
1714 {
1715  struct aarch64_common *aarch64 = target_to_aarch64(target);
1716 
1717  if ((breakpoint->type == BKPT_HARD) && (aarch64->brp_num_available < 1)) {
1718  LOG_INFO("no hardware breakpoint available");
1720  }
1721 
1722  if (breakpoint->type == BKPT_HARD)
1723  aarch64->brp_num_available--;
1724 
1725  return aarch64_set_hybrid_breakpoint(target, breakpoint); /* ??? */
1726 }
1727 
1729 {
1730  struct aarch64_common *aarch64 = target_to_aarch64(target);
1731 
1732 #if 0
1733 /* It is perfectly possible to remove breakpoints while the target is running */
1734  if (target->state != TARGET_HALTED) {
1735  LOG_WARNING("target not halted");
1736  return ERROR_TARGET_NOT_HALTED;
1737  }
1738 #endif
1739 
1740  if (breakpoint->is_set) {
1742  if (breakpoint->type == BKPT_HARD)
1743  aarch64->brp_num_available++;
1744  }
1745 
1746  return ERROR_OK;
1747 }
1748 
1749 /* Setup hardware Watchpoint Register Pair */
1751  struct watchpoint *watchpoint)
1752 {
1753  int retval;
1754  int wp_i = 0;
1755  uint32_t control, offset, length;
1756  struct aarch64_common *aarch64 = target_to_aarch64(target);
1757  struct armv8_common *armv8 = &aarch64->armv8_common;
1758  struct aarch64_brp *wp_list = aarch64->wp_list;
1759 
1760  if (watchpoint->is_set) {
1761  LOG_WARNING("watchpoint already set");
1762  return ERROR_OK;
1763  }
1764 
1765  while (wp_list[wp_i].used && (wp_i < aarch64->wp_num))
1766  wp_i++;
1767  if (wp_i >= aarch64->wp_num) {
1768  LOG_ERROR("ERROR Can not find free Watchpoint Register Pair");
1770  }
1771 
1772  control = (1 << 0) /* enable */
1773  | (3 << 1) /* both user and privileged access */
1774  | (1 << 13); /* higher mode control */
1775 
1776  switch (watchpoint->rw) {
1777  case WPT_READ:
1778  control |= 1 << 3;
1779  break;
1780  case WPT_WRITE:
1781  control |= 2 << 3;
1782  break;
1783  case WPT_ACCESS:
1784  control |= 3 << 3;
1785  break;
1786  }
1787 
1788  /* Match up to 8 bytes. */
1789  offset = watchpoint->address & 7;
1791  if (offset + length > sizeof(uint64_t)) {
1792  length = sizeof(uint64_t) - offset;
1793  LOG_WARNING("Adjust watchpoint match inside 8-byte boundary");
1794  }
1795  for (; length > 0; offset++, length--)
1796  control |= (1 << offset) << 5;
1797 
1798  wp_list[wp_i].value = watchpoint->address & 0xFFFFFFFFFFFFFFF8ULL;
1799  wp_list[wp_i].control = control;
1800 
1802  + CPUV8_DBG_WVR_BASE + 16 * wp_list[wp_i].brpn,
1803  (uint32_t)(wp_list[wp_i].value & 0xFFFFFFFF));
1804  if (retval != ERROR_OK)
1805  return retval;
1807  + CPUV8_DBG_WVR_BASE + 4 + 16 * wp_list[wp_i].brpn,
1808  (uint32_t)(wp_list[wp_i].value >> 32));
1809  if (retval != ERROR_OK)
1810  return retval;
1811 
1813  + CPUV8_DBG_WCR_BASE + 16 * wp_list[wp_i].brpn,
1814  control);
1815  if (retval != ERROR_OK)
1816  return retval;
1817  LOG_DEBUG("wp %i control 0x%0" PRIx32 " value 0x%" TARGET_PRIxADDR, wp_i,
1818  wp_list[wp_i].control, wp_list[wp_i].value);
1819 
1820  /* Ensure that halting debug mode is enable */
1822  if (retval != ERROR_OK) {
1823  LOG_DEBUG("Failed to set DSCR.HDE");
1824  return retval;
1825  }
1826 
1827  wp_list[wp_i].used = 1;
1828  watchpoint_set(watchpoint, wp_i);
1829 
1830  return ERROR_OK;
1831 }
1832 
1833 /* Clear hardware Watchpoint Register Pair */
1835  struct watchpoint *watchpoint)
1836 {
1837  int retval;
1838  struct aarch64_common *aarch64 = target_to_aarch64(target);
1839  struct armv8_common *armv8 = &aarch64->armv8_common;
1840  struct aarch64_brp *wp_list = aarch64->wp_list;
1841 
1842  if (!watchpoint->is_set) {
1843  LOG_WARNING("watchpoint not set");
1844  return ERROR_OK;
1845  }
1846 
1847  int wp_i = watchpoint->number;
1848  if (wp_i >= aarch64->wp_num) {
1849  LOG_DEBUG("Invalid WP number in watchpoint");
1850  return ERROR_OK;
1851  }
1852  LOG_DEBUG("rwp %i control 0x%0" PRIx32 " value 0x%0" PRIx64, wp_i,
1853  wp_list[wp_i].control, wp_list[wp_i].value);
1854  wp_list[wp_i].used = 0;
1855  wp_list[wp_i].value = 0;
1856  wp_list[wp_i].control = 0;
1858  + CPUV8_DBG_WCR_BASE + 16 * wp_list[wp_i].brpn,
1859  wp_list[wp_i].control);
1860  if (retval != ERROR_OK)
1861  return retval;
1863  + CPUV8_DBG_WVR_BASE + 16 * wp_list[wp_i].brpn,
1864  wp_list[wp_i].value);
1865  if (retval != ERROR_OK)
1866  return retval;
1867 
1869  + CPUV8_DBG_WVR_BASE + 4 + 16 * wp_list[wp_i].brpn,
1870  (uint32_t)wp_list[wp_i].value);
1871  if (retval != ERROR_OK)
1872  return retval;
1873  watchpoint->is_set = false;
1874 
1875  return ERROR_OK;
1876 }
1877 
1879  struct watchpoint *watchpoint)
1880 {
1881  int retval;
1882  struct aarch64_common *aarch64 = target_to_aarch64(target);
1883 
1884  if (aarch64->wp_num_available < 1) {
1885  LOG_INFO("no hardware watchpoint available");
1887  }
1888 
1890  if (retval == ERROR_OK)
1891  aarch64->wp_num_available--;
1892 
1893  return retval;
1894 }
1895 
1897  struct watchpoint *watchpoint)
1898 {
1899  struct aarch64_common *aarch64 = target_to_aarch64(target);
1900 
1901  if (watchpoint->is_set) {
1903  aarch64->wp_num_available++;
1904  }
1905 
1906  return ERROR_OK;
1907 }
1908 
1914  struct watchpoint **hit_watchpoint)
1915 {
1917  return ERROR_FAIL;
1918 
1919  struct armv8_common *armv8 = target_to_armv8(target);
1920 
1921  target_addr_t exception_address;
1922  struct watchpoint *wp;
1923 
1924  exception_address = armv8->dpm.wp_addr;
1925 
1926  if (exception_address == 0xFFFFFFFF)
1927  return ERROR_FAIL;
1928 
1929  for (wp = target->watchpoints; wp; wp = wp->next)
1930  if (exception_address >= wp->address && exception_address < (wp->address + wp->length)) {
1931  *hit_watchpoint = wp;
1932  return ERROR_OK;
1933  }
1934 
1935  return ERROR_FAIL;
1936 }
1937 
1938 /*
1939  * Cortex-A8 Reset functions
1940  */
1941 
1942 static int aarch64_enable_reset_catch(struct target *target, bool enable)
1943 {
1944  struct armv8_common *armv8 = target_to_armv8(target);
1945  uint32_t edecr;
1946  int retval;
1947 
1948  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
1949  armv8->debug_base + CPUV8_DBG_EDECR, &edecr);
1950  LOG_DEBUG("EDECR = 0x%08" PRIx32 ", enable=%d", edecr, enable);
1951  if (retval != ERROR_OK)
1952  return retval;
1953 
1954  if (enable)
1955  edecr |= ECR_RCE;
1956  else
1957  edecr &= ~ECR_RCE;
1958 
1959  return mem_ap_write_atomic_u32(armv8->debug_ap,
1960  armv8->debug_base + CPUV8_DBG_EDECR, edecr);
1961 }
1962 
1964 {
1965  struct armv8_common *armv8 = target_to_armv8(target);
1966  uint32_t edesr;
1967  int retval;
1968  bool was_triggered;
1969 
1970  /* check if Reset Catch debug event triggered as expected */
1971  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
1972  armv8->debug_base + CPUV8_DBG_EDESR, &edesr);
1973  if (retval != ERROR_OK)
1974  return retval;
1975 
1976  was_triggered = !!(edesr & ESR_RC);
1977  LOG_DEBUG("Reset Catch debug event %s",
1978  was_triggered ? "triggered" : "NOT triggered!");
1979 
1980  if (was_triggered) {
1981  /* clear pending Reset Catch debug event */
1982  edesr &= ~ESR_RC;
1983  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
1984  armv8->debug_base + CPUV8_DBG_EDESR, edesr);
1985  if (retval != ERROR_OK)
1986  return retval;
1987  }
1988 
1989  return ERROR_OK;
1990 }
1991 
1993 {
1994  struct armv8_common *armv8 = target_to_armv8(target);
1995  enum reset_types reset_config = jtag_get_reset_config();
1996  int retval;
1997 
1998  LOG_DEBUG(" ");
1999 
2000  /* Issue some kind of warm reset. */
2003  else if (reset_config & RESET_HAS_SRST) {
2004  bool srst_asserted = false;
2005 
2006  if (target->reset_halt && !(reset_config & RESET_SRST_PULLS_TRST)) {
2007  if (target_was_examined(target)) {
2008 
2009  if (reset_config & RESET_SRST_NO_GATING) {
2010  /*
2011  * SRST needs to be asserted *before* Reset Catch
2012  * debug event can be set up.
2013  */
2015  srst_asserted = true;
2016  }
2017 
2018  /* make sure to clear all sticky errors */
2020  armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
2021 
2022  /* set up Reset Catch debug event to halt the CPU after reset */
2023  retval = aarch64_enable_reset_catch(target, true);
2024  if (retval != ERROR_OK)
2025  LOG_WARNING("%s: Error enabling Reset Catch debug event; the CPU will not halt immediately after reset!",
2026  target_name(target));
2027  } else {
2028  LOG_WARNING("%s: Target not examined, will not halt immediately after reset!",
2029  target_name(target));
2030  }
2031  }
2032 
2033  /* REVISIT handle "pulls" cases, if there's
2034  * hardware that needs them to work.
2035  */
2036  if (!srst_asserted)
2038  } else {
2039  LOG_ERROR("%s: how to reset?", target_name(target));
2040  return ERROR_FAIL;
2041  }
2042 
2043  /* registers are now invalid */
2044  if (armv8->arm.core_cache) {
2047  }
2048 
2050 
2051  return ERROR_OK;
2052 }
2053 
2055 {
2056  int retval;
2057 
2058  LOG_DEBUG(" ");
2059 
2060  /* be certain SRST is off */
2062 
2064  return ERROR_OK;
2065 
2067  if (retval != ERROR_OK)
2068  return retval;
2069 
2070  retval = aarch64_poll(target);
2071  if (retval != ERROR_OK)
2072  return retval;
2073 
2074  if (target->reset_halt) {
2075  /* clear pending Reset Catch debug event */
2077  if (retval != ERROR_OK)
2078  LOG_WARNING("%s: Clearing Reset Catch debug event failed",
2079  target_name(target));
2080 
2081  /* disable Reset Catch debug event */
2082  retval = aarch64_enable_reset_catch(target, false);
2083  if (retval != ERROR_OK)
2084  LOG_WARNING("%s: Disabling Reset Catch debug event failed",
2085  target_name(target));
2086 
2087  if (target->state != TARGET_HALTED) {
2088  LOG_WARNING("%s: ran after reset and before halt ...",
2089  target_name(target));
2090  if (target_was_examined(target)) {
2091  retval = aarch64_halt_one(target, HALT_LAZY);
2092  if (retval != ERROR_OK)
2093  return retval;
2094  } else {
2096  }
2097  }
2098  }
2099 
2100  return ERROR_OK;
2101 }
2102 
2104  uint32_t size, uint32_t count, const uint8_t *buffer, uint32_t *dscr)
2105 {
2106  struct armv8_common *armv8 = target_to_armv8(target);
2107  struct arm_dpm *dpm = &armv8->dpm;
2108  struct arm *arm = &armv8->arm;
2109  int retval;
2110 
2111  if (size > 4 && arm->core_state != ARM_STATE_AARCH64) {
2112  LOG_ERROR("memory write sizes greater than 4 bytes is only supported for AArch64 state");
2113  return ERROR_FAIL;
2114  }
2115 
2116  armv8_reg_current(arm, 1)->dirty = true;
2117 
2118  /* change DCC to normal mode if necessary */
2119  if (*dscr & DSCR_MA) {
2120  *dscr &= ~DSCR_MA;
2121  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2122  armv8->debug_base + CPUV8_DBG_DSCR, *dscr);
2123  if (retval != ERROR_OK)
2124  return retval;
2125  }
2126 
2127  while (count) {
2128  uint32_t opcode;
2129  uint64_t data;
2130 
2131  /* write the data to store into DTRRX (and DTRTX for 64-bit) */
2132  if (size == 1)
2133  data = *buffer;
2134  else if (size == 2)
2136  else if (size == 4)
2138  else
2140 
2141  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2142  armv8->debug_base + CPUV8_DBG_DTRRX, (uint32_t)data);
2143  if (retval == ERROR_OK && size > 4)
2144  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2145  armv8->debug_base + CPUV8_DBG_DTRTX, (uint32_t)(data >> 32));
2146  if (retval != ERROR_OK)
2147  return retval;
2148 
2150  if (size <= 4)
2152  else
2154  else
2155  retval = dpm->instr_execute(dpm, ARMV4_5_MRC(14, 0, 1, 0, 5, 0));
2156  if (retval != ERROR_OK)
2157  return retval;
2158 
2159  if (size == 1)
2160  opcode = armv8_opcode(armv8, ARMV8_OPC_STRB_IP);
2161  else if (size == 2)
2162  opcode = armv8_opcode(armv8, ARMV8_OPC_STRH_IP);
2163  else if (size == 4)
2164  opcode = armv8_opcode(armv8, ARMV8_OPC_STRW_IP);
2165  else
2166  opcode = armv8_opcode(armv8, ARMV8_OPC_STRD_IP);
2167 
2168  retval = dpm->instr_execute(dpm, opcode);
2169  if (retval != ERROR_OK)
2170  return retval;
2171 
2172  /* Advance */
2173  buffer += size;
2174  --count;
2175  }
2176 
2177  return ERROR_OK;
2178 }
2179 
2181  uint32_t count, const uint8_t *buffer, uint32_t *dscr)
2182 {
2183  struct armv8_common *armv8 = target_to_armv8(target);
2184  struct arm *arm = &armv8->arm;
2185  int retval;
2186 
2187  armv8_reg_current(arm, 1)->dirty = true;
2188 
2189  /* Step 1.d - Change DCC to memory mode */
2190  *dscr |= DSCR_MA;
2191  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2192  armv8->debug_base + CPUV8_DBG_DSCR, *dscr);
2193  if (retval != ERROR_OK)
2194  return retval;
2195 
2196 
2197  /* Step 2.a - Do the write */
2198  retval = mem_ap_write_buf_noincr(armv8->debug_ap,
2199  buffer, 4, count, armv8->debug_base + CPUV8_DBG_DTRRX);
2200  if (retval != ERROR_OK)
2201  return retval;
2202 
2203  /* Step 3.a - Switch DTR mode back to Normal mode */
2204  *dscr &= ~DSCR_MA;
2205  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2206  armv8->debug_base + CPUV8_DBG_DSCR, *dscr);
2207  if (retval != ERROR_OK)
2208  return retval;
2209 
2210  return ERROR_OK;
2211 }
2212 
2214  uint64_t address, uint32_t size,
2215  uint32_t count, const uint8_t *buffer)
2216 {
2217  /* write memory through APB-AP */
2218  int retval = ERROR_COMMAND_SYNTAX_ERROR;
2219  struct armv8_common *armv8 = target_to_armv8(target);
2220  struct arm_dpm *dpm = &armv8->dpm;
2221  struct arm *arm = &armv8->arm;
2222  uint32_t dscr;
2223 
2224  if (target->state != TARGET_HALTED) {
2225  LOG_TARGET_ERROR(target, "not halted");
2226  return ERROR_TARGET_NOT_HALTED;
2227  }
2228 
2229  /* Mark register X0 as dirty, as it will be used
2230  * for transferring the data.
2231  * It will be restored automatically when exiting
2232  * debug mode
2233  */
2234  armv8_reg_current(arm, 0)->dirty = true;
2235 
2236  /* This algorithm comes from DDI0487A.g, chapter J9.1 */
2237 
2238  /* Read DSCR */
2239  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2240  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2241  if (retval != ERROR_OK)
2242  return retval;
2243 
2244  /* Set Normal access mode */
2245  dscr = (dscr & ~DSCR_MA);
2246  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2247  armv8->debug_base + CPUV8_DBG_DSCR, dscr);
2248  if (retval != ERROR_OK)
2249  return retval;
2250 
2251  if (arm->core_state == ARM_STATE_AARCH64) {
2252  /* Write X0 with value 'address' using write procedure */
2253  /* Step 1.a+b - Write the address for read access into DBGDTR_EL0 */
2254  /* Step 1.c - Copy value from DTR to R0 using instruction mrs DBGDTR_EL0, x0 */
2255  retval = dpm->instr_write_data_dcc_64(dpm,
2257  } else {
2258  /* Write R0 with value 'address' using write procedure */
2259  /* Step 1.a+b - Write the address for read access into DBGDTRRX */
2260  /* Step 1.c - Copy value from DTR to R0 using instruction mrc DBGDTRTXint, r0 */
2261  retval = dpm->instr_write_data_dcc(dpm,
2262  ARMV4_5_MRC(14, 0, 0, 0, 5, 0), address);
2263  }
2264 
2265  if (retval != ERROR_OK)
2266  return retval;
2267 
2268  if (size == 4 && (address % 4) == 0)
2269  retval = aarch64_write_cpu_memory_fast(target, count, buffer, &dscr);
2270  else
2272 
2273  if (retval != ERROR_OK) {
2274  /* Unset DTR mode */
2276  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2277  dscr &= ~DSCR_MA;
2279  armv8->debug_base + CPUV8_DBG_DSCR, dscr);
2280  }
2281 
2282  /* Check for sticky abort flags in the DSCR */
2283  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2284  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2285  if (retval != ERROR_OK)
2286  return retval;
2287 
2288  dpm->dscr = dscr;
2289  if (dscr & (DSCR_ERR | DSCR_SYS_ERROR_PEND)) {
2290  /* Abort occurred - clear it and exit */
2291  LOG_ERROR("abort occurred - dscr = 0x%08" PRIx32, dscr);
2293  return ERROR_FAIL;
2294  }
2295 
2296  /* Done */
2297  return ERROR_OK;
2298 }
2299 
2301  uint32_t size, uint32_t count, uint8_t *buffer, uint32_t *dscr)
2302 {
2303  struct armv8_common *armv8 = target_to_armv8(target);
2304  struct arm_dpm *dpm = &armv8->dpm;
2305  struct arm *arm = &armv8->arm;
2306  int retval;
2307 
2308  if (size > 4 && arm->core_state != ARM_STATE_AARCH64) {
2309  LOG_ERROR("memory read sizes greater than 4 bytes is only supported for AArch64 state");
2310  return ERROR_FAIL;
2311  }
2312 
2313  armv8_reg_current(arm, 1)->dirty = true;
2314 
2315  /* change DCC to normal mode (if necessary) */
2316  if (*dscr & DSCR_MA) {
2317  *dscr &= DSCR_MA;
2318  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2319  armv8->debug_base + CPUV8_DBG_DSCR, *dscr);
2320  if (retval != ERROR_OK)
2321  return retval;
2322  }
2323 
2324  while (count) {
2325  uint32_t opcode;
2326  uint32_t lower;
2327  uint32_t higher;
2328  uint64_t data;
2329 
2330  if (size == 1)
2331  opcode = armv8_opcode(armv8, ARMV8_OPC_LDRB_IP);
2332  else if (size == 2)
2333  opcode = armv8_opcode(armv8, ARMV8_OPC_LDRH_IP);
2334  else if (size == 4)
2335  opcode = armv8_opcode(armv8, ARMV8_OPC_LDRW_IP);
2336  else
2337  opcode = armv8_opcode(armv8, ARMV8_OPC_LDRD_IP);
2338 
2339  retval = dpm->instr_execute(dpm, opcode);
2340  if (retval != ERROR_OK)
2341  return retval;
2342 
2344  if (size <= 4)
2346  else
2348  else
2349  retval = dpm->instr_execute(dpm, ARMV4_5_MCR(14, 0, 1, 0, 5, 0));
2350  if (retval != ERROR_OK)
2351  return retval;
2352 
2353  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2354  armv8->debug_base + CPUV8_DBG_DTRTX, &lower);
2355  if (retval == ERROR_OK) {
2356  if (size > 4)
2357  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2358  armv8->debug_base + CPUV8_DBG_DTRRX, &higher);
2359  else
2360  higher = 0;
2361  }
2362  if (retval != ERROR_OK)
2363  return retval;
2364 
2365  data = (uint64_t)lower | (uint64_t)higher << 32;
2366 
2367  if (size == 1)
2368  *buffer = (uint8_t)data;
2369  else if (size == 2)
2370  target_buffer_set_u16(target, buffer, (uint16_t)data);
2371  else if (size == 4)
2372  target_buffer_set_u32(target, buffer, (uint32_t)data);
2373  else
2375 
2376  /* Advance */
2377  buffer += size;
2378  --count;
2379  }
2380 
2381  return ERROR_OK;
2382 }
2383 
2385  uint32_t count, uint8_t *buffer, uint32_t *dscr)
2386 {
2387  struct armv8_common *armv8 = target_to_armv8(target);
2388  struct arm_dpm *dpm = &armv8->dpm;
2389  struct arm *arm = &armv8->arm;
2390  int retval;
2391  uint32_t value;
2392 
2393  /* Mark X1 as dirty */
2394  armv8_reg_current(arm, 1)->dirty = true;
2395 
2396  if (arm->core_state == ARM_STATE_AARCH64) {
2397  /* Step 1.d - Dummy operation to ensure EDSCR.Txfull == 1 */
2399  } else {
2400  /* Step 1.d - Dummy operation to ensure EDSCR.Txfull == 1 */
2401  retval = dpm->instr_execute(dpm, ARMV4_5_MCR(14, 0, 0, 0, 5, 0));
2402  }
2403 
2404  if (retval != ERROR_OK)
2405  return retval;
2406 
2407  /* Step 1.e - Change DCC to memory mode */
2408  *dscr |= DSCR_MA;
2409  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2410  armv8->debug_base + CPUV8_DBG_DSCR, *dscr);
2411  if (retval != ERROR_OK)
2412  return retval;
2413 
2414  /* Step 1.f - read DBGDTRTX and discard the value */
2415  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2416  armv8->debug_base + CPUV8_DBG_DTRTX, &value);
2417  if (retval != ERROR_OK)
2418  return retval;
2419 
2420  count--;
2421  /* Read the data - Each read of the DTRTX register causes the instruction to be reissued
2422  * Abort flags are sticky, so can be read at end of transactions
2423  *
2424  * This data is read in aligned to 32 bit boundary.
2425  */
2426 
2427  if (count) {
2428  /* Step 2.a - Loop n-1 times, each read of DBGDTRTX reads the data from [X0] and
2429  * increments X0 by 4. */
2430  retval = mem_ap_read_buf_noincr(armv8->debug_ap, buffer, 4, count,
2431  armv8->debug_base + CPUV8_DBG_DTRTX);
2432  if (retval != ERROR_OK)
2433  return retval;
2434  }
2435 
2436  /* Step 3.a - set DTR access mode back to Normal mode */
2437  *dscr &= ~DSCR_MA;
2438  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2439  armv8->debug_base + CPUV8_DBG_DSCR, *dscr);
2440  if (retval != ERROR_OK)
2441  return retval;
2442 
2443  /* Step 3.b - read DBGDTRTX for the final value */
2444  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2445  armv8->debug_base + CPUV8_DBG_DTRTX, &value);
2446  if (retval != ERROR_OK)
2447  return retval;
2448 
2449  target_buffer_set_u32(target, buffer + count * 4, value);
2450  return retval;
2451 }
2452 
2454  target_addr_t address, uint32_t size,
2455  uint32_t count, uint8_t *buffer)
2456 {
2457  /* read memory through APB-AP */
2458  int retval = ERROR_COMMAND_SYNTAX_ERROR;
2459  struct armv8_common *armv8 = target_to_armv8(target);
2460  struct arm_dpm *dpm = &armv8->dpm;
2461  struct arm *arm = &armv8->arm;
2462  uint32_t dscr;
2463 
2464  LOG_DEBUG("Reading CPU memory address 0x%016" PRIx64 " size %" PRIu32 " count %" PRIu32,
2465  address, size, count);
2466 
2467  if (target->state != TARGET_HALTED) {
2468  LOG_TARGET_ERROR(target, "not halted");
2469  return ERROR_TARGET_NOT_HALTED;
2470  }
2471 
2472  /* Mark register X0 as dirty, as it will be used
2473  * for transferring the data.
2474  * It will be restored automatically when exiting
2475  * debug mode
2476  */
2477  armv8_reg_current(arm, 0)->dirty = true;
2478 
2479  /* Read DSCR */
2480  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2481  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2482  if (retval != ERROR_OK)
2483  return retval;
2484 
2485  /* This algorithm comes from DDI0487A.g, chapter J9.1 */
2486 
2487  /* Set Normal access mode */
2488  dscr &= ~DSCR_MA;
2489  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2490  armv8->debug_base + CPUV8_DBG_DSCR, dscr);
2491  if (retval != ERROR_OK)
2492  return retval;
2493 
2494  if (arm->core_state == ARM_STATE_AARCH64) {
2495  /* Write X0 with value 'address' using write procedure */
2496  /* Step 1.a+b - Write the address for read access into DBGDTR_EL0 */
2497  /* Step 1.c - Copy value from DTR to R0 using instruction mrs DBGDTR_EL0, x0 */
2498  retval = dpm->instr_write_data_dcc_64(dpm,
2500  } else {
2501  /* Write R0 with value 'address' using write procedure */
2502  /* Step 1.a+b - Write the address for read access into DBGDTRRXint */
2503  /* Step 1.c - Copy value from DTR to R0 using instruction mrc DBGDTRTXint, r0 */
2504  retval = dpm->instr_write_data_dcc(dpm,
2505  ARMV4_5_MRC(14, 0, 0, 0, 5, 0), address);
2506  }
2507 
2508  if (retval != ERROR_OK)
2509  return retval;
2510 
2511  if (size == 4 && (address % 4) == 0)
2512  retval = aarch64_read_cpu_memory_fast(target, count, buffer, &dscr);
2513  else
2514  retval = aarch64_read_cpu_memory_slow(target, size, count, buffer, &dscr);
2515 
2516  if (dscr & DSCR_MA) {
2517  dscr &= ~DSCR_MA;
2519  armv8->debug_base + CPUV8_DBG_DSCR, dscr);
2520  }
2521 
2522  if (retval != ERROR_OK)
2523  return retval;
2524 
2525  /* Check for sticky abort flags in the DSCR */
2526  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2527  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2528  if (retval != ERROR_OK)
2529  return retval;
2530 
2531  dpm->dscr = dscr;
2532 
2533  if (dscr & (DSCR_ERR | DSCR_SYS_ERROR_PEND)) {
2534  /* Abort occurred - clear it and exit */
2535  LOG_ERROR("abort occurred - dscr = 0x%08" PRIx32, dscr);
2537  return ERROR_FAIL;
2538  }
2539 
2540  /* Done */
2541  return ERROR_OK;
2542 }
2543 
2545  target_addr_t address, uint32_t size,
2546  uint32_t count, uint8_t *buffer)
2547 {
2548  int retval = ERROR_COMMAND_SYNTAX_ERROR;
2549 
2550  if (count && buffer) {
2551  /* read memory through APB-AP */
2552  retval = aarch64_mmu_modify(target, 0);
2553  if (retval != ERROR_OK)
2554  return retval;
2556  }
2557  return retval;
2558 }
2559 
2561  uint32_t size, uint32_t count, uint8_t *buffer)
2562 {
2563  bool mmu_enabled = false;
2564  int retval;
2565 
2566  /* determine if MMU was enabled on target stop */
2567  retval = aarch64_mmu(target, &mmu_enabled);
2568  if (retval != ERROR_OK)
2569  return retval;
2570 
2571  if (mmu_enabled) {
2572  /* enable MMU as we could have disabled it for phys access */
2573  retval = aarch64_mmu_modify(target, 1);
2574  if (retval != ERROR_OK)
2575  return retval;
2576  }
2578 }
2579 
2581  target_addr_t address, uint32_t size,
2582  uint32_t count, const uint8_t *buffer)
2583 {
2584  int retval = ERROR_COMMAND_SYNTAX_ERROR;
2585 
2586  if (count && buffer) {
2587  /* write memory through APB-AP */
2588  retval = aarch64_mmu_modify(target, 0);
2589  if (retval != ERROR_OK)
2590  return retval;
2592  }
2593 
2594  return retval;
2595 }
2596 
2598  uint32_t size, uint32_t count, const uint8_t *buffer)
2599 {
2600  bool mmu_enabled = false;
2601  int retval;
2602 
2603  /* determine if MMU was enabled on target stop */
2604  retval = aarch64_mmu(target, &mmu_enabled);
2605  if (retval != ERROR_OK)
2606  return retval;
2607 
2608  if (mmu_enabled) {
2609  /* enable MMU as we could have disabled it for phys access */
2610  retval = aarch64_mmu_modify(target, 1);
2611  if (retval != ERROR_OK)
2612  return retval;
2613  }
2615 }
2616 
2618 {
2619  struct target *target = priv;
2620  struct armv8_common *armv8 = target_to_armv8(target);
2621  int retval;
2622 
2624  return ERROR_OK;
2625  if (!target->dbg_msg_enabled)
2626  return ERROR_OK;
2627 
2628  if (target->state == TARGET_RUNNING) {
2629  uint32_t request;
2630  uint32_t dscr;
2631  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2632  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2633 
2634  /* check if we have data */
2635  while ((dscr & DSCR_DTR_TX_FULL) && (retval == ERROR_OK)) {
2636  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2637  armv8->debug_base + CPUV8_DBG_DTRTX, &request);
2638  if (retval == ERROR_OK) {
2639  target_request(target, request);
2640  retval = mem_ap_read_atomic_u32(armv8->debug_ap,
2641  armv8->debug_base + CPUV8_DBG_DSCR, &dscr);
2642  }
2643  }
2644  }
2645 
2646  return ERROR_OK;
2647 }
2648 
2650 {
2651  struct aarch64_common *aarch64 = target_to_aarch64(target);
2652  struct armv8_common *armv8 = &aarch64->armv8_common;
2653  struct adiv5_dap *swjdp = armv8->arm.dap;
2655  int i;
2656  int retval = ERROR_OK;
2657  uint64_t debug, ttypr;
2658  uint32_t cpuid;
2659  uint32_t tmp0, tmp1, tmp2, tmp3;
2660  debug = ttypr = cpuid = 0;
2661 
2662  if (!pc)
2663  return ERROR_FAIL;
2664 
2665  if (!armv8->debug_ap) {
2666  if (pc->adiv5_config.ap_num == DP_APSEL_INVALID) {
2667  /* Search for the APB-AB */
2668  retval = dap_find_get_ap(swjdp, AP_TYPE_APB_AP, &armv8->debug_ap);
2669  if (retval != ERROR_OK) {
2670  LOG_ERROR("Could not find APB-AP for debug access");
2671  return retval;
2672  }
2673  } else {
2674  armv8->debug_ap = dap_get_ap(swjdp, pc->adiv5_config.ap_num);
2675  if (!armv8->debug_ap) {
2676  LOG_ERROR("Cannot get AP");
2677  return ERROR_FAIL;
2678  }
2679  }
2680  }
2681 
2682  retval = mem_ap_init(armv8->debug_ap);
2683  if (retval != ERROR_OK) {
2684  LOG_ERROR("Could not initialize the APB-AP");
2685  return retval;
2686  }
2687 
2688  armv8->debug_ap->memaccess_tck = 10;
2689 
2690  if (!target->dbgbase_set) {
2691  /* Lookup Processor DAP */
2693  &armv8->debug_base, target->coreid);
2694  if (retval != ERROR_OK)
2695  return retval;
2696  LOG_DEBUG("Detected core %" PRId32 " dbgbase: " TARGET_ADDR_FMT,
2697  target->coreid, armv8->debug_base);
2698  } else
2699  armv8->debug_base = target->dbgbase;
2700 
2701  retval = mem_ap_write_atomic_u32(armv8->debug_ap,
2702  armv8->debug_base + CPUV8_DBG_OSLAR, 0);
2703  if (retval != ERROR_OK) {
2704  LOG_DEBUG("Examine %s failed", "oslock");
2705  return retval;
2706  }
2707 
2708  retval = mem_ap_read_u32(armv8->debug_ap,
2709  armv8->debug_base + CPUV8_DBG_MAINID0, &cpuid);
2710  if (retval != ERROR_OK) {
2711  LOG_DEBUG("Examine %s failed", "CPUID");
2712  return retval;
2713  }
2714 
2715  retval = mem_ap_read_u32(armv8->debug_ap,
2716  armv8->debug_base + CPUV8_DBG_MEMFEATURE0, &tmp0);
2717  if (retval == ERROR_OK)
2718  retval = mem_ap_read_u32(armv8->debug_ap,
2719  armv8->debug_base + CPUV8_DBG_MEMFEATURE0 + 4, &tmp1);
2720  if (retval != ERROR_OK) {
2721  LOG_DEBUG("Examine %s failed", "Memory Model Type");
2722  return retval;
2723  }
2724  retval = mem_ap_read_u32(armv8->debug_ap,
2725  armv8->debug_base + CPUV8_DBG_DBGFEATURE0, &tmp2);
2726  if (retval == ERROR_OK)
2727  retval = mem_ap_read_u32(armv8->debug_ap,
2728  armv8->debug_base + CPUV8_DBG_DBGFEATURE0 + 4, &tmp3);
2729  if (retval != ERROR_OK) {
2730  LOG_DEBUG("Examine %s failed", "ID_AA64DFR0_EL1");
2731  return retval;
2732  }
2733 
2734  retval = dap_run(armv8->debug_ap->dap);
2735  if (retval != ERROR_OK) {
2736  LOG_ERROR("%s: examination failed\n", target_name(target));
2737  return retval;
2738  }
2739 
2740  ttypr |= tmp1;
2741  ttypr = (ttypr << 32) | tmp0;
2742  debug |= tmp3;
2743  debug = (debug << 32) | tmp2;
2744 
2745  LOG_DEBUG("cpuid = 0x%08" PRIx32, cpuid);
2746  LOG_DEBUG("ttypr = 0x%08" PRIx64, ttypr);
2747  LOG_DEBUG("debug = 0x%08" PRIx64, debug);
2748 
2749  if (!pc->cti) {
2750  LOG_TARGET_ERROR(target, "CTI not specified");
2751  return ERROR_FAIL;
2752  }
2753 
2754  armv8->cti = pc->cti;
2755 
2756  retval = aarch64_dpm_setup(aarch64, debug);
2757  if (retval != ERROR_OK)
2758  return retval;
2759 
2760  /* Setup Breakpoint Register Pairs */
2761  aarch64->brp_num = (uint32_t)((debug >> 12) & 0x0F) + 1;
2762  aarch64->brp_num_context = (uint32_t)((debug >> 28) & 0x0F) + 1;
2763  aarch64->brp_num_available = aarch64->brp_num;
2764  aarch64->brp_list = calloc(aarch64->brp_num, sizeof(struct aarch64_brp));
2765  for (i = 0; i < aarch64->brp_num; i++) {
2766  aarch64->brp_list[i].used = 0;
2767  if (i < (aarch64->brp_num-aarch64->brp_num_context))
2768  aarch64->brp_list[i].type = BRP_NORMAL;
2769  else
2770  aarch64->brp_list[i].type = BRP_CONTEXT;
2771  aarch64->brp_list[i].value = 0;
2772  aarch64->brp_list[i].control = 0;
2773  aarch64->brp_list[i].brpn = i;
2774  }
2775 
2776  /* Setup Watchpoint Register Pairs */
2777  aarch64->wp_num = (uint32_t)((debug >> 20) & 0x0F) + 1;
2778  aarch64->wp_num_available = aarch64->wp_num;
2779  aarch64->wp_list = calloc(aarch64->wp_num, sizeof(struct aarch64_brp));
2780  for (i = 0; i < aarch64->wp_num; i++) {
2781  aarch64->wp_list[i].used = 0;
2782  aarch64->wp_list[i].type = BRP_NORMAL;
2783  aarch64->wp_list[i].value = 0;
2784  aarch64->wp_list[i].control = 0;
2785  aarch64->wp_list[i].brpn = i;
2786  }
2787 
2788  LOG_DEBUG("Configured %i hw breakpoints, %i watchpoints",
2789  aarch64->brp_num, aarch64->wp_num);
2790 
2795  return ERROR_OK;
2796 }
2797 
2798 static int aarch64_examine(struct target *target)
2799 {
2800  int retval = ERROR_OK;
2801 
2802  /* don't re-probe hardware after each reset */
2804  retval = aarch64_examine_first(target);
2805 
2806  /* Configure core debug access */
2807  if (retval == ERROR_OK)
2809 
2810  if (retval == ERROR_OK)
2811  retval = aarch64_poll(target);
2812 
2813  return retval;
2814 }
2815 
2816 /*
2817  * Cortex-A8 target creation and initialization
2818  */
2819 
2820 static int aarch64_init_target(struct command_context *cmd_ctx,
2821  struct target *target)
2822 {
2823  /* examine_first() does a bunch of this */
2825  return ERROR_OK;
2826 }
2827 
2829  struct aarch64_common *aarch64, struct adiv5_dap *dap)
2830 {
2831  struct armv8_common *armv8 = &aarch64->armv8_common;
2832 
2833  /* Setup struct aarch64_common */
2835  armv8->arm.dap = dap;
2836 
2837  /* register arch-specific functions */
2838  armv8->examine_debug_reason = NULL;
2840  armv8->pre_restore_context = NULL;
2842 
2843  armv8_init_arch_info(target, armv8);
2846 
2847  return ERROR_OK;
2848 }
2849 
2851 {
2853  struct aarch64_common *aarch64;
2854 
2856  return ERROR_FAIL;
2857 
2858  aarch64 = calloc(1, sizeof(struct aarch64_common));
2859  if (!aarch64) {
2860  LOG_ERROR("Out of memory");
2861  return ERROR_FAIL;
2862  }
2863 
2864  aarch64->armv8_common.is_armv8r = true;
2865 
2866  return aarch64_init_arch_info(target, aarch64, pc->adiv5_config.dap);
2867 }
2868 
2870 {
2872  struct aarch64_common *aarch64;
2873 
2875  return ERROR_FAIL;
2876 
2877  aarch64 = calloc(1, sizeof(struct aarch64_common));
2878  if (!aarch64) {
2879  LOG_ERROR("Out of memory");
2880  return ERROR_FAIL;
2881  }
2882 
2883  aarch64->armv8_common.is_armv8r = false;
2884 
2885  return aarch64_init_arch_info(target, aarch64, pc->adiv5_config.dap);
2886 }
2887 
2889 {
2890  struct aarch64_common *aarch64 = target_to_aarch64(target);
2891  struct armv8_common *armv8 = &aarch64->armv8_common;
2892  struct arm_dpm *dpm = &armv8->dpm;
2893  uint64_t address;
2894 
2895  if (target->state == TARGET_HALTED) {
2896  // Restore the previous state of the target (gp registers, MMU, caches, etc)
2897  int retval = aarch64_restore_one(target, true, &address, false, false);
2898  if (retval != ERROR_OK)
2899  LOG_TARGET_ERROR(target, "Failed to restore target state");
2900  }
2901 
2902  if (armv8->debug_ap)
2903  dap_put_ap(armv8->debug_ap);
2904 
2906  free(aarch64->brp_list);
2907  free(dpm->dbp);
2908  free(dpm->dwp);
2909  free(target->private_config);
2910  free(aarch64);
2911 }
2912 
2913 static int aarch64_mmu(struct target *target, bool *enabled)
2914 {
2915  struct aarch64_common *aarch64 = target_to_aarch64(target);
2916  struct armv8_common *armv8 = &aarch64->armv8_common;
2917  if (target->state != TARGET_HALTED) {
2918  LOG_TARGET_ERROR(target, "not halted");
2919  return ERROR_TARGET_NOT_HALTED;
2920  }
2921  if (armv8->is_armv8r)
2922  *enabled = false;
2923  else
2925  return ERROR_OK;
2926 }
2927 
2929  target_addr_t *phys)
2930 {
2931  return armv8_mmu_translate_va_pa(target, virt, phys, 1);
2932 }
2933 
2934 /*
2935  * private target configuration items
2936  */
2939 };
2940 
2941 static const struct jim_nvp nvp_config_opts[] = {
2942  { .name = "-cti", .value = CFG_CTI },
2943  { .name = NULL, .value = -1 }
2944 };
2945 
2946 static int aarch64_jim_configure(struct target *target, struct jim_getopt_info *goi)
2947 {
2948  struct aarch64_private_config *pc;
2949  struct jim_nvp *n;
2950  int e;
2951 
2953  if (!pc) {
2954  pc = calloc(1, sizeof(struct aarch64_private_config));
2956  target->private_config = pc;
2957  }
2958 
2959  /*
2960  * Call adiv5_jim_configure() to parse the common DAP options
2961  * It will return JIM_CONTINUE if it didn't find any known
2962  * options, JIM_OK if it correctly parsed the topmost option
2963  * and JIM_ERR if an error occurred during parameter evaluation.
2964  * For JIM_CONTINUE, we check our own params.
2965  */
2967  if (e != JIM_CONTINUE)
2968  return e;
2969 
2970  /* parse config or cget options ... */
2971  if (goi->argc > 0) {
2972  Jim_SetEmptyResult(goi->interp);
2973 
2974  /* check first if topmost item is for us */
2976  goi->argv[0], &n);
2977  if (e != JIM_OK)
2978  return JIM_CONTINUE;
2979 
2980  e = jim_getopt_obj(goi, NULL);
2981  if (e != JIM_OK)
2982  return e;
2983 
2984  switch (n->value) {
2985  case CFG_CTI: {
2986  if (goi->is_configure) {
2987  Jim_Obj *o_cti;
2988  struct arm_cti *cti;
2989  e = jim_getopt_obj(goi, &o_cti);
2990  if (e != JIM_OK)
2991  return e;
2992  cti = cti_instance_by_jim_obj(goi->interp, o_cti);
2993  if (!cti) {
2994  Jim_SetResultString(goi->interp, "CTI name invalid!", -1);
2995  return JIM_ERR;
2996  }
2997  pc->cti = cti;
2998  } else {
2999  if (goi->argc != 0) {
3000  Jim_WrongNumArgs(goi->interp,
3001  goi->argc, goi->argv,
3002  "NO PARAMS");
3003  return JIM_ERR;
3004  }
3005 
3006  if (!pc || !pc->cti) {
3007  Jim_SetResultString(goi->interp, "CTI not configured", -1);
3008  return JIM_ERR;
3009  }
3010  Jim_SetResultString(goi->interp, arm_cti_name(pc->cti), -1);
3011  }
3012  break;
3013  }
3014 
3015  default:
3016  return JIM_CONTINUE;
3017  }
3018  }
3019 
3020  return JIM_OK;
3021 }
3022 
3023 COMMAND_HANDLER(aarch64_handle_cache_info_command)
3024 {
3026  struct armv8_common *armv8 = target_to_armv8(target);
3027 
3029  &armv8->armv8_mmu.armv8_cache);
3030 }
3031 
3032 COMMAND_HANDLER(aarch64_handle_dbginit_command)
3033 {
3035  if (!target_was_examined(target)) {
3036  LOG_ERROR("target not examined yet");
3037  return ERROR_FAIL;
3038  }
3039 
3041 }
3042 
3043 COMMAND_HANDLER(aarch64_handle_disassemble_command)
3044 {
3046 
3047  if (!target) {
3048  LOG_ERROR("No target selected");
3049  return ERROR_FAIL;
3050  }
3051 
3052  struct aarch64_common *aarch64 = target_to_aarch64(target);
3053 
3054  if (aarch64->common_magic != AARCH64_COMMON_MAGIC) {
3055  command_print(CMD, "current target isn't an AArch64");
3056  return ERROR_FAIL;
3057  }
3058 
3059  int count = 1;
3061 
3062  switch (CMD_ARGC) {
3063  case 2:
3065  /* FALL THROUGH */
3066  case 1:
3068  break;
3069  default:
3071  }
3072 
3073  return a64_disassemble(CMD, target, address, count);
3074 }
3075 
3076 COMMAND_HANDLER(aarch64_mask_interrupts_command)
3077 {
3079  struct aarch64_common *aarch64 = target_to_aarch64(target);
3080 
3081  static const struct nvp nvp_maskisr_modes[] = {
3082  { .name = "off", .value = AARCH64_ISRMASK_OFF },
3083  { .name = "on", .value = AARCH64_ISRMASK_ON },
3084  { .name = NULL, .value = -1 },
3085  };
3086  const struct nvp *n;
3087 
3088  if (CMD_ARGC > 0) {
3089  n = nvp_name2value(nvp_maskisr_modes, CMD_ARGV[0]);
3090  if (!n->name) {
3091  LOG_ERROR("Unknown parameter: %s - should be off or on", CMD_ARGV[0]);
3093  }
3094 
3095  aarch64->isrmasking_mode = n->value;
3096  }
3097 
3098  n = nvp_value2name(nvp_maskisr_modes, aarch64->isrmasking_mode);
3099  command_print(CMD, "aarch64 interrupt mask %s", n->name);
3100 
3101  return ERROR_OK;
3102 }
3103 
3104 COMMAND_HANDLER(aarch64_mcrmrc_command)
3105 {
3106  bool is_mcr = false;
3107  unsigned int arg_cnt = 5;
3108 
3109  if (!strcmp(CMD_NAME, "mcr")) {
3110  is_mcr = true;
3111  arg_cnt = 6;
3112  }
3113 
3114  if (arg_cnt != CMD_ARGC)
3116 
3118  if (!target) {
3119  command_print(CMD, "no current target");
3120  return ERROR_FAIL;
3121  }
3122  if (!target_was_examined(target)) {
3123  command_print(CMD, "%s: not yet examined", target_name(target));
3125  }
3126 
3127  struct arm *arm = target_to_arm(target);
3128  if (!is_arm(arm)) {
3129  command_print(CMD, "%s: not an ARM", target_name(target));
3130  return ERROR_FAIL;
3131  }
3132 
3133  if (target->state != TARGET_HALTED) {
3134  command_print(CMD, "Error: [%s] not halted", target_name(target));
3135  return ERROR_TARGET_NOT_HALTED;
3136  }
3137 
3138  if (arm->core_state == ARM_STATE_AARCH64) {
3139  command_print(CMD, "%s: not 32-bit arm target", target_name(target));
3140  return ERROR_FAIL;
3141  }
3142 
3143  int cpnum;
3144  uint32_t op1;
3145  uint32_t op2;
3146  uint32_t crn;
3147  uint32_t crm;
3148  uint32_t value;
3149 
3150  /* NOTE: parameter sequence matches ARM instruction set usage:
3151  * MCR pNUM, op1, rX, CRn, CRm, op2 ; write CP from rX
3152  * MRC pNUM, op1, rX, CRn, CRm, op2 ; read CP into rX
3153  * The "rX" is necessarily omitted; it uses Tcl mechanisms.
3154  */
3155  COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], cpnum);
3156  if (cpnum & ~0xf) {
3157  command_print(CMD, "coprocessor %d out of range", cpnum);
3159  }
3160 
3161  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], op1);
3162  if (op1 & ~0x7) {
3163  command_print(CMD, "op1 %d out of range", op1);
3165  }
3166 
3167  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], crn);
3168  if (crn & ~0xf) {
3169  command_print(CMD, "CRn %d out of range", crn);
3171  }
3172 
3173  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], crm);
3174  if (crm & ~0xf) {
3175  command_print(CMD, "CRm %d out of range", crm);
3177  }
3178 
3179  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], op2);
3180  if (op2 & ~0x7) {
3181  command_print(CMD, "op2 %d out of range", op2);
3183  }
3184 
3185  if (is_mcr) {
3186  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[5], value);
3187 
3188  /* NOTE: parameters reordered! */
3189  /* ARMV4_5_MCR(cpnum, op1, 0, crn, crm, op2) */
3190  int retval = arm->mcr(target, cpnum, op1, op2, crn, crm, value);
3191  if (retval != ERROR_OK)
3192  return retval;
3193  } else {
3194  value = 0;
3195  /* NOTE: parameters reordered! */
3196  /* ARMV4_5_MRC(cpnum, op1, 0, crn, crm, op2) */
3197  int retval = arm->mrc(target, cpnum, op1, op2, crn, crm, &value);
3198  if (retval != ERROR_OK)
3199  return retval;
3200 
3201  command_print(CMD, "0x%" PRIx32, value);
3202  }
3203 
3204  return ERROR_OK;
3205 }
3206 
3207 static const struct command_registration aarch64_exec_command_handlers[] = {
3208  {
3209  .name = "cache_info",
3210  .handler = aarch64_handle_cache_info_command,
3211  .mode = COMMAND_EXEC,
3212  .help = "display information about target caches",
3213  .usage = "",
3214  },
3215  {
3216  .name = "dbginit",
3217  .handler = aarch64_handle_dbginit_command,
3218  .mode = COMMAND_EXEC,
3219  .help = "Initialize core debug",
3220  .usage = "",
3221  },
3222  {
3223  .name = "disassemble",
3224  .handler = aarch64_handle_disassemble_command,
3225  .mode = COMMAND_EXEC,
3226  .help = "Disassemble instructions",
3227  .usage = "address [count]",
3228  },
3229  {
3230  .name = "maskisr",
3231  .handler = aarch64_mask_interrupts_command,
3232  .mode = COMMAND_ANY,
3233  .help = "mask aarch64 interrupts during single-step",
3234  .usage = "['on'|'off']",
3235  },
3236  {
3237  .name = "mcr",
3238  .mode = COMMAND_EXEC,
3239  .handler = aarch64_mcrmrc_command,
3240  .help = "write coprocessor register",
3241  .usage = "cpnum op1 CRn CRm op2 value",
3242  },
3243  {
3244  .name = "mrc",
3245  .mode = COMMAND_EXEC,
3246  .handler = aarch64_mcrmrc_command,
3247  .help = "read coprocessor register",
3248  .usage = "cpnum op1 CRn CRm op2",
3249  },
3250  {
3251  .chain = smp_command_handlers,
3252  },
3253 
3254 
3256 };
3257 
3258 static const struct command_registration aarch64_command_handlers[] = {
3259  {
3260  .name = "arm",
3261  .mode = COMMAND_ANY,
3262  .help = "ARM Command Group",
3263  .usage = "",
3265  },
3266  {
3268  },
3269  {
3270  .name = "aarch64",
3271  .mode = COMMAND_ANY,
3272  .help = "Aarch64 command group",
3273  .usage = "",
3275  },
3277 };
3278 
3279 struct target_type aarch64_target = {
3280  .name = "aarch64",
3281 
3282  .poll = aarch64_poll,
3283  .arch_state = armv8_arch_state,
3284 
3285  .halt = aarch64_halt,
3286  .resume = aarch64_resume,
3287  .step = aarch64_step,
3288 
3289  .assert_reset = aarch64_assert_reset,
3290  .deassert_reset = aarch64_deassert_reset,
3291 
3292  /* REVISIT allow exporting VFP3 registers ... */
3293  .get_gdb_arch = armv8_get_gdb_arch,
3294  .get_gdb_reg_list = armv8_get_gdb_reg_list,
3295 
3296  .read_memory = aarch64_read_memory,
3297  .write_memory = aarch64_write_memory,
3298 
3299  .add_breakpoint = aarch64_add_breakpoint,
3300  .add_context_breakpoint = aarch64_add_context_breakpoint,
3301  .add_hybrid_breakpoint = aarch64_add_hybrid_breakpoint,
3302  .remove_breakpoint = aarch64_remove_breakpoint,
3303  .add_watchpoint = aarch64_add_watchpoint,
3304  .remove_watchpoint = aarch64_remove_watchpoint,
3305  .hit_watchpoint = aarch64_hit_watchpoint,
3306 
3307  .commands = aarch64_command_handlers,
3308  .target_create = aarch64_target_create,
3309  .target_jim_configure = aarch64_jim_configure,
3310  .init_target = aarch64_init_target,
3311  .deinit_target = aarch64_deinit_target,
3312  .examine = aarch64_examine,
3313 
3314  .read_phys_memory = aarch64_read_phys_memory,
3315  .write_phys_memory = aarch64_write_phys_memory,
3316  .mmu = aarch64_mmu,
3317  .virt2phys = aarch64_virt2phys,
3318 };
3319 
3320 struct target_type armv8r_target = {
3321  .name = "armv8r",
3322 
3323  .poll = aarch64_poll,
3324  .arch_state = armv8_arch_state,
3325 
3326  .halt = aarch64_halt,
3327  .resume = aarch64_resume,
3328  .step = aarch64_step,
3329 
3330  .assert_reset = aarch64_assert_reset,
3331  .deassert_reset = aarch64_deassert_reset,
3332 
3333  /* REVISIT allow exporting VFP3 registers ... */
3334  .get_gdb_arch = armv8_get_gdb_arch,
3335  .get_gdb_reg_list = armv8_get_gdb_reg_list,
3336 
3337  .read_memory = aarch64_read_phys_memory,
3338  .write_memory = aarch64_write_phys_memory,
3339 
3340  .add_breakpoint = aarch64_add_breakpoint,
3341  .add_context_breakpoint = aarch64_add_context_breakpoint,
3342  .add_hybrid_breakpoint = aarch64_add_hybrid_breakpoint,
3343  .remove_breakpoint = aarch64_remove_breakpoint,
3344  .add_watchpoint = aarch64_add_watchpoint,
3345  .remove_watchpoint = aarch64_remove_watchpoint,
3346  .hit_watchpoint = aarch64_hit_watchpoint,
3347 
3348  .commands = aarch64_command_handlers,
3349  .target_create = armv8r_target_create,
3350  .target_jim_configure = aarch64_jim_configure,
3351  .init_target = aarch64_init_target,
3352  .deinit_target = aarch64_deinit_target,
3353  .examine = aarch64_examine,
3354 };
int a64_disassemble(struct command_invocation *cmd, struct target *target, target_addr_t address, size_t count)
static int aarch64_update_halt_gdb(struct target *target, enum target_debug_reason debug_reason)
Definition: aarch64.c:473
static int aarch64_write_cpu_memory_slow(struct target *target, uint32_t size, uint32_t count, const uint8_t *buffer, uint32_t *dscr)
Definition: aarch64.c:2103
static int aarch64_set_breakpoint(struct target *target, struct breakpoint *breakpoint, uint8_t matchmode)
Definition: aarch64.c:1289
static int aarch64_poll_smp(struct target *target, bool smp, bool postpone_event)
Definition: aarch64.c:529
static int aarch64_unset_watchpoint(struct target *target, struct watchpoint *watchpoint)
Definition: aarch64.c:1834
static int aarch64_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
Definition: aarch64.c:1878
COMMAND_HANDLER(aarch64_handle_cache_info_command)
Definition: aarch64.c:3023
static int aarch64_set_dscr_bits(struct target *target, unsigned long bit_mask, unsigned long value)
Definition: aarch64.c:289
static int aarch64_assert_reset(struct target *target)
Definition: aarch64.c:1992
halt_mode
Definition: aarch64.c:32
@ HALT_SYNC
Definition: aarch64.c:34
@ HALT_LAZY
Definition: aarch64.c:33
static void aarch64_deinit_target(struct target *target)
Definition: aarch64.c:2888
static int aarch64_add_context_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: aarch64.c:1696
static int aarch64_write_phys_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: aarch64.c:2580
static const struct jim_nvp nvp_config_opts[]
Definition: aarch64.c:2941
static int aarch64_examine(struct target *target)
Definition: aarch64.c:2798
static const struct command_registration aarch64_exec_command_handlers[]
Definition: aarch64.c:3207
static int aarch64_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: aarch64.c:1680
static int aarch64_read_prsr(struct target *target, uint32_t *prsr)
Definition: aarch64.c:197
static int aarch64_set_context_breakpoint(struct target *target, struct breakpoint *breakpoint, uint8_t matchmode)
Definition: aarch64.c:1410
static int aarch64_mmu_modify(struct target *target, int enable)
Definition: aarch64.c:124
static int aarch64_read_cpu_memory_fast(struct target *target, uint32_t count, uint8_t *buffer, uint32_t *dscr)
Definition: aarch64.c:2384
static int aarch64_examine_first(struct target *target)
Definition: aarch64.c:2649
static int aarch64_poll(struct target *target)
Definition: aarch64.c:605
static int aarch64_init_target(struct command_context *cmd_ctx, struct target *target)
Definition: aarch64.c:2820
static int aarch64_read_cpu_memory(struct target *target, uint64_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: aarch64.c:2453
static int armv8r_target_create(struct target *target)
Definition: aarch64.c:2850
static int aarch64_prepare_restart_one(struct target *target)
prepare single target for restart
Definition: aarch64.c:682
static int aarch64_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Definition: aarch64.c:1149
static int aarch64_restore_context(struct target *target, bool bpwp)
Definition: aarch64.c:1262
static int aarch64_enable_reset_catch(struct target *target, bool enable)
Definition: aarch64.c:1942
static int aarch64_jim_configure(struct target *target, struct jim_getopt_info *goi)
Definition: aarch64.c:2946
static int aarch64_mmu(struct target *target, bool *enabled)
Definition: aarch64.c:2913
static int aarch64_halt(struct target *target)
Definition: aarch64.c:611
static int aarch64_restore_one(struct target *target, bool current, uint64_t *address, bool handle_breakpoints, bool debug_execution)
Definition: aarch64.c:622
static int aarch64_read_phys_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: aarch64.c:2544
static int aarch64_check_state_one(struct target *target, uint32_t mask, uint32_t val, int *p_result, uint32_t *p_prsr)
Definition: aarch64.c:295
static int aarch64_restore_system_control_reg(struct target *target)
Definition: aarch64.c:60
postponed_halt_events_op
Definition: aarch64.c:503
@ POSTPONED_HALT_EVENT_CLEAR
Definition: aarch64.c:504
@ POSTPONED_HALT_EVENT_EMIT
Definition: aarch64.c:505
static int aarch64_write_cpu_memory_fast(struct target *target, uint32_t count, const uint8_t *buffer, uint32_t *dscr)
Definition: aarch64.c:2180
static int aarch64_set_watchpoint(struct target *target, struct watchpoint *watchpoint)
Definition: aarch64.c:1750
static int aarch64_remove_watchpoint(struct target *target, struct watchpoint *watchpoint)
Definition: aarch64.c:1896
static int aarch64_restart_one(struct target *target, enum restart_mode mode)
Definition: aarch64.c:770
static int aarch64_step_restart_smp(struct target *target)
Definition: aarch64.c:826
static int aarch64_dap_write_memap_register_u32(struct target *target, target_addr_t address, uint32_t value)
Definition: aarch64.c:262
static int aarch64_debug_entry(struct target *target)
Definition: aarch64.c:1006
static int aarch64_prep_restart_smp(struct target *target, bool handle_breakpoints, struct target **p_first)
Definition: aarch64.c:786
static void aarch64_smp_postponed_halt_events(struct list_head *smp_targets, enum postponed_halt_events_op op)
Definition: aarch64.c:508
static int aarch64_prepare_halt_smp(struct target *target, bool exc_target, struct target **p_first)
Definition: aarch64.c:336
struct target_type aarch64_target
Definition: aarch64.c:3279
static const struct command_registration aarch64_command_handlers[]
Definition: aarch64.c:3258
static int aarch64_write_cpu_memory(struct target *target, uint64_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: aarch64.c:2213
static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: aarch64.c:1547
static int aarch64_virt2phys(struct target *target, target_addr_t virt, target_addr_t *phys)
Definition: aarch64.c:2928
static int aarch64_handle_target_request(void *priv)
Definition: aarch64.c:2617
static int aarch64_clear_reset_catch(struct target *target)
Definition: aarch64.c:1963
static int aarch64_halt_one(struct target *target, enum halt_mode mode)
Definition: aarch64.c:381
static int aarch64_hit_watchpoint(struct target *target, struct watchpoint **hit_watchpoint)
find out which watchpoint hits get exception address and compare the address to watchpoints
Definition: aarch64.c:1913
aarch64_cfg_param
Definition: aarch64.c:2937
@ CFG_CTI
Definition: aarch64.c:2938
static int aarch64_deassert_reset(struct target *target)
Definition: aarch64.c:2054
static int aarch64_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: aarch64.c:2597
struct target_type armv8r_target
Definition: aarch64.c:3320
static int aarch64_do_restart_one(struct target *target, enum restart_mode mode)
Definition: aarch64.c:728
static int aarch64_target_create(struct target *target)
Definition: aarch64.c:2869
static int aarch64_dpm_setup(struct aarch64_common *a8, uint64_t debug)
Definition: aarch64.c:274
static int aarch64_add_hybrid_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: aarch64.c:1712
static int aarch64_wait_halt_one(struct target *target)
Definition: aarch64.c:314
static int aarch64_read_cpu_memory_slow(struct target *target, uint32_t size, uint32_t count, uint8_t *buffer, uint32_t *dscr)
Definition: aarch64.c:2300
static int aarch64_init_arch_info(struct target *target, struct aarch64_common *aarch64, struct adiv5_dap *dap)
Definition: aarch64.c:2828
static int aarch64_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: aarch64.c:1728
static int aarch64_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Definition: aarch64.c:899
static int aarch64_set_hybrid_breakpoint(struct target *target, struct breakpoint *breakpoint)
Definition: aarch64.c:1460
static int aarch64_read_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: aarch64.c:2560
restart_mode
Definition: aarch64.c:27
@ RESTART_SYNC
Definition: aarch64.c:29
@ RESTART_LAZY
Definition: aarch64.c:28
static int aarch64_halt_smp(struct target *target, bool exc_target)
Definition: aarch64.c:410
static int aarch64_post_debug_entry(struct target *target)
Definition: aarch64.c:1075
static int aarch64_init_debug_access(struct target *target)
Definition: aarch64.c:214
static struct aarch64_common * target_to_aarch64(struct target *target)
Definition: aarch64.h:64
#define BRP_CONTEXT
Definition: aarch64.h:23
@ AARCH64_ISRMASK_ON
Definition: aarch64.h:29
@ AARCH64_ISRMASK_OFF
Definition: aarch64.h:28
#define BRP_NORMAL
Definition: aarch64.h:22
#define AARCH64_COMMON_MAGIC
Definition: aarch64.h:12
const char * armv8_get_gdb_arch(const struct target *target)
Definition: armv8.c:1992
struct reg * armv8_reg_current(struct arm *arm, unsigned int regnum)
Definition: armv8.c:1924
int armv8_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Definition: armv8.c:1998
static bool is_arm(struct arm *arm)
Definition: arm.h:268
arm_mode
Represent state of an ARM core.
Definition: arm.h:82
@ ARM_MODE_IRQ
Definition: arm.h:85
@ ARM_MODE_SYS
Definition: arm.h:92
@ ARM_MODE_HYP
Definition: arm.h:89
@ ARMV8_64_EL0T
Definition: arm.h:98
@ ARMV8_64_EL3H
Definition: arm.h:104
@ ARM_MODE_MON
Definition: arm.h:87
@ ARMV8_64_EL3T
Definition: arm.h:103
@ ARM_MODE_FIQ
Definition: arm.h:84
@ ARM_MODE_UND
Definition: arm.h:90
@ ARM_MODE_ANY
Definition: arm.h:106
@ ARMV8_64_EL1H
Definition: arm.h:100
@ ARM_MODE_SVC
Definition: arm.h:86
@ ARMV8_64_EL2H
Definition: arm.h:102
@ ARMV8_64_EL2T
Definition: arm.h:101
@ ARMV8_64_EL1T
Definition: arm.h:99
@ ARM_MODE_ABT
Definition: arm.h:88
static struct arm * target_to_arm(const struct target *target)
Convert target handle to generic ARM target state handle.
Definition: arm.h:262
arm_state
The PSR "T" and "J" bits define the mode of "classic ARM" cores.
Definition: arm.h:151
@ ARM_STATE_JAZELLE
Definition: arm.h:154
@ ARM_STATE_THUMB
Definition: arm.h:153
@ ARM_STATE_ARM
Definition: arm.h:152
@ ARM_STATE_AARCH64
Definition: arm.h:156
@ ARM_STATE_THUMB_EE
Definition: arm.h:155
int dap_lookup_cs_component(struct adiv5_ap *ap, uint8_t type, target_addr_t *addr, int32_t core_id)
Definition: arm_adi_v5.c:2295
int mem_ap_read_buf_noincr(struct adiv5_ap *ap, uint8_t *buffer, uint32_t size, uint32_t count, target_addr_t address)
Definition: arm_adi_v5.c:742
int adiv5_verify_config(struct adiv5_private_config *pc)
Definition: arm_adi_v5.c:2494
int mem_ap_read_u32(struct adiv5_ap *ap, target_addr_t address, uint32_t *value)
Asynchronous (queued) read of a word from memory or a system register.
Definition: arm_adi_v5.c:245
int dap_find_get_ap(struct adiv5_dap *dap, enum ap_type type_to_find, struct adiv5_ap **ap_out)
Definition: arm_adi_v5.c:1115
int mem_ap_write_buf_noincr(struct adiv5_ap *ap, const uint8_t *buffer, uint32_t size, uint32_t count, target_addr_t address)
Definition: arm_adi_v5.c:748
int adiv5_jim_configure_ext(struct target *target, struct jim_getopt_info *goi, struct adiv5_private_config *pc, enum adiv5_configure_dap_optional optional)
Definition: arm_adi_v5.c:2449
int mem_ap_read_atomic_u32(struct adiv5_ap *ap, target_addr_t address, uint32_t *value)
Synchronous read of a word from memory or a system register.
Definition: arm_adi_v5.c:274
struct adiv5_ap * dap_get_ap(struct adiv5_dap *dap, uint64_t ap_num)
Definition: arm_adi_v5.c:1197
int dap_put_ap(struct adiv5_ap *ap)
Definition: arm_adi_v5.c:1217
int mem_ap_init(struct adiv5_ap *ap)
Initialize a DAP.
Definition: arm_adi_v5.c:896
int mem_ap_write_atomic_u32(struct adiv5_ap *ap, target_addr_t address, uint32_t value)
Synchronous write of a word to memory or a system register.
Definition: arm_adi_v5.c:326
@ AP_TYPE_APB_AP
Definition: arm_adi_v5.h:491
@ ADI_CONFIGURE_DAP_COMPULSORY
Definition: arm_adi_v5.h:793
#define DP_APSEL_INVALID
Definition: arm_adi_v5.h:110
static int dap_run(struct adiv5_dap *dap)
Perform all queued DAP operations, and clear any errors posted in the CTRL_STAT register when they ar...
Definition: arm_adi_v5.h:648
#define ARM_CS_C9_DEVTYPE_CORE_DEBUG
Definition: arm_coresight.h:88
int arm_cti_ack_events(struct arm_cti *self, uint32_t event)
Definition: arm_cti.c:81
int arm_cti_write_reg(struct arm_cti *self, unsigned int reg, uint32_t value)
Definition: arm_cti.c:123
int arm_cti_gate_channel(struct arm_cti *self, uint32_t channel)
Definition: arm_cti.c:107
int arm_cti_pulse_channel(struct arm_cti *self, uint32_t channel)
Definition: arm_cti.c:136
int arm_cti_enable(struct arm_cti *self, bool enable)
Definition: arm_cti.c:74
const char * arm_cti_name(struct arm_cti *self)
Definition: arm_cti.c:30
struct arm_cti * cti_instance_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
Definition: arm_cti.c:35
int arm_cti_ungate_channel(struct arm_cti *self, uint32_t channel)
Definition: arm_cti.c:115
#define CTI_CHNL(x)
Definition: arm_cti.h:45
#define CTI_GATE
Definition: arm_cti.h:41
#define CTI_TRIG(n)
Definition: arm_cti.h:48
#define CTI_OUTEN0
Definition: arm_cti.h:27
#define CTI_OUTEN1
Definition: arm_cti.h:28
#define DSCR_DTR_TX_FULL
Definition: arm_dpm.h:194
#define ARMV4_5_MRC(cp, op1, rd, crn, crm, op2)
Definition: arm_opcodes.h:186
#define ARMV4_5_MCR(cp, op1, rd, crn, crm, op2)
Definition: arm_opcodes.h:209
int arm_semihosting(struct target *target, int *retval)
Checks for and processes an ARM semihosting request.
int arm_semihosting_init(struct target *target)
Initialize ARM semihosting support.
enum arm_mode mode
Definition: armv4_5.c:281
int armv8_init_arch_info(struct target *target, struct armv8_common *armv8)
Definition: armv8.c:1327
int armv8_set_dbgreg_bits(struct armv8_common *armv8, unsigned int reg, unsigned long mask, unsigned long value)
Definition: armv8.c:2060
int armv8_read_mpidr(struct armv8_common *armv8)
Definition: armv8.c:888
void armv8_free_reg_cache(struct target *target)
Definition: armv8.c:1956
int armv8_arch_state(struct target *target)
Definition: armv8.c:1367
int armv8_mmu_translate_va_pa(struct target *target, target_addr_t va, target_addr_t *val, int meminfo)
Definition: armv8.c:1144
const struct command_registration armv8_command_handlers[]
Definition: armv8.c:1970
void armv8_select_reg_access(struct armv8_common *armv8, bool is_aarch64)
Definition: armv8.c:871
const char * armv8_mode_name(unsigned int psr_mode)
Map PSR mode bits to the name of an ARM processor operating mode.
Definition: armv8.c:109
int armv8_handle_cache_info_command(struct command_invocation *cmd, struct armv8_cache_common *armv8_cache)
Definition: armv8.c:1309
int armv8_identify_cache(struct armv8_common *armv8)
Definition: armv8_cache.c:354
#define CPUV8_DBG_DRCR
Definition: armv8.h:258
static struct armv8_common * target_to_armv8(struct target *target)
Definition: armv8.h:234
#define CPUV8_DBG_BVR_BASE
Definition: armv8.h:268
#define CPUV8_DBG_OSLAR
Definition: armv8.h:274
#define CPUV8_DBG_EDWAR0
Definition: armv8.h:255
@ ARMV8_RUNCONTROL_HALT
Definition: armv8.h:111
@ ARMV8_RUNCONTROL_RESUME
Definition: armv8.h:110
@ ARMV8_RUNCONTROL_STEP
Definition: armv8.h:112
#define CPUV8_DBG_MAINID0
Definition: armv8.h:245
#define CPUV8_DBG_MEMFEATURE0
Definition: armv8.h:248
#define CPUV8_DBG_DSCR
Definition: armv8.h:257
#define CPUV8_DBG_DTRTX
Definition: armv8.h:266
#define CPUV8_DBG_EDWAR1
Definition: armv8.h:256
#define CPUV8_DBG_EDESR
Definition: armv8.h:253
#define CPUV8_DBG_PRSR
Definition: armv8.h:261
#define CPUV8_DBG_DBGFEATURE0
Definition: armv8.h:247
#define CPUV8_DBG_WVR_BASE
Definition: armv8.h:270
#define CPUV8_DBG_WCR_BASE
Definition: armv8.h:271
#define CPUV8_DBG_EDECR
Definition: armv8.h:254
#define CPUV8_DBG_DTRRX
Definition: armv8.h:263
#define CPUV8_DBG_BCR_BASE
Definition: armv8.h:269
int armv8_cache_d_inner_flush_virt(struct armv8_common *armv8, target_addr_t va, size_t size)
Definition: armv8_cache.c:105
int armv8_cache_i_inner_inval_virt(struct armv8_common *armv8, target_addr_t va, size_t size)
Definition: armv8_cache.c:174
void armv8_dpm_report_dscr(struct arm_dpm *dpm, uint32_t dscr)
Definition: armv8_dpm.c:1357
int armv8_dpm_write_dirty_registers(struct arm_dpm *dpm, bool bpwp)
Writes all modified core registers for all processor modes.
Definition: armv8_dpm.c:878
enum arm_state armv8_dpm_get_core_state(struct arm_dpm *dpm)
Get core state from EDSCR, without necessity to retrieve CPSR.
Definition: armv8_dpm.c:41
int armv8_dpm_read_current_registers(struct arm_dpm *dpm)
Read basic registers of the current context: R0 to R15, and CPSR in AArch32 state or R0 to R31,...
Definition: armv8_dpm.c:740
int armv8_dpm_initialize(struct arm_dpm *dpm)
Reinitializes DPM state at the beginning of a new debug session or after a reset which may have affec...
Definition: armv8_dpm.c:1489
int armv8_dpm_modeswitch(struct arm_dpm *dpm, enum arm_mode mode)
Definition: armv8_dpm.c:538
void armv8_dpm_handle_exception(struct arm_dpm *dpm, bool do_restore)
Definition: armv8_dpm.c:1301
int armv8_dpm_setup(struct arm_dpm *dpm)
Hooks up this DPM to its associated target; call only once.
Definition: armv8_dpm.c:1407
#define PRSR_RESET
Definition: armv8_dpm.h:99
#define PRSR_SDR
Definition: armv8_dpm.h:108
#define ESR_RC
Definition: armv8_dpm.h:94
#define DSCR_MA
Definition: armv8_dpm.h:44
#define PRSR_HALT
Definition: armv8_dpm.h:101
#define DRCR_CSE
Definition: armv8_dpm.h:74
#define DSCR_HDE
Definition: armv8_dpm.h:41
#define ECR_RCE
Definition: armv8_dpm.h:91
#define PRSR_SR
Definition: armv8_dpm.h:100
#define DSCR_SYS_ERROR_PEND
Definition: armv8_dpm.h:38
#define DSCR_ERR
Definition: armv8_dpm.h:37
#define DSCR_ITE
Definition: armv8_dpm.h:47
void armv8_select_opcodes(struct armv8_common *armv8, bool state_is_aarch64)
Definition: armv8_opcodes.c:75
#define ARMV8_HLT_T1(im)
#define SYSTEM_SCTLR_EL1
Definition: armv8_opcodes.h:37
#define ARMV8_MSR_GP(system, rt)
#define SYSTEM_SCTLR_EL3
Definition: armv8_opcodes.h:39
#define ARMV8_MRS(system, rt)
#define ARMV8_HLT(im)
armv8_opcode
@ ARMV8_OPC_LDRD_IP
@ ARMV8_OPC_LDRW_IP
@ ARMV8_OPC_LDRB_IP
@ ARMV8_OPC_LDRH_IP
@ ARMV8_OPC_STRD_IP
@ ARMV8_OPC_STRH_IP
@ ARMV8_OPC_STRW_IP
@ ARMV8_OPC_STRB_IP
#define SYSTEM_SCTLR_EL2
Definition: armv8_opcodes.h:38
#define SYSTEM_DBG_DTRTX_EL0
Definition: armv8_opcodes.h:63
#define SYSTEM_DBG_DBGDTR_EL0
Definition: armv8_opcodes.h:64
#define SYSTEM_DBG_DTRRX_EL0
Definition: armv8_opcodes.h:62
#define ARMV8_HLT_A1(im)
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
static uint64_t buf_get_u64(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 64-bit word.
Definition: binarybuffer.h:134
static void buf_set_u64(uint8_t *_buffer, unsigned int first, unsigned int num, uint64_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:65
@ BKPT_HARD
Definition: breakpoints.h:18
@ BKPT_SOFT
Definition: breakpoints.h:19
static void watchpoint_set(struct watchpoint *watchpoint, unsigned int number)
Definition: breakpoints.h:81
static void breakpoint_hw_set(struct breakpoint *breakpoint, unsigned int hw_number)
Definition: breakpoints.h:65
@ WPT_ACCESS
Definition: breakpoints.h:23
@ WPT_READ
Definition: breakpoints.h:23
@ WPT_WRITE
Definition: breakpoints.h:23
void command_print(struct command_invocation *cmd, const char *format,...)
Definition: command.c:389
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:146
#define CMD_NAME
Use this macro to access the name of the command being handled, rather than accessing the variable di...
Definition: command.h:171
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:161
#define COMMAND_PARSE_ADDRESS(in, out)
Definition: command.h:455
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:405
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:156
#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:445
#define CMD_CTX
Use this macro to access the context of the command being handled, rather than accessing the variable...
Definition: command.h:151
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:256
#define ERROR_COMMAND_ARGUMENT_INVALID
Definition: command.h:407
@ COMMAND_ANY
Definition: command.h:42
@ COMMAND_EXEC
Definition: command.h:40
static int halted(struct target *target, const char *label)
Definition: davinci.c:58
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
uint8_t type
Definition: esp_usb_jtag.c:0
static struct esp_usb_jtag * priv
Definition: esp_usb_jtag.c:219
uint8_t length
Definition: esp_usb_jtag.c:1
int jim_nvp_name2value_obj(Jim_Interp *interp, const struct jim_nvp *p, Jim_Obj *o, struct jim_nvp **result)
Definition: jim-nvp.c:66
int jim_getopt_obj(struct jim_getopt_info *goi, Jim_Obj **puthere)
Remove argv[0] from the list.
Definition: jim-nvp.c:169
int adapter_deassert_reset(void)
Definition: jtag/core.c:1912
enum reset_types jtag_get_reset_config(void)
Definition: jtag/core.c:1747
int adapter_assert_reset(void)
Definition: jtag/core.c:1892
reset_types
Definition: jtag.h:215
@ RESET_SRST_NO_GATING
Definition: jtag.h:224
@ RESET_HAS_SRST
Definition: jtag.h:218
@ RESET_SRST_PULLS_TRST
Definition: jtag.h:220
uint64_t op
Definition: lakemont.c:68
#define LOG_TARGET_INFO(target, fmt_str,...)
Definition: log.h:160
#define LOG_WARNING(expr ...)
Definition: log.h:137
#define ERROR_FAIL
Definition: log.h:181
#define LOG_TARGET_ERROR(target, fmt_str,...)
Definition: log.h:169
#define LOG_TARGET_DEBUG(target, fmt_str,...)
Definition: log.h:157
#define LOG_ERROR(expr ...)
Definition: log.h:140
#define LOG_INFO(expr ...)
Definition: log.h:134
#define LOG_DEBUG(expr ...)
Definition: log.h:117
#define ERROR_OK
Definition: log.h:175
const struct nvp * nvp_name2value(const struct nvp *p, const char *name)
Definition: nvp.c:29
const struct nvp * nvp_value2name(const struct nvp *p, int value)
Definition: nvp.c:39
uint8_t mask
Definition: parport.c:70
void register_cache_invalidate(struct reg_cache *cache)
Marks the contents of the register cache as invalid (and clean).
Definition: register.c:94
target_addr_t addr
Start address to search for the control block.
Definition: rtt/rtt.c:28
struct target * target
Definition: rtt/rtt.c:26
const struct command_registration semihosting_common_handlers[]
const struct command_registration smp_command_handlers[]
Definition: smp.c:153
#define foreach_smp_target(pos, head)
Definition: smp.h:15
uint8_t brpn
Definition: aarch64.h:37
target_addr_t value
Definition: aarch64.h:35
int type
Definition: aarch64.h:34
uint32_t control
Definition: aarch64.h:36
int used
Definition: aarch64.h:33
unsigned int common_magic
Definition: aarch64.h:41
int wp_num_available
Definition: aarch64.h:57
struct aarch64_brp * wp_list
Definition: aarch64.h:58
int brp_num_available
Definition: aarch64.h:52
uint64_t system_control_reg_curr
Definition: aarch64.h:47
struct armv8_common armv8_common
Definition: aarch64.h:43
struct aarch64_brp * brp_list
Definition: aarch64.h:53
enum aarch64_isrmasking_mode isrmasking_mode
Definition: aarch64.h:60
uint64_t system_control_reg
Definition: aarch64.h:46
int brp_num_context
Definition: aarch64.h:50
struct arm_cti * cti
Definition: aarch64.c:39
struct adiv5_private_config adiv5_config
Definition: aarch64.c:38
struct adiv5_dap * dap
DAP this AP belongs to.
Definition: arm_adi_v5.h:254
uint32_t memaccess_tck
Configures how many extra tck clocks are added after starting a MEM-AP access before we try to read i...
Definition: arm_adi_v5.h:306
This represents an ARM Debug Interface (v5) Debug Access Port (DAP).
Definition: arm_adi_v5.h:348
struct adiv5_dap * dap
Definition: arm_adi_v5.h:787
This wraps an implementation of DPM primitives.
Definition: arm_dpm.h:47
target_addr_t wp_addr
Target dependent watchpoint address.
Definition: arm_dpm.h:147
uint64_t didr
Cache of DIDR.
Definition: arm_dpm.h:51
int(* instr_write_data_r0_64)(struct arm_dpm *dpm, uint32_t opcode, uint64_t data)
Runs one instruction, writing data to R0 before execution.
Definition: arm_dpm.h:82
int(* instr_execute)(struct arm_dpm *dpm, uint32_t opcode)
Runs one instruction.
Definition: arm_dpm.h:60
int(* instr_write_data_dcc_64)(struct arm_dpm *dpm, uint32_t opcode, uint64_t data)
Definition: arm_dpm.h:68
struct arm * arm
Definition: arm_dpm.h:48
struct dpm_bp * dbp
Definition: arm_dpm.h:139
int(* instr_write_data_dcc)(struct arm_dpm *dpm, uint32_t opcode, uint32_t data)
Runs one instruction, writing data to DCC before execution.
Definition: arm_dpm.h:65
int(* instr_read_data_r0_64)(struct arm_dpm *dpm, uint32_t opcode, uint64_t *data)
Definition: arm_dpm.h:108
struct dpm_wp * dwp
Definition: arm_dpm.h:140
int(* instr_cpsr_sync)(struct arm_dpm *dpm)
Optional core-specific operation invoked after CPSR writes.
Definition: arm_dpm.h:86
uint32_t dscr
Recent value of DSCR.
Definition: arm_dpm.h:150
Represents a generic ARM core, with standard application registers.
Definition: arm.h:176
int(* mrc)(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t crn, uint32_t crm, uint32_t *value)
Read coprocessor register.
Definition: arm.h:231
enum arm_mode core_mode
Record the current core mode: SVC, USR, or some other mode.
Definition: arm.h:197
struct adiv5_dap * dap
For targets conforming to ARM Debug Interface v5, this handle references the Debug Access Port (DAP) ...
Definition: arm.h:258
struct reg * pc
Handle to the PC; valid in all core modes.
Definition: arm.h:182
struct reg_cache * core_cache
Definition: arm.h:179
struct arm_dpm * dpm
Handle for the debug module, if one is present.
Definition: arm.h:214
int(* mcr)(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t crn, uint32_t crm, uint32_t value)
Write coprocessor register.
Definition: arm.h:242
enum arm_state core_state
Record the current core state: ARM, Thumb, or otherwise.
Definition: arm.h:200
bool d_u_cache_enabled
Definition: armv8.h:160
bool i_cache_enabled
Definition: armv8.h:159
int(* flush_all_data_cache)(struct target *target)
Definition: armv8.h:164
struct arm arm
Definition: armv8.h:188
struct arm_dpm dpm
Definition: armv8.h:192
bool is_armv8r
Definition: armv8.h:203
target_addr_t debug_base
Definition: armv8.h:193
bool sticky_reset
Definition: armv8.h:212
enum run_control_op last_run_control_op
Definition: armv8.h:215
struct armv8_mmu_common armv8_mmu
Definition: armv8.h:205
struct adiv5_ap * debug_ap
Definition: armv8.h:194
struct arm_cti * cti
Definition: armv8.h:207
void(* pre_restore_context)(struct target *target)
Definition: armv8.h:230
int(* examine_debug_reason)(struct target *target)
Definition: armv8.h:227
int(* post_debug_entry)(struct target *target)
Definition: armv8.h:228
int(* read_physical_memory)(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: armv8.h:179
struct armv8_cache_common armv8_cache
Definition: armv8.h:181
bool mmu_enabled
Definition: armv8.h:182
int linked_brp
Definition: breakpoints.h:36
unsigned int length
Definition: breakpoints.h:29
uint8_t * orig_instr
Definition: breakpoints.h:33
enum breakpoint_type type
Definition: breakpoints.h:30
bool is_set
Definition: breakpoints.h:31
unsigned int number
Definition: breakpoints.h:32
uint32_t asid
Definition: breakpoints.h:28
target_addr_t address
Definition: breakpoints.h:27
const char * name
Definition: command.h:239
const struct command_registration * chain
If non-NULL, the commands in chain will be registered in the same context and scope of this registrat...
Definition: command.h:252
A TCL -ish GetOpt like code.
Definition: jim-nvp.h:136
Jim_Interp * interp
Definition: jim-nvp.h:137
bool is_configure
Definition: jim-nvp.h:140
Jim_Obj *const * argv
Definition: jim-nvp.h:139
Name Value Pairs, aka: NVP.
Definition: jim-nvp.h:60
const char * name
Definition: jim-nvp.h:61
int value
Definition: jim-nvp.h:62
Definition: list.h:41
Name Value Pairs, aka: NVP.
Definition: nvp.h:61
int value
Definition: nvp.h:63
const char * name
Definition: nvp.h:62
struct reg_cache * next
Definition: register.h:146
bool valid
Definition: register.h:126
uint8_t * value
Definition: register.h:122
bool dirty
Definition: register.h:124
struct target * target
Definition: target.h:217
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
int32_t coreid
Definition: target.h:123
bool dbgbase_set
Definition: target.h:177
bool dbg_msg_enabled
Definition: target.h:166
enum target_debug_reason debug_reason
Definition: target.h:157
enum target_state state
Definition: target.h:160
uint32_t dbgbase
Definition: target.h:178
void * private_config
Definition: target.h:168
struct list_head * smp_targets
Definition: target.h:191
unsigned int smp
Definition: target.h:190
struct watchpoint * watchpoints
Definition: target.h:163
bool smp_halt_event_postponed
Definition: target.h:194
bool reset_halt
Definition: target.h:147
struct target * next
Definition: target.h:169
enum watchpoint_rw rw
Definition: breakpoints.h:46
bool is_set
Definition: breakpoints.h:47
struct watchpoint * next
Definition: breakpoints.h:49
unsigned int length
Definition: breakpoints.h:43
unsigned int number
Definition: breakpoints.h:48
target_addr_t address
Definition: breakpoints.h:42
uint64_t target_buffer_get_u64(struct target *target, const uint8_t *buffer)
Definition: target.c:316
int target_call_event_callbacks(struct target *target, enum target_event event)
Definition: target.c:1782
void target_free_all_working_areas(struct target *target)
Definition: target.c:2168
void target_buffer_set_u16(struct target *target, uint8_t *buffer, uint16_t value)
Definition: target.c:379
void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value)
Definition: target.c:361
int target_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Write count items of size bytes to the memory of target at the address given.
Definition: target.c:1283
static int srst_asserted
Definition: target.c:2803
int target_register_timer_callback(int(*callback)(void *priv), unsigned int time_ms, enum target_timer_type type, void *priv)
The period is very approximate, the callback can happen much more often or much more rarely than spec...
Definition: target.c:1676
void target_buffer_set_u64(struct target *target, uint8_t *buffer, uint64_t value)
Definition: target.c:352
uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer)
Definition: target.c:343
int target_read_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Read count items of size bytes from the memory of target at the address given.
Definition: target.c:1255
bool target_has_event_action(const struct target *target, enum target_event event)
Returns true only if the target has a handler for the specified event.
Definition: target.c:4787
struct target * get_current_target(struct command_context *cmd_ctx)
Definition: target.c:467
void target_handle_event(struct target *target, enum target_event e)
Definition: target.c:4610
uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer)
Definition: target.c:325
target_debug_reason
Definition: target.h:71
@ DBG_REASON_NOTHALTED
Definition: target.h:77
@ DBG_REASON_DBGRQ
Definition: target.h:72
@ DBG_REASON_WATCHPOINT
Definition: target.h:74
#define ERROR_TARGET_NOT_HALTED
Definition: target.h:795
static bool target_was_examined(const struct target *target)
Definition: target.h:432
@ TARGET_TIMER_TYPE_PERIODIC
Definition: target.h:323
@ TARGET_EVENT_DEBUG_RESUMED
Definition: target.h:275
@ TARGET_EVENT_HALTED
Definition: target.h:255
@ TARGET_EVENT_RESUMED
Definition: target.h:256
@ TARGET_EVENT_DEBUG_HALTED
Definition: target.h:274
@ TARGET_EVENT_RESET_ASSERT
Definition: target.h:267
static const char * target_name(const struct target *target)
Returns the instance-specific name of the specified target.
Definition: target.h:236
target_state
Definition: target.h:55
@ TARGET_RESET
Definition: target.h:59
@ TARGET_DEBUG_RUNNING
Definition: target.h:60
@ TARGET_UNKNOWN
Definition: target.h:56
@ TARGET_HALTED
Definition: target.h:58
@ TARGET_RUNNING
Definition: target.h:57
#define ERROR_TARGET_NOT_EXAMINED
Definition: target.h:802
#define ERROR_TARGET_TIMEOUT
Definition: target.h:794
#define ERROR_TARGET_RESOURCE_NOT_AVAILABLE
Definition: target.h:799
static void target_set_examined(struct target *target)
Sets the examined flag for the given target.
Definition: target.h:439
int target_request(struct target *target, uint32_t request)
int64_t timeval_ms(void)
#define TARGET_ADDR_FMT
Definition: types.h:286
uint64_t target_addr_t
Definition: types.h:279
#define TARGET_PRIxADDR
Definition: types.h:284
#define NULL
Definition: usb.h:16
uint8_t offset[4]
Definition: vdebug.c:9
uint8_t dummy[96]
Definition: vdebug.c:23
uint8_t count[4]
Definition: vdebug.c:22