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