1 /***************************************************************************
2 * Copyright (C) 2015 by David Ung *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
18 ***************************************************************************/
24 #include "breakpoints.h"
26 #include "a64_disassembler.h"
28 #include "target_request.h"
29 #include "target_type.h"
30 #include "armv8_opcodes.h"
31 #include "armv8_cache.h"
32 #include "arm_coresight.h"
33 #include "arm_semihosting.h"
34 #include "jtag/interface.h"
36 #include <helper/time_support.h>
48 struct aarch64_private_config
{
49 struct adiv5_private_config adiv5_config
;
53 static int aarch64_poll(struct target
*target
);
54 static int aarch64_debug_entry(struct target
*target
);
55 static int aarch64_restore_context(struct target
*target
, bool bpwp
);
56 static int aarch64_set_breakpoint(struct target
*target
,
57 struct breakpoint
*breakpoint
, uint8_t matchmode
);
58 static int aarch64_set_context_breakpoint(struct target
*target
,
59 struct breakpoint
*breakpoint
, uint8_t matchmode
);
60 static int aarch64_set_hybrid_breakpoint(struct target
*target
,
61 struct breakpoint
*breakpoint
);
62 static int aarch64_unset_breakpoint(struct target
*target
,
63 struct breakpoint
*breakpoint
);
64 static int aarch64_mmu(struct target
*target
, int *enabled
);
65 static int aarch64_virt2phys(struct target
*target
,
66 target_addr_t virt
, target_addr_t
*phys
);
67 static int aarch64_read_cpu_memory(struct target
*target
,
68 uint64_t address
, uint32_t size
, uint32_t count
, uint8_t *buffer
);
70 static int aarch64_restore_system_control_reg(struct target
*target
)
72 enum arm_mode target_mode
= ARM_MODE_ANY
;
73 int retval
= ERROR_OK
;
76 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
77 struct armv8_common
*armv8
= target_to_armv8(target
);
79 if (aarch64
->system_control_reg
!= aarch64
->system_control_reg_curr
) {
80 aarch64
->system_control_reg_curr
= aarch64
->system_control_reg
;
81 /* LOG_INFO("cp15_control_reg: %8.8" PRIx32, cortex_v8->cp15_control_reg); */
83 switch (armv8
->arm
.core_mode
) {
85 target_mode
= ARMV8_64_EL1H
;
89 instr
= ARMV8_MSR_GP(SYSTEM_SCTLR_EL1
, 0);
93 instr
= ARMV8_MSR_GP(SYSTEM_SCTLR_EL2
, 0);
97 instr
= ARMV8_MSR_GP(SYSTEM_SCTLR_EL3
, 0);
107 instr
= ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
111 LOG_ERROR("cannot read system control register in this mode: (%s : 0x%x)",
112 armv8_mode_name(armv8
->arm
.core_mode
), armv8
->arm
.core_mode
);
116 if (target_mode
!= ARM_MODE_ANY
)
117 armv8_dpm_modeswitch(&armv8
->dpm
, target_mode
);
119 retval
= armv8
->dpm
.instr_write_data_r0(&armv8
->dpm
, instr
, aarch64
->system_control_reg
);
120 if (retval
!= ERROR_OK
)
123 if (target_mode
!= ARM_MODE_ANY
)
124 armv8_dpm_modeswitch(&armv8
->dpm
, ARM_MODE_ANY
);
130 /* modify system_control_reg in order to enable or disable mmu for :
131 * - virt2phys address conversion
132 * - read or write memory in phys or virt address */
133 static int aarch64_mmu_modify(struct target
*target
, int enable
)
135 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
136 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
137 int retval
= ERROR_OK
;
138 enum arm_mode target_mode
= ARM_MODE_ANY
;
142 /* if mmu enabled at target stop and mmu not enable */
143 if (!(aarch64
->system_control_reg
& 0x1U
)) {
144 LOG_ERROR("trying to enable mmu on target stopped with mmu disable");
147 if (!(aarch64
->system_control_reg_curr
& 0x1U
))
148 aarch64
->system_control_reg_curr
|= 0x1U
;
150 if (aarch64
->system_control_reg_curr
& 0x4U
) {
151 /* data cache is active */
152 aarch64
->system_control_reg_curr
&= ~0x4U
;
153 /* flush data cache armv8 function to be called */
154 if (armv8
->armv8_mmu
.armv8_cache
.flush_all_data_cache
)
155 armv8
->armv8_mmu
.armv8_cache
.flush_all_data_cache(target
);
157 if ((aarch64
->system_control_reg_curr
& 0x1U
)) {
158 aarch64
->system_control_reg_curr
&= ~0x1U
;
162 switch (armv8
->arm
.core_mode
) {
164 target_mode
= ARMV8_64_EL1H
;
168 instr
= ARMV8_MSR_GP(SYSTEM_SCTLR_EL1
, 0);
172 instr
= ARMV8_MSR_GP(SYSTEM_SCTLR_EL2
, 0);
176 instr
= ARMV8_MSR_GP(SYSTEM_SCTLR_EL3
, 0);
186 instr
= ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
190 LOG_DEBUG("unknown cpu state 0x%x", armv8
->arm
.core_mode
);
193 if (target_mode
!= ARM_MODE_ANY
)
194 armv8_dpm_modeswitch(&armv8
->dpm
, target_mode
);
196 retval
= armv8
->dpm
.instr_write_data_r0(&armv8
->dpm
, instr
,
197 aarch64
->system_control_reg_curr
);
199 if (target_mode
!= ARM_MODE_ANY
)
200 armv8_dpm_modeswitch(&armv8
->dpm
, ARM_MODE_ANY
);
206 * Basic debug access, very low level assumes state is saved
208 static int aarch64_init_debug_access(struct target
*target
)
210 struct armv8_common
*armv8
= target_to_armv8(target
);
214 LOG_DEBUG("%s", target_name(target
));
216 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
217 armv8
->debug_base
+ CPUV8_DBG_OSLAR
, 0);
218 if (retval
!= ERROR_OK
) {
219 LOG_DEBUG("Examine %s failed", "oslock");
223 /* Clear Sticky Power Down status Bit in PRSR to enable access to
224 the registers in the Core Power Domain */
225 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
226 armv8
->debug_base
+ CPUV8_DBG_PRSR
, &dummy
);
227 if (retval
!= ERROR_OK
)
231 * Static CTI configuration:
232 * Channel 0 -> trigger outputs HALT request to PE
233 * Channel 1 -> trigger outputs Resume request to PE
234 * Gate all channel trigger events from entering the CTM
238 retval
= arm_cti_enable(armv8
->cti
, true);
239 /* By default, gate all channel events to and from the CTM */
240 if (retval
== ERROR_OK
)
241 retval
= arm_cti_write_reg(armv8
->cti
, CTI_GATE
, 0);
242 /* output halt requests to PE on channel 0 event */
243 if (retval
== ERROR_OK
)
244 retval
= arm_cti_write_reg(armv8
->cti
, CTI_OUTEN0
, CTI_CHNL(0));
245 /* output restart requests to PE on channel 1 event */
246 if (retval
== ERROR_OK
)
247 retval
= arm_cti_write_reg(armv8
->cti
, CTI_OUTEN1
, CTI_CHNL(1));
248 if (retval
!= ERROR_OK
)
251 /* Resync breakpoint registers */
256 /* Write to memory mapped registers directly with no cache or mmu handling */
257 static int aarch64_dap_write_memap_register_u32(struct target
*target
,
258 target_addr_t address
,
262 struct armv8_common
*armv8
= target_to_armv8(target
);
264 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
, address
, value
);
269 static int aarch64_dpm_setup(struct aarch64_common
*a8
, uint64_t debug
)
271 struct arm_dpm
*dpm
= &a8
->armv8_common
.dpm
;
274 dpm
->arm
= &a8
->armv8_common
.arm
;
277 retval
= armv8_dpm_setup(dpm
);
278 if (retval
== ERROR_OK
)
279 retval
= armv8_dpm_initialize(dpm
);
284 static int aarch64_set_dscr_bits(struct target
*target
, unsigned long bit_mask
, unsigned long value
)
286 struct armv8_common
*armv8
= target_to_armv8(target
);
287 return armv8_set_dbgreg_bits(armv8
, CPUV8_DBG_DSCR
, bit_mask
, value
);
290 static int aarch64_check_state_one(struct target
*target
,
291 uint32_t mask
, uint32_t val
, int *p_result
, uint32_t *p_prsr
)
293 struct armv8_common
*armv8
= target_to_armv8(target
);
297 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
298 armv8
->debug_base
+ CPUV8_DBG_PRSR
, &prsr
);
299 if (retval
!= ERROR_OK
)
306 *p_result
= (prsr
& mask
) == (val
& mask
);
311 static int aarch64_wait_halt_one(struct target
*target
)
313 int retval
= ERROR_OK
;
316 int64_t then
= timeval_ms();
320 retval
= aarch64_check_state_one(target
, PRSR_HALT
, PRSR_HALT
, &halted
, &prsr
);
321 if (retval
!= ERROR_OK
|| halted
)
324 if (timeval_ms() > then
+ 1000) {
325 retval
= ERROR_TARGET_TIMEOUT
;
326 LOG_DEBUG("target %s timeout, prsr=0x%08"PRIx32
, target_name(target
), prsr
);
333 static int aarch64_prepare_halt_smp(struct target
*target
, bool exc_target
, struct target
**p_first
)
335 int retval
= ERROR_OK
;
336 struct target_list
*head
= target
->head
;
337 struct target
*first
= NULL
;
339 LOG_DEBUG("target %s exc %i", target_name(target
), exc_target
);
342 struct target
*curr
= head
->target
;
343 struct armv8_common
*armv8
= target_to_armv8(curr
);
346 if (exc_target
&& curr
== target
)
348 if (!target_was_examined(curr
))
350 if (curr
->state
!= TARGET_RUNNING
)
353 /* HACK: mark this target as prepared for halting */
354 curr
->debug_reason
= DBG_REASON_DBGRQ
;
356 /* open the gate for channel 0 to let HALT requests pass to the CTM */
357 retval
= arm_cti_ungate_channel(armv8
->cti
, 0);
358 if (retval
== ERROR_OK
)
359 retval
= aarch64_set_dscr_bits(curr
, DSCR_HDE
, DSCR_HDE
);
360 if (retval
!= ERROR_OK
)
363 LOG_DEBUG("target %s prepared", target_name(curr
));
370 if (exc_target
&& first
)
379 static int aarch64_halt_one(struct target
*target
, enum halt_mode mode
)
381 int retval
= ERROR_OK
;
382 struct armv8_common
*armv8
= target_to_armv8(target
);
384 LOG_DEBUG("%s", target_name(target
));
386 /* allow Halting Debug Mode */
387 retval
= aarch64_set_dscr_bits(target
, DSCR_HDE
, DSCR_HDE
);
388 if (retval
!= ERROR_OK
)
391 /* trigger an event on channel 0, this outputs a halt request to the PE */
392 retval
= arm_cti_pulse_channel(armv8
->cti
, 0);
393 if (retval
!= ERROR_OK
)
396 if (mode
== HALT_SYNC
) {
397 retval
= aarch64_wait_halt_one(target
);
398 if (retval
!= ERROR_OK
) {
399 if (retval
== ERROR_TARGET_TIMEOUT
)
400 LOG_ERROR("Timeout waiting for target %s halt", target_name(target
));
408 static int aarch64_halt_smp(struct target
*target
, bool exc_target
)
410 struct target
*next
= target
;
413 /* prepare halt on all PEs of the group */
414 retval
= aarch64_prepare_halt_smp(target
, exc_target
, &next
);
416 if (exc_target
&& next
== target
)
419 /* halt the target PE */
420 if (retval
== ERROR_OK
)
421 retval
= aarch64_halt_one(next
, HALT_LAZY
);
423 if (retval
!= ERROR_OK
)
426 /* wait for all PEs to halt */
427 int64_t then
= timeval_ms();
429 bool all_halted
= true;
430 struct target_list
*head
;
433 foreach_smp_target(head
, target
->head
) {
438 if (!target_was_examined(curr
))
441 retval
= aarch64_check_state_one(curr
, PRSR_HALT
, PRSR_HALT
, &halted
, NULL
);
442 if (retval
!= ERROR_OK
|| !halted
) {
451 if (timeval_ms() > then
+ 1000) {
452 retval
= ERROR_TARGET_TIMEOUT
;
457 * HACK: on Hi6220 there are 8 cores organized in 2 clusters
458 * and it looks like the CTI's are not connected by a common
459 * trigger matrix. It seems that we need to halt one core in each
460 * cluster explicitly. So if we find that a core has not halted
461 * yet, we trigger an explicit halt for the second cluster.
463 retval
= aarch64_halt_one(curr
, HALT_LAZY
);
464 if (retval
!= ERROR_OK
)
471 static int update_halt_gdb(struct target
*target
, enum target_debug_reason debug_reason
)
473 struct target
*gdb_target
= NULL
;
474 struct target_list
*head
;
477 if (debug_reason
== DBG_REASON_NOTHALTED
) {
478 LOG_DEBUG("Halting remaining targets in SMP group");
479 aarch64_halt_smp(target
, true);
482 /* poll all targets in the group, but skip the target that serves GDB */
483 foreach_smp_target(head
, target
->head
) {
485 /* skip calling context */
488 if (!target_was_examined(curr
))
490 /* skip targets that were already halted */
491 if (curr
->state
== TARGET_HALTED
)
493 /* remember the gdb_service->target */
494 if (curr
->gdb_service
)
495 gdb_target
= curr
->gdb_service
->target
;
497 if (curr
== gdb_target
)
500 /* avoid recursion in aarch64_poll() */
506 /* after all targets were updated, poll the gdb serving target */
507 if (gdb_target
&& gdb_target
!= target
)
508 aarch64_poll(gdb_target
);
514 * Aarch64 Run control
517 static int aarch64_poll(struct target
*target
)
519 enum target_state prev_target_state
;
520 int retval
= ERROR_OK
;
523 retval
= aarch64_check_state_one(target
,
524 PRSR_HALT
, PRSR_HALT
, &halted
, NULL
);
525 if (retval
!= ERROR_OK
)
529 prev_target_state
= target
->state
;
530 if (prev_target_state
!= TARGET_HALTED
) {
531 enum target_debug_reason debug_reason
= target
->debug_reason
;
533 /* We have a halting debug event */
534 target
->state
= TARGET_HALTED
;
535 LOG_DEBUG("Target %s halted", target_name(target
));
536 retval
= aarch64_debug_entry(target
);
537 if (retval
!= ERROR_OK
)
541 update_halt_gdb(target
, debug_reason
);
543 if (arm_semihosting(target
, &retval
) != 0)
546 switch (prev_target_state
) {
550 target_call_event_callbacks(target
, TARGET_EVENT_HALTED
);
552 case TARGET_DEBUG_RUNNING
:
553 target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_HALTED
);
560 target
->state
= TARGET_RUNNING
;
565 static int aarch64_halt(struct target
*target
)
567 struct armv8_common
*armv8
= target_to_armv8(target
);
568 armv8
->last_run_control_op
= ARMV8_RUNCONTROL_HALT
;
571 return aarch64_halt_smp(target
, false);
573 return aarch64_halt_one(target
, HALT_SYNC
);
576 static int aarch64_restore_one(struct target
*target
, int current
,
577 uint64_t *address
, int handle_breakpoints
, int debug_execution
)
579 struct armv8_common
*armv8
= target_to_armv8(target
);
580 struct arm
*arm
= &armv8
->arm
;
584 LOG_DEBUG("%s", target_name(target
));
586 if (!debug_execution
)
587 target_free_all_working_areas(target
);
589 /* current = 1: continue on current pc, otherwise continue at <address> */
590 resume_pc
= buf_get_u64(arm
->pc
->value
, 0, 64);
592 resume_pc
= *address
;
594 *address
= resume_pc
;
596 /* Make sure that the Armv7 gdb thumb fixups does not
597 * kill the return address
599 switch (arm
->core_state
) {
601 resume_pc
&= 0xFFFFFFFC;
603 case ARM_STATE_AARCH64
:
604 resume_pc
&= 0xFFFFFFFFFFFFFFFC;
606 case ARM_STATE_THUMB
:
607 case ARM_STATE_THUMB_EE
:
608 /* When the return address is loaded into PC
609 * bit 0 must be 1 to stay in Thumb state
613 case ARM_STATE_JAZELLE
:
614 LOG_ERROR("How do I resume into Jazelle state??");
617 LOG_DEBUG("resume pc = 0x%016" PRIx64
, resume_pc
);
618 buf_set_u64(arm
->pc
->value
, 0, 64, resume_pc
);
619 arm
->pc
->dirty
= true;
620 arm
->pc
->valid
= true;
622 /* called it now before restoring context because it uses cpu
623 * register r0 for restoring system control register */
624 retval
= aarch64_restore_system_control_reg(target
);
625 if (retval
== ERROR_OK
)
626 retval
= aarch64_restore_context(target
, handle_breakpoints
);
632 * prepare single target for restart
636 static int aarch64_prepare_restart_one(struct target
*target
)
638 struct armv8_common
*armv8
= target_to_armv8(target
);
643 LOG_DEBUG("%s", target_name(target
));
645 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
646 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
647 if (retval
!= ERROR_OK
)
650 if ((dscr
& DSCR_ITE
) == 0)
651 LOG_ERROR("DSCR.ITE must be set before leaving debug!");
652 if ((dscr
& DSCR_ERR
) != 0)
653 LOG_ERROR("DSCR.ERR must be cleared before leaving debug!");
655 /* acknowledge a pending CTI halt event */
656 retval
= arm_cti_ack_events(armv8
->cti
, CTI_TRIG(HALT
));
658 * open the CTI gate for channel 1 so that the restart events
659 * get passed along to all PEs. Also close gate for channel 0
660 * to isolate the PE from halt events.
662 if (retval
== ERROR_OK
)
663 retval
= arm_cti_ungate_channel(armv8
->cti
, 1);
664 if (retval
== ERROR_OK
)
665 retval
= arm_cti_gate_channel(armv8
->cti
, 0);
667 /* make sure that DSCR.HDE is set */
668 if (retval
== ERROR_OK
) {
670 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
671 armv8
->debug_base
+ CPUV8_DBG_DSCR
, dscr
);
674 if (retval
== ERROR_OK
) {
675 /* clear sticky bits in PRSR, SDR is now 0 */
676 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
677 armv8
->debug_base
+ CPUV8_DBG_PRSR
, &tmp
);
683 static int aarch64_do_restart_one(struct target
*target
, enum restart_mode mode
)
685 struct armv8_common
*armv8
= target_to_armv8(target
);
688 LOG_DEBUG("%s", target_name(target
));
690 /* trigger an event on channel 1, generates a restart request to the PE */
691 retval
= arm_cti_pulse_channel(armv8
->cti
, 1);
692 if (retval
!= ERROR_OK
)
695 if (mode
== RESTART_SYNC
) {
696 int64_t then
= timeval_ms();
700 * if PRSR.SDR is set now, the target did restart, even
701 * if it's now already halted again (e.g. due to breakpoint)
703 retval
= aarch64_check_state_one(target
,
704 PRSR_SDR
, PRSR_SDR
, &resumed
, NULL
);
705 if (retval
!= ERROR_OK
|| resumed
)
708 if (timeval_ms() > then
+ 1000) {
709 LOG_ERROR("%s: Timeout waiting for resume"PRIx32
, target_name(target
));
710 retval
= ERROR_TARGET_TIMEOUT
;
716 if (retval
!= ERROR_OK
)
719 target
->debug_reason
= DBG_REASON_NOTHALTED
;
720 target
->state
= TARGET_RUNNING
;
725 static int aarch64_restart_one(struct target
*target
, enum restart_mode mode
)
729 LOG_DEBUG("%s", target_name(target
));
731 retval
= aarch64_prepare_restart_one(target
);
732 if (retval
== ERROR_OK
)
733 retval
= aarch64_do_restart_one(target
, mode
);
739 * prepare all but the current target for restart
741 static int aarch64_prep_restart_smp(struct target
*target
, int handle_breakpoints
, struct target
**p_first
)
743 int retval
= ERROR_OK
;
744 struct target_list
*head
;
745 struct target
*first
= NULL
;
748 foreach_smp_target(head
, target
->head
) {
749 struct target
*curr
= head
->target
;
751 /* skip calling target */
754 if (!target_was_examined(curr
))
756 if (curr
->state
!= TARGET_HALTED
)
759 /* resume at current address, not in step mode */
760 retval
= aarch64_restore_one(curr
, 1, &address
, handle_breakpoints
, 0);
761 if (retval
== ERROR_OK
)
762 retval
= aarch64_prepare_restart_one(curr
);
763 if (retval
!= ERROR_OK
) {
764 LOG_ERROR("failed to restore target %s", target_name(curr
));
767 /* remember the first valid target in the group */
779 static int aarch64_step_restart_smp(struct target
*target
)
781 int retval
= ERROR_OK
;
782 struct target_list
*head
;
783 struct target
*first
= NULL
;
785 LOG_DEBUG("%s", target_name(target
));
787 retval
= aarch64_prep_restart_smp(target
, 0, &first
);
788 if (retval
!= ERROR_OK
)
792 retval
= aarch64_do_restart_one(first
, RESTART_LAZY
);
793 if (retval
!= ERROR_OK
) {
794 LOG_DEBUG("error restarting target %s", target_name(first
));
798 int64_t then
= timeval_ms();
800 struct target
*curr
= target
;
801 bool all_resumed
= true;
803 foreach_smp_target(head
, target
->head
) {
812 if (!target_was_examined(curr
))
815 retval
= aarch64_check_state_one(curr
,
816 PRSR_SDR
, PRSR_SDR
, &resumed
, &prsr
);
817 if (retval
!= ERROR_OK
|| (!resumed
&& (prsr
& PRSR_HALT
))) {
822 if (curr
->state
!= TARGET_RUNNING
) {
823 curr
->state
= TARGET_RUNNING
;
824 curr
->debug_reason
= DBG_REASON_NOTHALTED
;
825 target_call_event_callbacks(curr
, TARGET_EVENT_RESUMED
);
832 if (timeval_ms() > then
+ 1000) {
833 LOG_ERROR("%s: timeout waiting for target resume", __func__
);
834 retval
= ERROR_TARGET_TIMEOUT
;
838 * HACK: on Hi6220 there are 8 cores organized in 2 clusters
839 * and it looks like the CTI's are not connected by a common
840 * trigger matrix. It seems that we need to halt one core in each
841 * cluster explicitly. So if we find that a core has not halted
842 * yet, we trigger an explicit resume for the second cluster.
844 retval
= aarch64_do_restart_one(curr
, RESTART_LAZY
);
845 if (retval
!= ERROR_OK
)
852 static int aarch64_resume(struct target
*target
, int current
,
853 target_addr_t address
, int handle_breakpoints
, int debug_execution
)
856 uint64_t addr
= address
;
858 struct armv8_common
*armv8
= target_to_armv8(target
);
859 armv8
->last_run_control_op
= ARMV8_RUNCONTROL_RESUME
;
861 if (target
->state
!= TARGET_HALTED
)
862 return ERROR_TARGET_NOT_HALTED
;
865 * If this target is part of a SMP group, prepare the others
866 * targets for resuming. This involves restoring the complete
867 * target register context and setting up CTI gates to accept
868 * resume events from the trigger matrix.
871 retval
= aarch64_prep_restart_smp(target
, handle_breakpoints
, NULL
);
872 if (retval
!= ERROR_OK
)
876 /* all targets prepared, restore and restart the current target */
877 retval
= aarch64_restore_one(target
, current
, &addr
, handle_breakpoints
,
879 if (retval
== ERROR_OK
)
880 retval
= aarch64_restart_one(target
, RESTART_SYNC
);
881 if (retval
!= ERROR_OK
)
885 int64_t then
= timeval_ms();
887 struct target
*curr
= target
;
888 struct target_list
*head
;
889 bool all_resumed
= true;
891 foreach_smp_target(head
, target
->head
) {
898 if (!target_was_examined(curr
))
901 retval
= aarch64_check_state_one(curr
,
902 PRSR_SDR
, PRSR_SDR
, &resumed
, &prsr
);
903 if (retval
!= ERROR_OK
|| (!resumed
&& (prsr
& PRSR_HALT
))) {
908 if (curr
->state
!= TARGET_RUNNING
) {
909 curr
->state
= TARGET_RUNNING
;
910 curr
->debug_reason
= DBG_REASON_NOTHALTED
;
911 target_call_event_callbacks(curr
, TARGET_EVENT_RESUMED
);
918 if (timeval_ms() > then
+ 1000) {
919 LOG_ERROR("%s: timeout waiting for target %s to resume", __func__
, target_name(curr
));
920 retval
= ERROR_TARGET_TIMEOUT
;
925 * HACK: on Hi6220 there are 8 cores organized in 2 clusters
926 * and it looks like the CTI's are not connected by a common
927 * trigger matrix. It seems that we need to halt one core in each
928 * cluster explicitly. So if we find that a core has not halted
929 * yet, we trigger an explicit resume for the second cluster.
931 retval
= aarch64_do_restart_one(curr
, RESTART_LAZY
);
932 if (retval
!= ERROR_OK
)
937 if (retval
!= ERROR_OK
)
940 target
->debug_reason
= DBG_REASON_NOTHALTED
;
942 if (!debug_execution
) {
943 target
->state
= TARGET_RUNNING
;
944 target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
);
945 LOG_DEBUG("target resumed at 0x%" PRIx64
, addr
);
947 target
->state
= TARGET_DEBUG_RUNNING
;
948 target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_RESUMED
);
949 LOG_DEBUG("target debug resumed at 0x%" PRIx64
, addr
);
955 static int aarch64_debug_entry(struct target
*target
)
957 int retval
= ERROR_OK
;
958 struct armv8_common
*armv8
= target_to_armv8(target
);
959 struct arm_dpm
*dpm
= &armv8
->dpm
;
960 enum arm_state core_state
;
963 /* make sure to clear all sticky errors */
964 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
965 armv8
->debug_base
+ CPUV8_DBG_DRCR
, DRCR_CSE
);
966 if (retval
== ERROR_OK
)
967 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
968 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
969 if (retval
== ERROR_OK
)
970 retval
= arm_cti_ack_events(armv8
->cti
, CTI_TRIG(HALT
));
972 if (retval
!= ERROR_OK
)
975 LOG_DEBUG("%s dscr = 0x%08" PRIx32
, target_name(target
), dscr
);
978 core_state
= armv8_dpm_get_core_state(dpm
);
979 armv8_select_opcodes(armv8
, core_state
== ARM_STATE_AARCH64
);
980 armv8_select_reg_access(armv8
, core_state
== ARM_STATE_AARCH64
);
982 /* close the CTI gate for all events */
983 if (retval
== ERROR_OK
)
984 retval
= arm_cti_write_reg(armv8
->cti
, CTI_GATE
, 0);
985 /* discard async exceptions */
986 if (retval
== ERROR_OK
)
987 retval
= dpm
->instr_cpsr_sync(dpm
);
988 if (retval
!= ERROR_OK
)
991 /* Examine debug reason */
992 armv8_dpm_report_dscr(dpm
, dscr
);
994 /* save the memory address that triggered the watchpoint */
995 if (target
->debug_reason
== DBG_REASON_WATCHPOINT
) {
998 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
999 armv8
->debug_base
+ CPUV8_DBG_EDWAR0
, &tmp
);
1000 if (retval
!= ERROR_OK
)
1002 target_addr_t edwar
= tmp
;
1004 /* EDWAR[63:32] has unknown content in aarch32 state */
1005 if (core_state
== ARM_STATE_AARCH64
) {
1006 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
1007 armv8
->debug_base
+ CPUV8_DBG_EDWAR1
, &tmp
);
1008 if (retval
!= ERROR_OK
)
1010 edwar
|= ((target_addr_t
)tmp
) << 32;
1013 armv8
->dpm
.wp_addr
= edwar
;
1016 retval
= armv8_dpm_read_current_registers(&armv8
->dpm
);
1018 if (retval
== ERROR_OK
&& armv8
->post_debug_entry
)
1019 retval
= armv8
->post_debug_entry(target
);
1024 static int aarch64_post_debug_entry(struct target
*target
)
1026 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1027 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1029 enum arm_mode target_mode
= ARM_MODE_ANY
;
1032 switch (armv8
->arm
.core_mode
) {
1034 target_mode
= ARMV8_64_EL1H
;
1038 instr
= ARMV8_MRS(SYSTEM_SCTLR_EL1
, 0);
1042 instr
= ARMV8_MRS(SYSTEM_SCTLR_EL2
, 0);
1046 instr
= ARMV8_MRS(SYSTEM_SCTLR_EL3
, 0);
1056 instr
= ARMV4_5_MRC(15, 0, 0, 1, 0, 0);
1060 LOG_ERROR("cannot read system control register in this mode: (%s : 0x%x)",
1061 armv8_mode_name(armv8
->arm
.core_mode
), armv8
->arm
.core_mode
);
1065 if (target_mode
!= ARM_MODE_ANY
)
1066 armv8_dpm_modeswitch(&armv8
->dpm
, target_mode
);
1068 retval
= armv8
->dpm
.instr_read_data_r0(&armv8
->dpm
, instr
, &aarch64
->system_control_reg
);
1069 if (retval
!= ERROR_OK
)
1072 if (target_mode
!= ARM_MODE_ANY
)
1073 armv8_dpm_modeswitch(&armv8
->dpm
, ARM_MODE_ANY
);
1075 LOG_DEBUG("System_register: %8.8" PRIx32
, aarch64
->system_control_reg
);
1076 aarch64
->system_control_reg_curr
= aarch64
->system_control_reg
;
1078 if (armv8
->armv8_mmu
.armv8_cache
.info
== -1) {
1079 armv8_identify_cache(armv8
);
1080 armv8_read_mpidr(armv8
);
1083 armv8
->armv8_mmu
.mmu_enabled
=
1084 (aarch64
->system_control_reg
& 0x1U
) ? 1 : 0;
1085 armv8
->armv8_mmu
.armv8_cache
.d_u_cache_enabled
=
1086 (aarch64
->system_control_reg
& 0x4U
) ? 1 : 0;
1087 armv8
->armv8_mmu
.armv8_cache
.i_cache_enabled
=
1088 (aarch64
->system_control_reg
& 0x1000U
) ? 1 : 0;
1093 * single-step a target
1095 static int aarch64_step(struct target
*target
, int current
, target_addr_t address
,
1096 int handle_breakpoints
)
1098 struct armv8_common
*armv8
= target_to_armv8(target
);
1099 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1100 int saved_retval
= ERROR_OK
;
1104 armv8
->last_run_control_op
= ARMV8_RUNCONTROL_STEP
;
1106 if (target
->state
!= TARGET_HALTED
) {
1107 LOG_WARNING("target not halted");
1108 return ERROR_TARGET_NOT_HALTED
;
1111 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
1112 armv8
->debug_base
+ CPUV8_DBG_EDECR
, &edecr
);
1113 /* make sure EDECR.SS is not set when restoring the register */
1115 if (retval
== ERROR_OK
) {
1117 /* set EDECR.SS to enter hardware step mode */
1118 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
1119 armv8
->debug_base
+ CPUV8_DBG_EDECR
, (edecr
|0x4));
1121 /* disable interrupts while stepping */
1122 if (retval
== ERROR_OK
&& aarch64
->isrmasking_mode
== AARCH64_ISRMASK_ON
)
1123 retval
= aarch64_set_dscr_bits(target
, 0x3 << 22, 0x3 << 22);
1124 /* bail out if stepping setup has failed */
1125 if (retval
!= ERROR_OK
)
1128 if (target
->smp
&& (current
== 1)) {
1130 * isolate current target so that it doesn't get resumed
1131 * together with the others
1133 retval
= arm_cti_gate_channel(armv8
->cti
, 1);
1134 /* resume all other targets in the group */
1135 if (retval
== ERROR_OK
)
1136 retval
= aarch64_step_restart_smp(target
);
1137 if (retval
!= ERROR_OK
) {
1138 LOG_ERROR("Failed to restart non-stepping targets in SMP group");
1141 LOG_DEBUG("Restarted all non-stepping targets in SMP group");
1144 /* all other targets running, restore and restart the current target */
1145 retval
= aarch64_restore_one(target
, current
, &address
, 0, 0);
1146 if (retval
== ERROR_OK
)
1147 retval
= aarch64_restart_one(target
, RESTART_LAZY
);
1149 if (retval
!= ERROR_OK
)
1152 LOG_DEBUG("target step-resumed at 0x%" PRIx64
, address
);
1153 if (!handle_breakpoints
)
1154 target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
);
1156 int64_t then
= timeval_ms();
1161 retval
= aarch64_check_state_one(target
,
1162 PRSR_SDR
|PRSR_HALT
, PRSR_SDR
|PRSR_HALT
, &stepped
, &prsr
);
1163 if (retval
!= ERROR_OK
|| stepped
)
1166 if (timeval_ms() > then
+ 100) {
1167 LOG_ERROR("timeout waiting for target %s halt after step",
1168 target_name(target
));
1169 retval
= ERROR_TARGET_TIMEOUT
;
1175 * At least on one SoC (Renesas R8A7795) stepping over a WFI instruction
1176 * causes a timeout. The core takes the step but doesn't complete it and so
1177 * debug state is never entered. However, you can manually halt the core
1178 * as an external debug even is also a WFI wakeup event.
1180 if (retval
== ERROR_TARGET_TIMEOUT
)
1181 saved_retval
= aarch64_halt_one(target
, HALT_SYNC
);
1184 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
1185 armv8
->debug_base
+ CPUV8_DBG_EDECR
, edecr
);
1186 if (retval
!= ERROR_OK
)
1189 /* restore interrupts */
1190 if (aarch64
->isrmasking_mode
== AARCH64_ISRMASK_ON
) {
1191 retval
= aarch64_set_dscr_bits(target
, 0x3 << 22, 0);
1192 if (retval
!= ERROR_OK
)
1196 if (saved_retval
!= ERROR_OK
)
1197 return saved_retval
;
1202 static int aarch64_restore_context(struct target
*target
, bool bpwp
)
1204 struct armv8_common
*armv8
= target_to_armv8(target
);
1205 struct arm
*arm
= &armv8
->arm
;
1209 LOG_DEBUG("%s", target_name(target
));
1211 if (armv8
->pre_restore_context
)
1212 armv8
->pre_restore_context(target
);
1214 retval
= armv8_dpm_write_dirty_registers(&armv8
->dpm
, bpwp
);
1215 if (retval
== ERROR_OK
) {
1216 /* registers are now invalid */
1217 register_cache_invalidate(arm
->core_cache
);
1218 register_cache_invalidate(arm
->core_cache
->next
);
1225 * Cortex-A8 Breakpoint and watchpoint functions
1228 /* Setup hardware Breakpoint Register Pair */
1229 static int aarch64_set_breakpoint(struct target
*target
,
1230 struct breakpoint
*breakpoint
, uint8_t matchmode
)
1235 uint8_t byte_addr_select
= 0x0F;
1236 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1237 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1238 struct aarch64_brp
*brp_list
= aarch64
->brp_list
;
1240 if (breakpoint
->set
) {
1241 LOG_WARNING("breakpoint already set");
1245 if (breakpoint
->type
== BKPT_HARD
) {
1247 while (brp_list
[brp_i
].used
&& (brp_i
< aarch64
->brp_num
))
1249 if (brp_i
>= aarch64
->brp_num
) {
1250 LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1251 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1253 breakpoint
->set
= brp_i
+ 1;
1254 if (breakpoint
->length
== 2)
1255 byte_addr_select
= (3 << (breakpoint
->address
& 0x02));
1256 control
= ((matchmode
& 0x7) << 20)
1258 | (byte_addr_select
<< 5)
1260 brp_list
[brp_i
].used
= 1;
1261 brp_list
[brp_i
].value
= breakpoint
->address
& 0xFFFFFFFFFFFFFFFC;
1262 brp_list
[brp_i
].control
= control
;
1263 bpt_value
= brp_list
[brp_i
].value
;
1265 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1266 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1267 (uint32_t)(bpt_value
& 0xFFFFFFFF));
1268 if (retval
!= ERROR_OK
)
1270 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1271 + CPUV8_DBG_BVR_BASE
+ 4 + 16 * brp_list
[brp_i
].brpn
,
1272 (uint32_t)(bpt_value
>> 32));
1273 if (retval
!= ERROR_OK
)
1276 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1277 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1278 brp_list
[brp_i
].control
);
1279 if (retval
!= ERROR_OK
)
1281 LOG_DEBUG("brp %i control 0x%0" PRIx32
" value 0x%" TARGET_PRIxADDR
, brp_i
,
1282 brp_list
[brp_i
].control
,
1283 brp_list
[brp_i
].value
);
1285 } else if (breakpoint
->type
== BKPT_SOFT
) {
1289 if (armv8_dpm_get_core_state(&armv8
->dpm
) == ARM_STATE_AARCH64
) {
1290 opcode
= ARMV8_HLT(11);
1292 if (breakpoint
->length
!= 4)
1293 LOG_ERROR("bug: breakpoint length should be 4 in AArch64 mode");
1296 * core_state is ARM_STATE_ARM
1297 * in that case the opcode depends on breakpoint length:
1298 * - if length == 4 => A32 opcode
1299 * - if length == 2 => T32 opcode
1300 * - if length == 3 => T32 opcode (refer to gdb doc : ARM-Breakpoint-Kinds)
1301 * in that case the length should be changed from 3 to 4 bytes
1303 opcode
= (breakpoint
->length
== 4) ? ARMV8_HLT_A1(11) :
1304 (uint32_t) (ARMV8_HLT_T1(11) | ARMV8_HLT_T1(11) << 16);
1306 if (breakpoint
->length
== 3)
1307 breakpoint
->length
= 4;
1310 buf_set_u32(code
, 0, 32, opcode
);
1312 retval
= target_read_memory(target
,
1313 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1314 breakpoint
->length
, 1,
1315 breakpoint
->orig_instr
);
1316 if (retval
!= ERROR_OK
)
1319 armv8_cache_d_inner_flush_virt(armv8
,
1320 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1321 breakpoint
->length
);
1323 retval
= target_write_memory(target
,
1324 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1325 breakpoint
->length
, 1, code
);
1326 if (retval
!= ERROR_OK
)
1329 armv8_cache_d_inner_flush_virt(armv8
,
1330 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1331 breakpoint
->length
);
1333 armv8_cache_i_inner_inval_virt(armv8
,
1334 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1335 breakpoint
->length
);
1337 breakpoint
->set
= 0x11; /* Any nice value but 0 */
1340 /* Ensure that halting debug mode is enable */
1341 retval
= aarch64_set_dscr_bits(target
, DSCR_HDE
, DSCR_HDE
);
1342 if (retval
!= ERROR_OK
) {
1343 LOG_DEBUG("Failed to set DSCR.HDE");
1350 static int aarch64_set_context_breakpoint(struct target
*target
,
1351 struct breakpoint
*breakpoint
, uint8_t matchmode
)
1353 int retval
= ERROR_FAIL
;
1356 uint8_t byte_addr_select
= 0x0F;
1357 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1358 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1359 struct aarch64_brp
*brp_list
= aarch64
->brp_list
;
1361 if (breakpoint
->set
) {
1362 LOG_WARNING("breakpoint already set");
1365 /*check available context BRPs*/
1366 while ((brp_list
[brp_i
].used
||
1367 (brp_list
[brp_i
].type
!= BRP_CONTEXT
)) && (brp_i
< aarch64
->brp_num
))
1370 if (brp_i
>= aarch64
->brp_num
) {
1371 LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1375 breakpoint
->set
= brp_i
+ 1;
1376 control
= ((matchmode
& 0x7) << 20)
1378 | (byte_addr_select
<< 5)
1380 brp_list
[brp_i
].used
= 1;
1381 brp_list
[brp_i
].value
= (breakpoint
->asid
);
1382 brp_list
[brp_i
].control
= control
;
1383 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1384 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1385 brp_list
[brp_i
].value
);
1386 if (retval
!= ERROR_OK
)
1388 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1389 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1390 brp_list
[brp_i
].control
);
1391 if (retval
!= ERROR_OK
)
1393 LOG_DEBUG("brp %i control 0x%0" PRIx32
" value 0x%" TARGET_PRIxADDR
, brp_i
,
1394 brp_list
[brp_i
].control
,
1395 brp_list
[brp_i
].value
);
1400 static int aarch64_set_hybrid_breakpoint(struct target
*target
, struct breakpoint
*breakpoint
)
1402 int retval
= ERROR_FAIL
;
1403 int brp_1
= 0; /* holds the contextID pair */
1404 int brp_2
= 0; /* holds the IVA pair */
1405 uint32_t control_ctx
, control_iva
;
1406 uint8_t ctx_byte_addr_select
= 0x0F;
1407 uint8_t iva_byte_addr_select
= 0x0F;
1408 uint8_t ctx_machmode
= 0x03;
1409 uint8_t iva_machmode
= 0x01;
1410 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1411 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1412 struct aarch64_brp
*brp_list
= aarch64
->brp_list
;
1414 if (breakpoint
->set
) {
1415 LOG_WARNING("breakpoint already set");
1418 /*check available context BRPs*/
1419 while ((brp_list
[brp_1
].used
||
1420 (brp_list
[brp_1
].type
!= BRP_CONTEXT
)) && (brp_1
< aarch64
->brp_num
))
1423 LOG_DEBUG("brp(CTX) found num: %d", brp_1
);
1424 if (brp_1
>= aarch64
->brp_num
) {
1425 LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1429 while ((brp_list
[brp_2
].used
||
1430 (brp_list
[brp_2
].type
!= BRP_NORMAL
)) && (brp_2
< aarch64
->brp_num
))
1433 LOG_DEBUG("brp(IVA) found num: %d", brp_2
);
1434 if (brp_2
>= aarch64
->brp_num
) {
1435 LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
1439 breakpoint
->set
= brp_1
+ 1;
1440 breakpoint
->linked_brp
= brp_2
;
1441 control_ctx
= ((ctx_machmode
& 0x7) << 20)
1444 | (ctx_byte_addr_select
<< 5)
1446 brp_list
[brp_1
].used
= 1;
1447 brp_list
[brp_1
].value
= (breakpoint
->asid
);
1448 brp_list
[brp_1
].control
= control_ctx
;
1449 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1450 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_1
].brpn
,
1451 brp_list
[brp_1
].value
);
1452 if (retval
!= ERROR_OK
)
1454 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1455 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_1
].brpn
,
1456 brp_list
[brp_1
].control
);
1457 if (retval
!= ERROR_OK
)
1460 control_iva
= ((iva_machmode
& 0x7) << 20)
1463 | (iva_byte_addr_select
<< 5)
1465 brp_list
[brp_2
].used
= 1;
1466 brp_list
[brp_2
].value
= breakpoint
->address
& 0xFFFFFFFFFFFFFFFC;
1467 brp_list
[brp_2
].control
= control_iva
;
1468 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1469 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_2
].brpn
,
1470 brp_list
[brp_2
].value
& 0xFFFFFFFF);
1471 if (retval
!= ERROR_OK
)
1473 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1474 + CPUV8_DBG_BVR_BASE
+ 4 + 16 * brp_list
[brp_2
].brpn
,
1475 brp_list
[brp_2
].value
>> 32);
1476 if (retval
!= ERROR_OK
)
1478 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1479 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_2
].brpn
,
1480 brp_list
[brp_2
].control
);
1481 if (retval
!= ERROR_OK
)
1487 static int aarch64_unset_breakpoint(struct target
*target
, struct breakpoint
*breakpoint
)
1490 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1491 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1492 struct aarch64_brp
*brp_list
= aarch64
->brp_list
;
1494 if (!breakpoint
->set
) {
1495 LOG_WARNING("breakpoint not set");
1499 if (breakpoint
->type
== BKPT_HARD
) {
1500 if ((breakpoint
->address
!= 0) && (breakpoint
->asid
!= 0)) {
1501 int brp_i
= breakpoint
->set
- 1;
1502 int brp_j
= breakpoint
->linked_brp
;
1503 if ((brp_i
< 0) || (brp_i
>= aarch64
->brp_num
)) {
1504 LOG_DEBUG("Invalid BRP number in breakpoint");
1507 LOG_DEBUG("rbp %i control 0x%0" PRIx32
" value 0x%" TARGET_PRIxADDR
, brp_i
,
1508 brp_list
[brp_i
].control
, brp_list
[brp_i
].value
);
1509 brp_list
[brp_i
].used
= 0;
1510 brp_list
[brp_i
].value
= 0;
1511 brp_list
[brp_i
].control
= 0;
1512 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1513 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1514 brp_list
[brp_i
].control
);
1515 if (retval
!= ERROR_OK
)
1517 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1518 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1519 (uint32_t)brp_list
[brp_i
].value
);
1520 if (retval
!= ERROR_OK
)
1522 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1523 + CPUV8_DBG_BVR_BASE
+ 4 + 16 * brp_list
[brp_i
].brpn
,
1524 (uint32_t)brp_list
[brp_i
].value
);
1525 if (retval
!= ERROR_OK
)
1527 if ((brp_j
< 0) || (brp_j
>= aarch64
->brp_num
)) {
1528 LOG_DEBUG("Invalid BRP number in breakpoint");
1531 LOG_DEBUG("rbp %i control 0x%0" PRIx32
" value 0x%0" PRIx64
, brp_j
,
1532 brp_list
[brp_j
].control
, brp_list
[brp_j
].value
);
1533 brp_list
[brp_j
].used
= 0;
1534 brp_list
[brp_j
].value
= 0;
1535 brp_list
[brp_j
].control
= 0;
1536 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1537 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_j
].brpn
,
1538 brp_list
[brp_j
].control
);
1539 if (retval
!= ERROR_OK
)
1541 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1542 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_j
].brpn
,
1543 (uint32_t)brp_list
[brp_j
].value
);
1544 if (retval
!= ERROR_OK
)
1546 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1547 + CPUV8_DBG_BVR_BASE
+ 4 + 16 * brp_list
[brp_j
].brpn
,
1548 (uint32_t)brp_list
[brp_j
].value
);
1549 if (retval
!= ERROR_OK
)
1552 breakpoint
->linked_brp
= 0;
1553 breakpoint
->set
= 0;
1557 int brp_i
= breakpoint
->set
- 1;
1558 if ((brp_i
< 0) || (brp_i
>= aarch64
->brp_num
)) {
1559 LOG_DEBUG("Invalid BRP number in breakpoint");
1562 LOG_DEBUG("rbp %i control 0x%0" PRIx32
" value 0x%0" PRIx64
, brp_i
,
1563 brp_list
[brp_i
].control
, brp_list
[brp_i
].value
);
1564 brp_list
[brp_i
].used
= 0;
1565 brp_list
[brp_i
].value
= 0;
1566 brp_list
[brp_i
].control
= 0;
1567 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1568 + CPUV8_DBG_BCR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1569 brp_list
[brp_i
].control
);
1570 if (retval
!= ERROR_OK
)
1572 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1573 + CPUV8_DBG_BVR_BASE
+ 16 * brp_list
[brp_i
].brpn
,
1574 brp_list
[brp_i
].value
);
1575 if (retval
!= ERROR_OK
)
1578 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1579 + CPUV8_DBG_BVR_BASE
+ 4 + 16 * brp_list
[brp_i
].brpn
,
1580 (uint32_t)brp_list
[brp_i
].value
);
1581 if (retval
!= ERROR_OK
)
1583 breakpoint
->set
= 0;
1587 /* restore original instruction (kept in target endianness) */
1589 armv8_cache_d_inner_flush_virt(armv8
,
1590 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1591 breakpoint
->length
);
1593 if (breakpoint
->length
== 4) {
1594 retval
= target_write_memory(target
,
1595 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1596 4, 1, breakpoint
->orig_instr
);
1597 if (retval
!= ERROR_OK
)
1600 retval
= target_write_memory(target
,
1601 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1602 2, 1, breakpoint
->orig_instr
);
1603 if (retval
!= ERROR_OK
)
1607 armv8_cache_d_inner_flush_virt(armv8
,
1608 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1609 breakpoint
->length
);
1611 armv8_cache_i_inner_inval_virt(armv8
,
1612 breakpoint
->address
& 0xFFFFFFFFFFFFFFFE,
1613 breakpoint
->length
);
1615 breakpoint
->set
= 0;
1620 static int aarch64_add_breakpoint(struct target
*target
,
1621 struct breakpoint
*breakpoint
)
1623 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1625 if ((breakpoint
->type
== BKPT_HARD
) && (aarch64
->brp_num_available
< 1)) {
1626 LOG_INFO("no hardware breakpoint available");
1627 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1630 if (breakpoint
->type
== BKPT_HARD
)
1631 aarch64
->brp_num_available
--;
1633 return aarch64_set_breakpoint(target
, breakpoint
, 0x00); /* Exact match */
1636 static int aarch64_add_context_breakpoint(struct target
*target
,
1637 struct breakpoint
*breakpoint
)
1639 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1641 if ((breakpoint
->type
== BKPT_HARD
) && (aarch64
->brp_num_available
< 1)) {
1642 LOG_INFO("no hardware breakpoint available");
1643 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1646 if (breakpoint
->type
== BKPT_HARD
)
1647 aarch64
->brp_num_available
--;
1649 return aarch64_set_context_breakpoint(target
, breakpoint
, 0x02); /* asid match */
1652 static int aarch64_add_hybrid_breakpoint(struct target
*target
,
1653 struct breakpoint
*breakpoint
)
1655 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1657 if ((breakpoint
->type
== BKPT_HARD
) && (aarch64
->brp_num_available
< 1)) {
1658 LOG_INFO("no hardware breakpoint available");
1659 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1662 if (breakpoint
->type
== BKPT_HARD
)
1663 aarch64
->brp_num_available
--;
1665 return aarch64_set_hybrid_breakpoint(target
, breakpoint
); /* ??? */
1668 static int aarch64_remove_breakpoint(struct target
*target
, struct breakpoint
*breakpoint
)
1670 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1673 /* It is perfectly possible to remove breakpoints while the target is running */
1674 if (target
->state
!= TARGET_HALTED
) {
1675 LOG_WARNING("target not halted");
1676 return ERROR_TARGET_NOT_HALTED
;
1680 if (breakpoint
->set
) {
1681 aarch64_unset_breakpoint(target
, breakpoint
);
1682 if (breakpoint
->type
== BKPT_HARD
)
1683 aarch64
->brp_num_available
++;
1689 /* Setup hardware Watchpoint Register Pair */
1690 static int aarch64_set_watchpoint(struct target
*target
,
1691 struct watchpoint
*watchpoint
)
1695 uint32_t control
, offset
, length
;
1696 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1697 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1698 struct aarch64_brp
*wp_list
= aarch64
->wp_list
;
1700 if (watchpoint
->set
) {
1701 LOG_WARNING("watchpoint already set");
1705 while (wp_list
[wp_i
].used
&& (wp_i
< aarch64
->wp_num
))
1707 if (wp_i
>= aarch64
->wp_num
) {
1708 LOG_ERROR("ERROR Can not find free Watchpoint Register Pair");
1709 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1712 control
= (1 << 0) /* enable */
1713 | (3 << 1) /* both user and privileged access */
1714 | (1 << 13); /* higher mode control */
1716 switch (watchpoint
->rw
) {
1728 /* Match up to 8 bytes. */
1729 offset
= watchpoint
->address
& 7;
1730 length
= watchpoint
->length
;
1731 if (offset
+ length
> sizeof(uint64_t)) {
1732 length
= sizeof(uint64_t) - offset
;
1733 LOG_WARNING("Adjust watchpoint match inside 8-byte boundary");
1735 for (; length
> 0; offset
++, length
--)
1736 control
|= (1 << offset
) << 5;
1738 wp_list
[wp_i
].value
= watchpoint
->address
& 0xFFFFFFFFFFFFFFF8ULL
;
1739 wp_list
[wp_i
].control
= control
;
1741 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1742 + CPUV8_DBG_WVR_BASE
+ 16 * wp_list
[wp_i
].brpn
,
1743 (uint32_t)(wp_list
[wp_i
].value
& 0xFFFFFFFF));
1744 if (retval
!= ERROR_OK
)
1746 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1747 + CPUV8_DBG_WVR_BASE
+ 4 + 16 * wp_list
[wp_i
].brpn
,
1748 (uint32_t)(wp_list
[wp_i
].value
>> 32));
1749 if (retval
!= ERROR_OK
)
1752 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1753 + CPUV8_DBG_WCR_BASE
+ 16 * wp_list
[wp_i
].brpn
,
1755 if (retval
!= ERROR_OK
)
1757 LOG_DEBUG("wp %i control 0x%0" PRIx32
" value 0x%" TARGET_PRIxADDR
, wp_i
,
1758 wp_list
[wp_i
].control
, wp_list
[wp_i
].value
);
1760 /* Ensure that halting debug mode is enable */
1761 retval
= aarch64_set_dscr_bits(target
, DSCR_HDE
, DSCR_HDE
);
1762 if (retval
!= ERROR_OK
) {
1763 LOG_DEBUG("Failed to set DSCR.HDE");
1767 wp_list
[wp_i
].used
= 1;
1768 watchpoint
->set
= wp_i
+ 1;
1773 /* Clear hardware Watchpoint Register Pair */
1774 static int aarch64_unset_watchpoint(struct target
*target
,
1775 struct watchpoint
*watchpoint
)
1778 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1779 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
1780 struct aarch64_brp
*wp_list
= aarch64
->wp_list
;
1782 if (!watchpoint
->set
) {
1783 LOG_WARNING("watchpoint not set");
1787 wp_i
= watchpoint
->set
- 1;
1788 if ((wp_i
< 0) || (wp_i
>= aarch64
->wp_num
)) {
1789 LOG_DEBUG("Invalid WP number in watchpoint");
1792 LOG_DEBUG("rwp %i control 0x%0" PRIx32
" value 0x%0" PRIx64
, wp_i
,
1793 wp_list
[wp_i
].control
, wp_list
[wp_i
].value
);
1794 wp_list
[wp_i
].used
= 0;
1795 wp_list
[wp_i
].value
= 0;
1796 wp_list
[wp_i
].control
= 0;
1797 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1798 + CPUV8_DBG_WCR_BASE
+ 16 * wp_list
[wp_i
].brpn
,
1799 wp_list
[wp_i
].control
);
1800 if (retval
!= ERROR_OK
)
1802 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1803 + CPUV8_DBG_WVR_BASE
+ 16 * wp_list
[wp_i
].brpn
,
1804 wp_list
[wp_i
].value
);
1805 if (retval
!= ERROR_OK
)
1808 retval
= aarch64_dap_write_memap_register_u32(target
, armv8
->debug_base
1809 + CPUV8_DBG_WVR_BASE
+ 4 + 16 * wp_list
[wp_i
].brpn
,
1810 (uint32_t)wp_list
[wp_i
].value
);
1811 if (retval
!= ERROR_OK
)
1813 watchpoint
->set
= 0;
1818 static int aarch64_add_watchpoint(struct target
*target
,
1819 struct watchpoint
*watchpoint
)
1822 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1824 if (aarch64
->wp_num_available
< 1) {
1825 LOG_INFO("no hardware watchpoint available");
1826 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1829 retval
= aarch64_set_watchpoint(target
, watchpoint
);
1830 if (retval
== ERROR_OK
)
1831 aarch64
->wp_num_available
--;
1836 static int aarch64_remove_watchpoint(struct target
*target
,
1837 struct watchpoint
*watchpoint
)
1839 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
1841 if (watchpoint
->set
) {
1842 aarch64_unset_watchpoint(target
, watchpoint
);
1843 aarch64
->wp_num_available
++;
1850 * find out which watchpoint hits
1851 * get exception address and compare the address to watchpoints
1853 int aarch64_hit_watchpoint(struct target
*target
,
1854 struct watchpoint
**hit_watchpoint
)
1856 if (target
->debug_reason
!= DBG_REASON_WATCHPOINT
)
1859 struct armv8_common
*armv8
= target_to_armv8(target
);
1861 target_addr_t exception_address
;
1862 struct watchpoint
*wp
;
1864 exception_address
= armv8
->dpm
.wp_addr
;
1866 if (exception_address
== 0xFFFFFFFF)
1869 for (wp
= target
->watchpoints
; wp
; wp
= wp
->next
)
1870 if (exception_address
>= wp
->address
&& exception_address
< (wp
->address
+ wp
->length
)) {
1871 *hit_watchpoint
= wp
;
1879 * Cortex-A8 Reset functions
1882 static int aarch64_enable_reset_catch(struct target
*target
, bool enable
)
1884 struct armv8_common
*armv8
= target_to_armv8(target
);
1888 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
1889 armv8
->debug_base
+ CPUV8_DBG_EDECR
, &edecr
);
1890 LOG_DEBUG("EDECR = 0x%08" PRIx32
", enable=%d", edecr
, enable
);
1891 if (retval
!= ERROR_OK
)
1899 return mem_ap_write_atomic_u32(armv8
->debug_ap
,
1900 armv8
->debug_base
+ CPUV8_DBG_EDECR
, edecr
);
1903 static int aarch64_clear_reset_catch(struct target
*target
)
1905 struct armv8_common
*armv8
= target_to_armv8(target
);
1910 /* check if Reset Catch debug event triggered as expected */
1911 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
1912 armv8
->debug_base
+ CPUV8_DBG_EDESR
, &edesr
);
1913 if (retval
!= ERROR_OK
)
1916 was_triggered
= !!(edesr
& ESR_RC
);
1917 LOG_DEBUG("Reset Catch debug event %s",
1918 was_triggered
? "triggered" : "NOT triggered!");
1920 if (was_triggered
) {
1921 /* clear pending Reset Catch debug event */
1923 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
1924 armv8
->debug_base
+ CPUV8_DBG_EDESR
, edesr
);
1925 if (retval
!= ERROR_OK
)
1932 static int aarch64_assert_reset(struct target
*target
)
1934 struct armv8_common
*armv8
= target_to_armv8(target
);
1935 enum reset_types reset_config
= jtag_get_reset_config();
1940 /* Issue some kind of warm reset. */
1941 if (target_has_event_action(target
, TARGET_EVENT_RESET_ASSERT
))
1942 target_handle_event(target
, TARGET_EVENT_RESET_ASSERT
);
1943 else if (reset_config
& RESET_HAS_SRST
) {
1944 bool srst_asserted
= false;
1946 if (target
->reset_halt
) {
1947 if (target_was_examined(target
)) {
1949 if (reset_config
& RESET_SRST_NO_GATING
) {
1951 * SRST needs to be asserted *before* Reset Catch
1952 * debug event can be set up.
1954 adapter_assert_reset();
1955 srst_asserted
= true;
1957 /* make sure to clear all sticky errors */
1958 mem_ap_write_atomic_u32(armv8
->debug_ap
,
1959 armv8
->debug_base
+ CPUV8_DBG_DRCR
, DRCR_CSE
);
1962 /* set up Reset Catch debug event to halt the CPU after reset */
1963 retval
= aarch64_enable_reset_catch(target
, true);
1964 if (retval
!= ERROR_OK
)
1965 LOG_WARNING("%s: Error enabling Reset Catch debug event; the CPU will not halt immediately after reset!",
1966 target_name(target
));
1968 LOG_WARNING("%s: Target not examined, will not halt immediately after reset!",
1969 target_name(target
));
1973 /* REVISIT handle "pulls" cases, if there's
1974 * hardware that needs them to work.
1977 adapter_assert_reset();
1979 LOG_ERROR("%s: how to reset?", target_name(target
));
1983 /* registers are now invalid */
1984 if (target_was_examined(target
)) {
1985 register_cache_invalidate(armv8
->arm
.core_cache
);
1986 register_cache_invalidate(armv8
->arm
.core_cache
->next
);
1989 target
->state
= TARGET_RESET
;
1994 static int aarch64_deassert_reset(struct target
*target
)
2000 /* be certain SRST is off */
2001 adapter_deassert_reset();
2003 if (!target_was_examined(target
))
2006 retval
= aarch64_init_debug_access(target
);
2007 if (retval
!= ERROR_OK
)
2010 retval
= aarch64_poll(target
);
2011 if (retval
!= ERROR_OK
)
2014 if (target
->reset_halt
) {
2015 /* clear pending Reset Catch debug event */
2016 retval
= aarch64_clear_reset_catch(target
);
2017 if (retval
!= ERROR_OK
)
2018 LOG_WARNING("%s: Clearing Reset Catch debug event failed",
2019 target_name(target
));
2021 /* disable Reset Catch debug event */
2022 retval
= aarch64_enable_reset_catch(target
, false);
2023 if (retval
!= ERROR_OK
)
2024 LOG_WARNING("%s: Disabling Reset Catch debug event failed",
2025 target_name(target
));
2027 if (target
->state
!= TARGET_HALTED
) {
2028 LOG_WARNING("%s: ran after reset and before halt ...",
2029 target_name(target
));
2030 retval
= target_halt(target
);
2031 if (retval
!= ERROR_OK
)
2039 static int aarch64_write_cpu_memory_slow(struct target
*target
,
2040 uint32_t size
, uint32_t count
, const uint8_t *buffer
, uint32_t *dscr
)
2042 struct armv8_common
*armv8
= target_to_armv8(target
);
2043 struct arm_dpm
*dpm
= &armv8
->dpm
;
2044 struct arm
*arm
= &armv8
->arm
;
2047 armv8_reg_current(arm
, 1)->dirty
= true;
2049 /* change DCC to normal mode if necessary */
2050 if (*dscr
& DSCR_MA
) {
2052 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2053 armv8
->debug_base
+ CPUV8_DBG_DSCR
, *dscr
);
2054 if (retval
!= ERROR_OK
)
2059 uint32_t data
, opcode
;
2061 /* write the data to store into DTRRX */
2065 data
= target_buffer_get_u16(target
, buffer
);
2067 data
= target_buffer_get_u32(target
, buffer
);
2068 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2069 armv8
->debug_base
+ CPUV8_DBG_DTRRX
, data
);
2070 if (retval
!= ERROR_OK
)
2073 if (arm
->core_state
== ARM_STATE_AARCH64
)
2074 retval
= dpm
->instr_execute(dpm
, ARMV8_MRS(SYSTEM_DBG_DTRRX_EL0
, 1));
2076 retval
= dpm
->instr_execute(dpm
, ARMV4_5_MRC(14, 0, 1, 0, 5, 0));
2077 if (retval
!= ERROR_OK
)
2081 opcode
= armv8_opcode(armv8
, ARMV8_OPC_STRB_IP
);
2083 opcode
= armv8_opcode(armv8
, ARMV8_OPC_STRH_IP
);
2085 opcode
= armv8_opcode(armv8
, ARMV8_OPC_STRW_IP
);
2086 retval
= dpm
->instr_execute(dpm
, opcode
);
2087 if (retval
!= ERROR_OK
)
2098 static int aarch64_write_cpu_memory_fast(struct target
*target
,
2099 uint32_t count
, const uint8_t *buffer
, uint32_t *dscr
)
2101 struct armv8_common
*armv8
= target_to_armv8(target
);
2102 struct arm
*arm
= &armv8
->arm
;
2105 armv8_reg_current(arm
, 1)->dirty
= true;
2107 /* Step 1.d - Change DCC to memory mode */
2109 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2110 armv8
->debug_base
+ CPUV8_DBG_DSCR
, *dscr
);
2111 if (retval
!= ERROR_OK
)
2115 /* Step 2.a - Do the write */
2116 retval
= mem_ap_write_buf_noincr(armv8
->debug_ap
,
2117 buffer
, 4, count
, armv8
->debug_base
+ CPUV8_DBG_DTRRX
);
2118 if (retval
!= ERROR_OK
)
2121 /* Step 3.a - Switch DTR mode back to Normal mode */
2123 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2124 armv8
->debug_base
+ CPUV8_DBG_DSCR
, *dscr
);
2125 if (retval
!= ERROR_OK
)
2131 static int aarch64_write_cpu_memory(struct target
*target
,
2132 uint64_t address
, uint32_t size
,
2133 uint32_t count
, const uint8_t *buffer
)
2135 /* write memory through APB-AP */
2136 int retval
= ERROR_COMMAND_SYNTAX_ERROR
;
2137 struct armv8_common
*armv8
= target_to_armv8(target
);
2138 struct arm_dpm
*dpm
= &armv8
->dpm
;
2139 struct arm
*arm
= &armv8
->arm
;
2142 if (target
->state
!= TARGET_HALTED
) {
2143 LOG_WARNING("target not halted");
2144 return ERROR_TARGET_NOT_HALTED
;
2147 /* Mark register X0 as dirty, as it will be used
2148 * for transferring the data.
2149 * It will be restored automatically when exiting
2152 armv8_reg_current(arm
, 0)->dirty
= true;
2154 /* This algorithm comes from DDI0487A.g, chapter J9.1 */
2157 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2158 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2159 if (retval
!= ERROR_OK
)
2162 /* Set Normal access mode */
2163 dscr
= (dscr
& ~DSCR_MA
);
2164 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2165 armv8
->debug_base
+ CPUV8_DBG_DSCR
, dscr
);
2166 if (retval
!= ERROR_OK
)
2169 if (arm
->core_state
== ARM_STATE_AARCH64
) {
2170 /* Write X0 with value 'address' using write procedure */
2171 /* Step 1.a+b - Write the address for read access into DBGDTR_EL0 */
2172 /* Step 1.c - Copy value from DTR to R0 using instruction mrs DBGDTR_EL0, x0 */
2173 retval
= dpm
->instr_write_data_dcc_64(dpm
,
2174 ARMV8_MRS(SYSTEM_DBG_DBGDTR_EL0
, 0), address
);
2176 /* Write R0 with value 'address' using write procedure */
2177 /* Step 1.a+b - Write the address for read access into DBGDTRRX */
2178 /* Step 1.c - Copy value from DTR to R0 using instruction mrc DBGDTRTXint, r0 */
2179 retval
= dpm
->instr_write_data_dcc(dpm
,
2180 ARMV4_5_MRC(14, 0, 0, 0, 5, 0), address
);
2183 if (retval
!= ERROR_OK
)
2186 if (size
== 4 && (address
% 4) == 0)
2187 retval
= aarch64_write_cpu_memory_fast(target
, count
, buffer
, &dscr
);
2189 retval
= aarch64_write_cpu_memory_slow(target
, size
, count
, buffer
, &dscr
);
2191 if (retval
!= ERROR_OK
) {
2192 /* Unset DTR mode */
2193 mem_ap_read_atomic_u32(armv8
->debug_ap
,
2194 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2196 mem_ap_write_atomic_u32(armv8
->debug_ap
,
2197 armv8
->debug_base
+ CPUV8_DBG_DSCR
, dscr
);
2200 /* Check for sticky abort flags in the DSCR */
2201 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2202 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2203 if (retval
!= ERROR_OK
)
2207 if (dscr
& (DSCR_ERR
| DSCR_SYS_ERROR_PEND
)) {
2208 /* Abort occurred - clear it and exit */
2209 LOG_ERROR("abort occurred - dscr = 0x%08" PRIx32
, dscr
);
2210 armv8_dpm_handle_exception(dpm
, true);
2218 static int aarch64_read_cpu_memory_slow(struct target
*target
,
2219 uint32_t size
, uint32_t count
, uint8_t *buffer
, uint32_t *dscr
)
2221 struct armv8_common
*armv8
= target_to_armv8(target
);
2222 struct arm_dpm
*dpm
= &armv8
->dpm
;
2223 struct arm
*arm
= &armv8
->arm
;
2226 armv8_reg_current(arm
, 1)->dirty
= true;
2228 /* change DCC to normal mode (if necessary) */
2229 if (*dscr
& DSCR_MA
) {
2231 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2232 armv8
->debug_base
+ CPUV8_DBG_DSCR
, *dscr
);
2233 if (retval
!= ERROR_OK
)
2238 uint32_t opcode
, data
;
2241 opcode
= armv8_opcode(armv8
, ARMV8_OPC_LDRB_IP
);
2243 opcode
= armv8_opcode(armv8
, ARMV8_OPC_LDRH_IP
);
2245 opcode
= armv8_opcode(armv8
, ARMV8_OPC_LDRW_IP
);
2246 retval
= dpm
->instr_execute(dpm
, opcode
);
2247 if (retval
!= ERROR_OK
)
2250 if (arm
->core_state
== ARM_STATE_AARCH64
)
2251 retval
= dpm
->instr_execute(dpm
, ARMV8_MSR_GP(SYSTEM_DBG_DTRTX_EL0
, 1));
2253 retval
= dpm
->instr_execute(dpm
, ARMV4_5_MCR(14, 0, 1, 0, 5, 0));
2254 if (retval
!= ERROR_OK
)
2257 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2258 armv8
->debug_base
+ CPUV8_DBG_DTRTX
, &data
);
2259 if (retval
!= ERROR_OK
)
2263 *buffer
= (uint8_t)data
;
2265 target_buffer_set_u16(target
, buffer
, (uint16_t)data
);
2267 target_buffer_set_u32(target
, buffer
, data
);
2277 static int aarch64_read_cpu_memory_fast(struct target
*target
,
2278 uint32_t count
, uint8_t *buffer
, uint32_t *dscr
)
2280 struct armv8_common
*armv8
= target_to_armv8(target
);
2281 struct arm_dpm
*dpm
= &armv8
->dpm
;
2282 struct arm
*arm
= &armv8
->arm
;
2286 /* Mark X1 as dirty */
2287 armv8_reg_current(arm
, 1)->dirty
= true;
2289 if (arm
->core_state
== ARM_STATE_AARCH64
) {
2290 /* Step 1.d - Dummy operation to ensure EDSCR.Txfull == 1 */
2291 retval
= dpm
->instr_execute(dpm
, ARMV8_MSR_GP(SYSTEM_DBG_DBGDTR_EL0
, 0));
2293 /* Step 1.d - Dummy operation to ensure EDSCR.Txfull == 1 */
2294 retval
= dpm
->instr_execute(dpm
, ARMV4_5_MCR(14, 0, 0, 0, 5, 0));
2297 if (retval
!= ERROR_OK
)
2300 /* Step 1.e - Change DCC to memory mode */
2302 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2303 armv8
->debug_base
+ CPUV8_DBG_DSCR
, *dscr
);
2304 if (retval
!= ERROR_OK
)
2307 /* Step 1.f - read DBGDTRTX and discard the value */
2308 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2309 armv8
->debug_base
+ CPUV8_DBG_DTRTX
, &value
);
2310 if (retval
!= ERROR_OK
)
2314 /* Read the data - Each read of the DTRTX register causes the instruction to be reissued
2315 * Abort flags are sticky, so can be read at end of transactions
2317 * This data is read in aligned to 32 bit boundary.
2321 /* Step 2.a - Loop n-1 times, each read of DBGDTRTX reads the data from [X0] and
2322 * increments X0 by 4. */
2323 retval
= mem_ap_read_buf_noincr(armv8
->debug_ap
, buffer
, 4, count
,
2324 armv8
->debug_base
+ CPUV8_DBG_DTRTX
);
2325 if (retval
!= ERROR_OK
)
2329 /* Step 3.a - set DTR access mode back to Normal mode */
2331 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2332 armv8
->debug_base
+ CPUV8_DBG_DSCR
, *dscr
);
2333 if (retval
!= ERROR_OK
)
2336 /* Step 3.b - read DBGDTRTX for the final value */
2337 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2338 armv8
->debug_base
+ CPUV8_DBG_DTRTX
, &value
);
2339 if (retval
!= ERROR_OK
)
2342 target_buffer_set_u32(target
, buffer
+ count
* 4, value
);
2346 static int aarch64_read_cpu_memory(struct target
*target
,
2347 target_addr_t address
, uint32_t size
,
2348 uint32_t count
, uint8_t *buffer
)
2350 /* read memory through APB-AP */
2351 int retval
= ERROR_COMMAND_SYNTAX_ERROR
;
2352 struct armv8_common
*armv8
= target_to_armv8(target
);
2353 struct arm_dpm
*dpm
= &armv8
->dpm
;
2354 struct arm
*arm
= &armv8
->arm
;
2357 LOG_DEBUG("Reading CPU memory address 0x%016" PRIx64
" size %" PRIu32
" count %" PRIu32
,
2358 address
, size
, count
);
2360 if (target
->state
!= TARGET_HALTED
) {
2361 LOG_WARNING("target not halted");
2362 return ERROR_TARGET_NOT_HALTED
;
2365 /* Mark register X0 as dirty, as it will be used
2366 * for transferring the data.
2367 * It will be restored automatically when exiting
2370 armv8_reg_current(arm
, 0)->dirty
= true;
2373 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2374 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2375 if (retval
!= ERROR_OK
)
2378 /* This algorithm comes from DDI0487A.g, chapter J9.1 */
2380 /* Set Normal access mode */
2382 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2383 armv8
->debug_base
+ CPUV8_DBG_DSCR
, dscr
);
2384 if (retval
!= ERROR_OK
)
2387 if (arm
->core_state
== ARM_STATE_AARCH64
) {
2388 /* Write X0 with value 'address' using write procedure */
2389 /* Step 1.a+b - Write the address for read access into DBGDTR_EL0 */
2390 /* Step 1.c - Copy value from DTR to R0 using instruction mrs DBGDTR_EL0, x0 */
2391 retval
= dpm
->instr_write_data_dcc_64(dpm
,
2392 ARMV8_MRS(SYSTEM_DBG_DBGDTR_EL0
, 0), address
);
2394 /* Write R0 with value 'address' using write procedure */
2395 /* Step 1.a+b - Write the address for read access into DBGDTRRXint */
2396 /* Step 1.c - Copy value from DTR to R0 using instruction mrc DBGDTRTXint, r0 */
2397 retval
= dpm
->instr_write_data_dcc(dpm
,
2398 ARMV4_5_MRC(14, 0, 0, 0, 5, 0), address
);
2401 if (retval
!= ERROR_OK
)
2404 if (size
== 4 && (address
% 4) == 0)
2405 retval
= aarch64_read_cpu_memory_fast(target
, count
, buffer
, &dscr
);
2407 retval
= aarch64_read_cpu_memory_slow(target
, size
, count
, buffer
, &dscr
);
2409 if (dscr
& DSCR_MA
) {
2411 mem_ap_write_atomic_u32(armv8
->debug_ap
,
2412 armv8
->debug_base
+ CPUV8_DBG_DSCR
, dscr
);
2415 if (retval
!= ERROR_OK
)
2418 /* Check for sticky abort flags in the DSCR */
2419 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2420 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2421 if (retval
!= ERROR_OK
)
2426 if (dscr
& (DSCR_ERR
| DSCR_SYS_ERROR_PEND
)) {
2427 /* Abort occurred - clear it and exit */
2428 LOG_ERROR("abort occurred - dscr = 0x%08" PRIx32
, dscr
);
2429 armv8_dpm_handle_exception(dpm
, true);
2437 static int aarch64_read_phys_memory(struct target
*target
,
2438 target_addr_t address
, uint32_t size
,
2439 uint32_t count
, uint8_t *buffer
)
2441 int retval
= ERROR_COMMAND_SYNTAX_ERROR
;
2443 if (count
&& buffer
) {
2444 /* read memory through APB-AP */
2445 retval
= aarch64_mmu_modify(target
, 0);
2446 if (retval
!= ERROR_OK
)
2448 retval
= aarch64_read_cpu_memory(target
, address
, size
, count
, buffer
);
2453 static int aarch64_read_memory(struct target
*target
, target_addr_t address
,
2454 uint32_t size
, uint32_t count
, uint8_t *buffer
)
2456 int mmu_enabled
= 0;
2459 /* determine if MMU was enabled on target stop */
2460 retval
= aarch64_mmu(target
, &mmu_enabled
);
2461 if (retval
!= ERROR_OK
)
2465 /* enable MMU as we could have disabled it for phys access */
2466 retval
= aarch64_mmu_modify(target
, 1);
2467 if (retval
!= ERROR_OK
)
2470 return aarch64_read_cpu_memory(target
, address
, size
, count
, buffer
);
2473 static int aarch64_write_phys_memory(struct target
*target
,
2474 target_addr_t address
, uint32_t size
,
2475 uint32_t count
, const uint8_t *buffer
)
2477 int retval
= ERROR_COMMAND_SYNTAX_ERROR
;
2479 if (count
&& buffer
) {
2480 /* write memory through APB-AP */
2481 retval
= aarch64_mmu_modify(target
, 0);
2482 if (retval
!= ERROR_OK
)
2484 return aarch64_write_cpu_memory(target
, address
, size
, count
, buffer
);
2490 static int aarch64_write_memory(struct target
*target
, target_addr_t address
,
2491 uint32_t size
, uint32_t count
, const uint8_t *buffer
)
2493 int mmu_enabled
= 0;
2496 /* determine if MMU was enabled on target stop */
2497 retval
= aarch64_mmu(target
, &mmu_enabled
);
2498 if (retval
!= ERROR_OK
)
2502 /* enable MMU as we could have disabled it for phys access */
2503 retval
= aarch64_mmu_modify(target
, 1);
2504 if (retval
!= ERROR_OK
)
2507 return aarch64_write_cpu_memory(target
, address
, size
, count
, buffer
);
2510 static int aarch64_handle_target_request(void *priv
)
2512 struct target
*target
= priv
;
2513 struct armv8_common
*armv8
= target_to_armv8(target
);
2516 if (!target_was_examined(target
))
2518 if (!target
->dbg_msg_enabled
)
2521 if (target
->state
== TARGET_RUNNING
) {
2524 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2525 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2527 /* check if we have data */
2528 while ((dscr
& DSCR_DTR_TX_FULL
) && (retval
== ERROR_OK
)) {
2529 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2530 armv8
->debug_base
+ CPUV8_DBG_DTRTX
, &request
);
2531 if (retval
== ERROR_OK
) {
2532 target_request(target
, request
);
2533 retval
= mem_ap_read_atomic_u32(armv8
->debug_ap
,
2534 armv8
->debug_base
+ CPUV8_DBG_DSCR
, &dscr
);
2542 static int aarch64_examine_first(struct target
*target
)
2544 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
2545 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
2546 struct adiv5_dap
*swjdp
= armv8
->arm
.dap
;
2547 struct aarch64_private_config
*pc
= target
->private_config
;
2549 int retval
= ERROR_OK
;
2550 uint64_t debug
, ttypr
;
2552 uint32_t tmp0
, tmp1
, tmp2
, tmp3
;
2553 debug
= ttypr
= cpuid
= 0;
2558 if (pc
->adiv5_config
.ap_num
== DP_APSEL_INVALID
) {
2559 /* Search for the APB-AB */
2560 retval
= dap_find_ap(swjdp
, AP_TYPE_APB_AP
, &armv8
->debug_ap
);
2561 if (retval
!= ERROR_OK
) {
2562 LOG_ERROR("Could not find APB-AP for debug access");
2566 armv8
->debug_ap
= dap_ap(swjdp
, pc
->adiv5_config
.ap_num
);
2569 retval
= mem_ap_init(armv8
->debug_ap
);
2570 if (retval
!= ERROR_OK
) {
2571 LOG_ERROR("Could not initialize the APB-AP");
2575 armv8
->debug_ap
->memaccess_tck
= 10;
2577 if (!target
->dbgbase_set
) {
2578 target_addr_t dbgbase
;
2579 /* Get ROM Table base */
2581 int32_t coreidx
= target
->coreid
;
2582 retval
= dap_get_debugbase(armv8
->debug_ap
, &dbgbase
, &apid
);
2583 if (retval
!= ERROR_OK
)
2585 /* Lookup Processor DAP */
2586 retval
= dap_lookup_cs_component(armv8
->debug_ap
, dbgbase
, ARM_CS_C9_DEVTYPE_CORE_DEBUG
,
2587 &armv8
->debug_base
, &coreidx
);
2588 if (retval
!= ERROR_OK
)
2590 LOG_DEBUG("Detected core %" PRId32
" dbgbase: " TARGET_ADDR_FMT
2591 " apid: %08" PRIx32
, coreidx
, armv8
->debug_base
, apid
);
2593 armv8
->debug_base
= target
->dbgbase
;
2595 retval
= mem_ap_write_atomic_u32(armv8
->debug_ap
,
2596 armv8
->debug_base
+ CPUV8_DBG_OSLAR
, 0);
2597 if (retval
!= ERROR_OK
) {
2598 LOG_DEBUG("Examine %s failed", "oslock");
2602 retval
= mem_ap_read_u32(armv8
->debug_ap
,
2603 armv8
->debug_base
+ CPUV8_DBG_MAINID0
, &cpuid
);
2604 if (retval
!= ERROR_OK
) {
2605 LOG_DEBUG("Examine %s failed", "CPUID");
2609 retval
= mem_ap_read_u32(armv8
->debug_ap
,
2610 armv8
->debug_base
+ CPUV8_DBG_MEMFEATURE0
, &tmp0
);
2611 retval
+= mem_ap_read_u32(armv8
->debug_ap
,
2612 armv8
->debug_base
+ CPUV8_DBG_MEMFEATURE0
+ 4, &tmp1
);
2613 if (retval
!= ERROR_OK
) {
2614 LOG_DEBUG("Examine %s failed", "Memory Model Type");
2617 retval
= mem_ap_read_u32(armv8
->debug_ap
,
2618 armv8
->debug_base
+ CPUV8_DBG_DBGFEATURE0
, &tmp2
);
2619 retval
+= mem_ap_read_u32(armv8
->debug_ap
,
2620 armv8
->debug_base
+ CPUV8_DBG_DBGFEATURE0
+ 4, &tmp3
);
2621 if (retval
!= ERROR_OK
) {
2622 LOG_DEBUG("Examine %s failed", "ID_AA64DFR0_EL1");
2626 retval
= dap_run(armv8
->debug_ap
->dap
);
2627 if (retval
!= ERROR_OK
) {
2628 LOG_ERROR("%s: examination failed\n", target_name(target
));
2633 ttypr
= (ttypr
<< 32) | tmp0
;
2635 debug
= (debug
<< 32) | tmp2
;
2637 LOG_DEBUG("cpuid = 0x%08" PRIx32
, cpuid
);
2638 LOG_DEBUG("ttypr = 0x%08" PRIx64
, ttypr
);
2639 LOG_DEBUG("debug = 0x%08" PRIx64
, debug
);
2642 LOG_TARGET_ERROR(target
, "CTI not specified");
2646 armv8
->cti
= pc
->cti
;
2648 retval
= aarch64_dpm_setup(aarch64
, debug
);
2649 if (retval
!= ERROR_OK
)
2652 /* Setup Breakpoint Register Pairs */
2653 aarch64
->brp_num
= (uint32_t)((debug
>> 12) & 0x0F) + 1;
2654 aarch64
->brp_num_context
= (uint32_t)((debug
>> 28) & 0x0F) + 1;
2655 aarch64
->brp_num_available
= aarch64
->brp_num
;
2656 aarch64
->brp_list
= calloc(aarch64
->brp_num
, sizeof(struct aarch64_brp
));
2657 for (i
= 0; i
< aarch64
->brp_num
; i
++) {
2658 aarch64
->brp_list
[i
].used
= 0;
2659 if (i
< (aarch64
->brp_num
-aarch64
->brp_num_context
))
2660 aarch64
->brp_list
[i
].type
= BRP_NORMAL
;
2662 aarch64
->brp_list
[i
].type
= BRP_CONTEXT
;
2663 aarch64
->brp_list
[i
].value
= 0;
2664 aarch64
->brp_list
[i
].control
= 0;
2665 aarch64
->brp_list
[i
].brpn
= i
;
2668 /* Setup Watchpoint Register Pairs */
2669 aarch64
->wp_num
= (uint32_t)((debug
>> 20) & 0x0F) + 1;
2670 aarch64
->wp_num_available
= aarch64
->wp_num
;
2671 aarch64
->wp_list
= calloc(aarch64
->wp_num
, sizeof(struct aarch64_brp
));
2672 for (i
= 0; i
< aarch64
->wp_num
; i
++) {
2673 aarch64
->wp_list
[i
].used
= 0;
2674 aarch64
->wp_list
[i
].type
= BRP_NORMAL
;
2675 aarch64
->wp_list
[i
].value
= 0;
2676 aarch64
->wp_list
[i
].control
= 0;
2677 aarch64
->wp_list
[i
].brpn
= i
;
2680 LOG_DEBUG("Configured %i hw breakpoints, %i watchpoints",
2681 aarch64
->brp_num
, aarch64
->wp_num
);
2683 target
->state
= TARGET_UNKNOWN
;
2684 target
->debug_reason
= DBG_REASON_NOTHALTED
;
2685 aarch64
->isrmasking_mode
= AARCH64_ISRMASK_ON
;
2686 target_set_examined(target
);
2690 static int aarch64_examine(struct target
*target
)
2692 int retval
= ERROR_OK
;
2694 /* don't re-probe hardware after each reset */
2695 if (!target_was_examined(target
))
2696 retval
= aarch64_examine_first(target
);
2698 /* Configure core debug access */
2699 if (retval
== ERROR_OK
)
2700 retval
= aarch64_init_debug_access(target
);
2706 * Cortex-A8 target creation and initialization
2709 static int aarch64_init_target(struct command_context
*cmd_ctx
,
2710 struct target
*target
)
2712 /* examine_first() does a bunch of this */
2713 arm_semihosting_init(target
);
2717 static int aarch64_init_arch_info(struct target
*target
,
2718 struct aarch64_common
*aarch64
, struct adiv5_dap
*dap
)
2720 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
2722 /* Setup struct aarch64_common */
2723 aarch64
->common_magic
= AARCH64_COMMON_MAGIC
;
2724 armv8
->arm
.dap
= dap
;
2726 /* register arch-specific functions */
2727 armv8
->examine_debug_reason
= NULL
;
2728 armv8
->post_debug_entry
= aarch64_post_debug_entry
;
2729 armv8
->pre_restore_context
= NULL
;
2730 armv8
->armv8_mmu
.read_physical_memory
= aarch64_read_phys_memory
;
2732 armv8_init_arch_info(target
, armv8
);
2733 target_register_timer_callback(aarch64_handle_target_request
, 1,
2734 TARGET_TIMER_TYPE_PERIODIC
, target
);
2739 static int aarch64_target_create(struct target
*target
, Jim_Interp
*interp
)
2741 struct aarch64_private_config
*pc
= target
->private_config
;
2742 struct aarch64_common
*aarch64
;
2744 if (adiv5_verify_config(&pc
->adiv5_config
) != ERROR_OK
)
2747 aarch64
= calloc(1, sizeof(struct aarch64_common
));
2749 LOG_ERROR("Out of memory");
2753 return aarch64_init_arch_info(target
, aarch64
, pc
->adiv5_config
.dap
);
2756 static void aarch64_deinit_target(struct target
*target
)
2758 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
2759 struct armv8_common
*armv8
= &aarch64
->armv8_common
;
2760 struct arm_dpm
*dpm
= &armv8
->dpm
;
2762 armv8_free_reg_cache(target
);
2763 free(aarch64
->brp_list
);
2766 free(target
->private_config
);
2770 static int aarch64_mmu(struct target
*target
, int *enabled
)
2772 if (target
->state
!= TARGET_HALTED
) {
2773 LOG_ERROR("%s: target %s not halted", __func__
, target_name(target
));
2774 return ERROR_TARGET_INVALID
;
2777 *enabled
= target_to_aarch64(target
)->armv8_common
.armv8_mmu
.mmu_enabled
;
2781 static int aarch64_virt2phys(struct target
*target
, target_addr_t virt
,
2782 target_addr_t
*phys
)
2784 return armv8_mmu_translate_va_pa(target
, virt
, phys
, 1);
2788 * private target configuration items
2790 enum aarch64_cfg_param
{
2794 static const struct jim_nvp nvp_config_opts
[] = {
2795 { .name
= "-cti", .value
= CFG_CTI
},
2796 { .name
= NULL
, .value
= -1 }
2799 static int aarch64_jim_configure(struct target
*target
, struct jim_getopt_info
*goi
)
2801 struct aarch64_private_config
*pc
;
2805 pc
= (struct aarch64_private_config
*)target
->private_config
;
2807 pc
= calloc(1, sizeof(struct aarch64_private_config
));
2808 pc
->adiv5_config
.ap_num
= DP_APSEL_INVALID
;
2809 target
->private_config
= pc
;
2813 * Call adiv5_jim_configure() to parse the common DAP options
2814 * It will return JIM_CONTINUE if it didn't find any known
2815 * options, JIM_OK if it correctly parsed the topmost option
2816 * and JIM_ERR if an error occurred during parameter evaluation.
2817 * For JIM_CONTINUE, we check our own params.
2819 * adiv5_jim_configure() assumes 'private_config' to point to
2820 * 'struct adiv5_private_config'. Override 'private_config'!
2822 target
->private_config
= &pc
->adiv5_config
;
2823 e
= adiv5_jim_configure(target
, goi
);
2824 target
->private_config
= pc
;
2825 if (e
!= JIM_CONTINUE
)
2828 /* parse config or cget options ... */
2829 if (goi
->argc
> 0) {
2830 Jim_SetEmptyResult(goi
->interp
);
2832 /* check first if topmost item is for us */
2833 e
= jim_nvp_name2value_obj(goi
->interp
, nvp_config_opts
,
2836 return JIM_CONTINUE
;
2838 e
= jim_getopt_obj(goi
, NULL
);
2844 if (goi
->isconfigure
) {
2846 struct arm_cti
*cti
;
2847 e
= jim_getopt_obj(goi
, &o_cti
);
2850 cti
= cti_instance_by_jim_obj(goi
->interp
, o_cti
);
2852 Jim_SetResultString(goi
->interp
, "CTI name invalid!", -1);
2857 if (goi
->argc
!= 0) {
2858 Jim_WrongNumArgs(goi
->interp
,
2859 goi
->argc
, goi
->argv
,
2864 if (!pc
|| !pc
->cti
) {
2865 Jim_SetResultString(goi
->interp
, "CTI not configured", -1);
2868 Jim_SetResultString(goi
->interp
, arm_cti_name(pc
->cti
), -1);
2874 return JIM_CONTINUE
;
2881 COMMAND_HANDLER(aarch64_handle_cache_info_command
)
2883 struct target
*target
= get_current_target(CMD_CTX
);
2884 struct armv8_common
*armv8
= target_to_armv8(target
);
2886 return armv8_handle_cache_info_command(CMD
,
2887 &armv8
->armv8_mmu
.armv8_cache
);
2890 COMMAND_HANDLER(aarch64_handle_dbginit_command
)
2892 struct target
*target
= get_current_target(CMD_CTX
);
2893 if (!target_was_examined(target
)) {
2894 LOG_ERROR("target not examined yet");
2898 return aarch64_init_debug_access(target
);
2901 COMMAND_HANDLER(aarch64_handle_disassemble_command
)
2903 struct target
*target
= get_current_target(CMD_CTX
);
2906 LOG_ERROR("No target selected");
2910 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
2912 if (aarch64
->common_magic
!= AARCH64_COMMON_MAGIC
) {
2913 command_print(CMD
, "current target isn't an AArch64");
2918 target_addr_t address
;
2922 COMMAND_PARSE_NUMBER(int, CMD_ARGV
[1], count
);
2925 COMMAND_PARSE_ADDRESS(CMD_ARGV
[0], address
);
2928 return ERROR_COMMAND_SYNTAX_ERROR
;
2931 return a64_disassemble(CMD
, target
, address
, count
);
2934 COMMAND_HANDLER(aarch64_mask_interrupts_command
)
2936 struct target
*target
= get_current_target(CMD_CTX
);
2937 struct aarch64_common
*aarch64
= target_to_aarch64(target
);
2939 static const struct jim_nvp nvp_maskisr_modes
[] = {
2940 { .name
= "off", .value
= AARCH64_ISRMASK_OFF
},
2941 { .name
= "on", .value
= AARCH64_ISRMASK_ON
},
2942 { .name
= NULL
, .value
= -1 },
2944 const struct jim_nvp
*n
;
2947 n
= jim_nvp_name2value_simple(nvp_maskisr_modes
, CMD_ARGV
[0]);
2949 LOG_ERROR("Unknown parameter: %s - should be off or on", CMD_ARGV
[0]);
2950 return ERROR_COMMAND_SYNTAX_ERROR
;
2953 aarch64
->isrmasking_mode
= n
->value
;
2956 n
= jim_nvp_value2name_simple(nvp_maskisr_modes
, aarch64
->isrmasking_mode
);
2957 command_print(CMD
, "aarch64 interrupt mask %s", n
->name
);
2962 static int jim_mcrmrc(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
2964 struct command
*c
= jim_to_command(interp
);
2965 struct command_context
*context
;
2966 struct target
*target
;
2969 bool is_mcr
= false;
2972 if (!strcmp(c
->name
, "mcr")) {
2979 context
= current_command_context(interp
);
2982 target
= get_current_target(context
);
2984 LOG_ERROR("%s: no current target", __func__
);
2987 if (!target_was_examined(target
)) {
2988 LOG_ERROR("%s: not yet examined", target_name(target
));
2992 arm
= target_to_arm(target
);
2994 LOG_ERROR("%s: not an ARM", target_name(target
));
2998 if (target
->state
!= TARGET_HALTED
)
2999 return ERROR_TARGET_NOT_HALTED
;
3001 if (arm
->core_state
== ARM_STATE_AARCH64
) {
3002 LOG_ERROR("%s: not 32-bit arm target", target_name(target
));
3006 if (argc
!= arg_cnt
) {
3007 LOG_ERROR("%s: wrong number of arguments", __func__
);
3019 /* NOTE: parameter sequence matches ARM instruction set usage:
3020 * MCR pNUM, op1, rX, CRn, CRm, op2 ; write CP from rX
3021 * MRC pNUM, op1, rX, CRn, CRm, op2 ; read CP into rX
3022 * The "rX" is necessarily omitted; it uses Tcl mechanisms.
3024 retval
= Jim_GetLong(interp
, argv
[1], &l
);
3025 if (retval
!= JIM_OK
)
3028 LOG_ERROR("%s: %s %d out of range", __func__
,
3029 "coprocessor", (int) l
);
3034 retval
= Jim_GetLong(interp
, argv
[2], &l
);
3035 if (retval
!= JIM_OK
)
3038 LOG_ERROR("%s: %s %d out of range", __func__
,
3044 retval
= Jim_GetLong(interp
, argv
[3], &l
);
3045 if (retval
!= JIM_OK
)
3048 LOG_ERROR("%s: %s %d out of range", __func__
,
3054 retval
= Jim_GetLong(interp
, argv
[4], &l
);
3055 if (retval
!= JIM_OK
)
3058 LOG_ERROR("%s: %s %d out of range", __func__
,
3064 retval
= Jim_GetLong(interp
, argv
[5], &l
);
3065 if (retval
!= JIM_OK
)
3068 LOG_ERROR("%s: %s %d out of range", __func__
,
3076 if (is_mcr
== true) {
3077 retval
= Jim_GetLong(interp
, argv
[6], &l
);
3078 if (retval
!= JIM_OK
)
3082 /* NOTE: parameters reordered! */
3083 /* ARMV4_5_MCR(cpnum, op1, 0, crn, crm, op2) */
3084 retval
= arm
->mcr(target
, cpnum
, op1
, op2
, crn
, crm
, value
);
3085 if (retval
!= ERROR_OK
)
3088 /* NOTE: parameters reordered! */
3089 /* ARMV4_5_MRC(cpnum, op1, 0, crn, crm, op2) */
3090 retval
= arm
->mrc(target
, cpnum
, op1
, op2
, crn
, crm
, &value
);
3091 if (retval
!= ERROR_OK
)
3094 Jim_SetResult(interp
, Jim_NewIntObj(interp
, value
));
3100 static const struct command_registration aarch64_exec_command_handlers
[] = {
3102 .name
= "cache_info",
3103 .handler
= aarch64_handle_cache_info_command
,
3104 .mode
= COMMAND_EXEC
,
3105 .help
= "display information about target caches",
3110 .handler
= aarch64_handle_dbginit_command
,
3111 .mode
= COMMAND_EXEC
,
3112 .help
= "Initialize core debug",
3116 .name
= "disassemble",
3117 .handler
= aarch64_handle_disassemble_command
,
3118 .mode
= COMMAND_EXEC
,
3119 .help
= "Disassemble instructions",
3120 .usage
= "address [count]",
3124 .handler
= aarch64_mask_interrupts_command
,
3125 .mode
= COMMAND_ANY
,
3126 .help
= "mask aarch64 interrupts during single-step",
3127 .usage
= "['on'|'off']",
3131 .mode
= COMMAND_EXEC
,
3132 .jim_handler
= jim_mcrmrc
,
3133 .help
= "write coprocessor register",
3134 .usage
= "cpnum op1 CRn CRm op2 value",
3138 .mode
= COMMAND_EXEC
,
3139 .jim_handler
= jim_mcrmrc
,
3140 .help
= "read coprocessor register",
3141 .usage
= "cpnum op1 CRn CRm op2",
3144 .chain
= smp_command_handlers
,
3148 COMMAND_REGISTRATION_DONE
3151 extern const struct command_registration semihosting_common_handlers
[];
3153 static const struct command_registration aarch64_command_handlers
[] = {
3156 .mode
= COMMAND_ANY
,
3157 .help
= "ARM Command Group",
3159 .chain
= semihosting_common_handlers
3162 .chain
= armv8_command_handlers
,
3166 .mode
= COMMAND_ANY
,
3167 .help
= "Aarch64 command group",
3169 .chain
= aarch64_exec_command_handlers
,
3171 COMMAND_REGISTRATION_DONE
3174 struct target_type aarch64_target
= {
3177 .poll
= aarch64_poll
,
3178 .arch_state
= armv8_arch_state
,
3180 .halt
= aarch64_halt
,
3181 .resume
= aarch64_resume
,
3182 .step
= aarch64_step
,
3184 .assert_reset
= aarch64_assert_reset
,
3185 .deassert_reset
= aarch64_deassert_reset
,
3187 /* REVISIT allow exporting VFP3 registers ... */
3188 .get_gdb_arch
= armv8_get_gdb_arch
,
3189 .get_gdb_reg_list
= armv8_get_gdb_reg_list
,
3191 .read_memory
= aarch64_read_memory
,
3192 .write_memory
= aarch64_write_memory
,
3194 .add_breakpoint
= aarch64_add_breakpoint
,
3195 .add_context_breakpoint
= aarch64_add_context_breakpoint
,
3196 .add_hybrid_breakpoint
= aarch64_add_hybrid_breakpoint
,
3197 .remove_breakpoint
= aarch64_remove_breakpoint
,
3198 .add_watchpoint
= aarch64_add_watchpoint
,
3199 .remove_watchpoint
= aarch64_remove_watchpoint
,
3200 .hit_watchpoint
= aarch64_hit_watchpoint
,
3202 .commands
= aarch64_command_handlers
,
3203 .target_create
= aarch64_target_create
,
3204 .target_jim_configure
= aarch64_jim_configure
,
3205 .init_target
= aarch64_init_target
,
3206 .deinit_target
= aarch64_deinit_target
,
3207 .examine
= aarch64_examine
,
3209 .read_phys_memory
= aarch64_read_phys_memory
,
3210 .write_phys_memory
= aarch64_write_phys_memory
,
3212 .virt2phys
= aarch64_virt2phys
,
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)