Use new target_to_cm3() and target_to_armv7m() inlines,
instead of a series of x->arch_info conversions. Remove
arch_info, since nothing uses it.
Also fix an omission: the Cortex-M3 commands didn't verify
that they were operating on that kind of target. Add comment
about the ARMv7M version of that omission.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
int armv7m_restore_context(target_t *target)
{
int i;
int armv7m_restore_context(target_t *target)
{
int i;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
int retval;
armv7m_core_reg_t *armv7m_reg = reg->arch_info;
target_t *target = armv7m_reg->target;
int retval;
armv7m_core_reg_t *armv7m_reg = reg->arch_info;
target_t *target = armv7m_reg->target;
- armv7m_common_t *armv7m_target = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
if (target->state != TARGET_HALTED)
{
return ERROR_TARGET_NOT_HALTED;
}
if (target->state != TARGET_HALTED)
{
return ERROR_TARGET_NOT_HALTED;
}
- retval = armv7m_target->read_core_reg(target, armv7m_reg->num);
+ retval = armv7m->read_core_reg(target, armv7m_reg->num);
uint32_t reg_value;
int retval;
armv7m_core_reg_t * armv7m_core_reg;
uint32_t reg_value;
int retval;
armv7m_core_reg_t * armv7m_core_reg;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
if ((num < 0) || (num >= ARMV7M_NUM_REGS))
return ERROR_INVALID_ARGUMENTS;
if ((num < 0) || (num >= ARMV7M_NUM_REGS))
return ERROR_INVALID_ARGUMENTS;
int retval;
uint32_t reg_value;
armv7m_core_reg_t *armv7m_core_reg;
int retval;
uint32_t reg_value;
armv7m_core_reg_t *armv7m_core_reg;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
if ((num < 0) || (num >= ARMV7M_NUM_REGS))
return ERROR_INVALID_ARGUMENTS;
if ((num < 0) || (num >= ARMV7M_NUM_REGS))
return ERROR_INVALID_ARGUMENTS;
/** Invalidates cache of core registers set up by armv7m_build_reg_cache(). */
int armv7m_invalidate_core_regs(target_t *target)
{
/** Invalidates cache of core registers set up by armv7m_build_reg_cache(). */
int armv7m_invalidate_core_regs(target_t *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
int i;
for (i = 0; i < armv7m->core_cache->num_regs; i++)
int i;
for (i = 0; i < armv7m->core_cache->num_regs; i++)
*/
int armv7m_get_gdb_reg_list(target_t *target, reg_t **reg_list[], int *reg_list_size)
{
*/
int armv7m_get_gdb_reg_list(target_t *target, reg_t **reg_list[], int *reg_list_size)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
int i;
*reg_list_size = 26;
int i;
*reg_list_size = 26;
uint32_t entry_point, uint32_t exit_point,
int timeout_ms, void *arch_info)
{
uint32_t entry_point, uint32_t exit_point,
int timeout_ms, void *arch_info)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
armv7m_algorithm_t *armv7m_algorithm_info = arch_info;
enum armv7m_mode core_mode = armv7m->core_mode;
int retval = ERROR_OK;
armv7m_algorithm_t *armv7m_algorithm_info = arch_info;
enum armv7m_mode core_mode = armv7m->core_mode;
int retval = ERROR_OK;
/** Logs summary of ARMv7-M state for a halted target. */
int armv7m_arch_state(struct target_s *target)
{
/** Logs summary of ARMv7-M state for a halted target. */
int armv7m_arch_state(struct target_s *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
uint32_t ctrl, sp;
ctrl = buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_CONTROL].value, 0, 32);
uint32_t ctrl, sp;
ctrl = buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_CONTROL].value, 0, 32);
/** Builds cache of architecturally defined registers. */
reg_cache_t *armv7m_build_reg_cache(target_t *target)
{
/** Builds cache of architecturally defined registers. */
reg_cache_t *armv7m_build_reg_cache(target_t *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
-
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
int num_regs = ARMV7M_NUM_REGS;
reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
reg_cache_t *cache = malloc(sizeof(reg_cache_t));
int num_regs = ARMV7M_NUM_REGS;
reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
reg_cache_t *cache = malloc(sizeof(reg_cache_t));
+/*--------------------------------------------------------------------------*/
+
+/*
+ * Only stuff below this line should need to verify that its target
+ * is an ARMv7-M node.
+ *
+ * FIXME yet none of it _does_ verify target types yet!
+ */
+
+
/*
* Return the debug ap baseaddress in hexadecimal;
* no extra output to simplify script processing
/*
* Return the debug ap baseaddress in hexadecimal;
* no extra output to simplify script processing
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint32_t apsel, apselsave, baseaddr;
int retval;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint32_t apsel, apselsave, baseaddr;
int retval;
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
return dap_apid_command(cmd_ctx, swjdp, args, argc);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
return dap_apid_command(cmd_ctx, swjdp, args, argc);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
return dap_apsel_command(cmd_ctx, swjdp, args, argc);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
return dap_apsel_command(cmd_ctx, swjdp, args, argc);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
return dap_memaccess_command(cmd_ctx, swjdp, args, argc);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
return dap_memaccess_command(cmd_ctx, swjdp, args, argc);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint32_t apsel;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint32_t apsel;
int exception_number;
swjdp_common_t swjdp_info;
int exception_number;
swjdp_common_t swjdp_info;
/* Direct processor core register read and writes */
int (*load_core_reg_u32)(struct target_s *target, enum armv7m_regtype type, uint32_t num, uint32_t *value);
int (*store_core_reg_u32)(struct target_s *target, enum armv7m_regtype type, uint32_t num, uint32_t value);
/* Direct processor core register read and writes */
int (*load_core_reg_u32)(struct target_s *target, enum armv7m_regtype type, uint32_t num, uint32_t *value);
int (*store_core_reg_u32)(struct target_s *target, enum armv7m_regtype type, uint32_t num, uint32_t value);
void (*pre_restore_context)(target_t *target);
void (*post_restore_context)(target_t *target);
void (*pre_restore_context)(target_t *target);
void (*post_restore_context)(target_t *target);
} armv7m_common_t;
static inline struct armv7m_common_s *
} armv7m_common_t;
static inline struct armv7m_common_s *
#include "arm_disassembler.h"
#include "arm_disassembler.h"
+/* NOTE: most of this should work fine for the Cortex-M1 and
+ * Cortex-M0 cores too, although they're ARMv6-M not ARMv7-M.
+ */
+
#define ARRAY_SIZE(x) ((int)(sizeof(x)/sizeof((x)[0])))
#define ARRAY_SIZE(x) ((int)(sizeof(x)/sizeof((x)[0])))
static int cortex_m3_write_debug_halt_mask(target_t *target,
uint32_t mask_on, uint32_t mask_off)
{
static int cortex_m3_write_debug_halt_mask(target_t *target,
uint32_t mask_on, uint32_t mask_off)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
/* mask off status bits */
cortex_m3->dcb_dhcsr &= ~((0xFFFF << 16) | mask_off);
/* mask off status bits */
cortex_m3->dcb_dhcsr &= ~((0xFFFF << 16) | mask_off);
static int cortex_m3_clear_halt(target_t *target)
{
static int cortex_m3_clear_halt(target_t *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
/* clear step if any */
cortex_m3_write_debug_halt_mask(target, C_HALT, C_STEP);
/* clear step if any */
cortex_m3_write_debug_halt_mask(target, C_HALT, C_STEP);
static int cortex_m3_single_step_core(target_t *target)
{
static int cortex_m3_single_step_core(target_t *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
uint32_t dhcsr_save;
/* backup dhcsr reg */
uint32_t dhcsr_save;
/* backup dhcsr reg */
{
int i;
uint32_t dcb_demcr;
{
int i;
uint32_t dcb_demcr;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
cortex_m3_fp_comparator_t *fp_list = cortex_m3->fp_comparator_list;
cortex_m3_dwt_comparator_t *dwt_list = cortex_m3->dwt_comparator_list;
cortex_m3_fp_comparator_t *fp_list = cortex_m3->fp_comparator_list;
cortex_m3_dwt_comparator_t *dwt_list = cortex_m3->dwt_comparator_list;
static int cortex_m3_examine_debug_reason(target_t *target)
{
static int cortex_m3_examine_debug_reason(target_t *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
/* THIS IS NOT GOOD, TODO - better logic for detection of debug state reason */
/* only check the debug reason if we don't know it already */
/* THIS IS NOT GOOD, TODO - better logic for detection of debug state reason */
/* only check the debug reason if we don't know it already */
static int cortex_m3_examine_exception_reason(target_t *target)
{
uint32_t shcsr, except_sr, cfsr = -1, except_ar = -1;
static int cortex_m3_examine_exception_reason(target_t *target)
{
uint32_t shcsr, except_sr, cfsr = -1, except_ar = -1;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
mem_ap_read_u32(swjdp, NVIC_SHCSR, &shcsr);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
mem_ap_read_u32(swjdp, NVIC_SHCSR, &shcsr);
int i;
uint32_t xPSR;
int retval;
int i;
uint32_t xPSR;
int retval;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct armv7m_common_s *armv7m = &cortex_m3->armv7m;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
LOG_DEBUG(" ");
swjdp_common_t *swjdp = &armv7m->swjdp_info;
LOG_DEBUG(" ");
{
int retval;
enum target_state prev_target_state = target->state;
{
int retval;
enum target_state prev_target_state = target->state;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
/* Read from Debug Halting Control and Status Register */
retval = mem_ap_read_atomic_u32(swjdp, DCB_DHCSR, &cortex_m3->dcb_dhcsr);
/* Read from Debug Halting Control and Status Register */
retval = mem_ap_read_atomic_u32(swjdp, DCB_DHCSR, &cortex_m3->dcb_dhcsr);
static int cortex_m3_soft_reset_halt(struct target_s *target)
{
static int cortex_m3_soft_reset_halt(struct target_s *target)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
uint32_t dcb_dhcsr = 0;
int retval, timeout = 0;
uint32_t dcb_dhcsr = 0;
int retval, timeout = 0;
static int cortex_m3_resume(struct target_s *target, int current,
uint32_t address, int handle_breakpoints, int debug_execution)
{
static int cortex_m3_resume(struct target_s *target, int current,
uint32_t address, int handle_breakpoints, int debug_execution)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
breakpoint_t *breakpoint = NULL;
uint32_t resume_pc;
breakpoint_t *breakpoint = NULL;
uint32_t resume_pc;
static int cortex_m3_step(struct target_s *target, int current,
uint32_t address, int handle_breakpoints)
{
static int cortex_m3_step(struct target_s *target, int current,
uint32_t address, int handle_breakpoints)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct armv7m_common_s *armv7m = &cortex_m3->armv7m;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
breakpoint_t *breakpoint = NULL;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
breakpoint_t *breakpoint = NULL;
/* current = 1: continue on current pc, otherwise continue at <address> */
if (!current)
/* current = 1: continue on current pc, otherwise continue at <address> */
if (!current)
- buf_set_u32(armv7m->core_cache->reg_list[15].value, 0, 32, address);
+ buf_set_u32(cortex_m3->armv7m.core_cache->reg_list[15].value,
+ 0, 32, address);
/* the front-end may request us not to handle breakpoints */
/* the front-end may request us not to handle breakpoints */
- if (handle_breakpoints)
- if ((breakpoint = breakpoint_find(target, buf_get_u32(armv7m->core_cache->reg_list[15].value, 0, 32))))
+ if (handle_breakpoints) {
+ breakpoint = breakpoint_find(target, buf_get_u32(armv7m
+ ->core_cache->reg_list[15].value, 0, 32));
+ if (breakpoint)
cortex_m3_unset_breakpoint(target, breakpoint);
cortex_m3_unset_breakpoint(target, breakpoint);
target->debug_reason = DBG_REASON_SINGLESTEP;
target->debug_reason = DBG_REASON_SINGLESTEP;
static int cortex_m3_assert_reset(target_t *target)
{
static int cortex_m3_assert_reset(target_t *target)
{
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
int assert_srst = 1;
LOG_DEBUG("target->state: %s",
int assert_srst = 1;
LOG_DEBUG("target->state: %s",
int retval;
int fp_num = 0;
uint32_t hilo;
int retval;
int fp_num = 0;
uint32_t hilo;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
-
- cortex_m3_fp_comparator_t * comparator_list = cortex_m3->fp_comparator_list;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ cortex_m3_fp_comparator_t *comparator_list = cortex_m3->fp_comparator_list;
cortex_m3_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
int retval;
cortex_m3_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
int retval;
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
cortex_m3_fp_comparator_t * comparator_list = cortex_m3->fp_comparator_list;
if (!breakpoint->set)
cortex_m3_fp_comparator_t * comparator_list = cortex_m3->fp_comparator_list;
if (!breakpoint->set)
static int
cortex_m3_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
static int
cortex_m3_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
if (cortex_m3->auto_bp_type)
{
if (cortex_m3->auto_bp_type)
{
static int
cortex_m3_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
static int
cortex_m3_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
/* REVISIT why check? FBP can be updated with core running ... */
if (target->state != TARGET_HALTED)
/* REVISIT why check? FBP can be updated with core running ... */
if (target->state != TARGET_HALTED)
{
int dwt_num = 0;
uint32_t mask, temp;
{
int dwt_num = 0;
uint32_t mask, temp;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
/* watchpoint params were validated earlier */
mask = 0;
/* watchpoint params were validated earlier */
mask = 0;
static int
cortex_m3_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
static int
cortex_m3_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
cortex_m3_dwt_comparator_t *comparator;
int dwt_num;
cortex_m3_dwt_comparator_t *comparator;
int dwt_num;
static int
cortex_m3_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
static int
cortex_m3_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
/* REVISIT why check? DWT can be updated with core running ... */
if (target->state != TARGET_HALTED)
/* REVISIT why check? DWT can be updated with core running ... */
if (target->state != TARGET_HALTED)
static int
cortex_m3_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
static int
cortex_m3_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
/* REVISIT why check? DWT can be updated with core running ... */
if (target->state != TARGET_HALTED)
/* REVISIT why check? DWT can be updated with core running ... */
if (target->state != TARGET_HALTED)
enum armv7m_regtype type, uint32_t num, uint32_t * value)
{
int retval;
enum armv7m_regtype type, uint32_t num, uint32_t * value)
{
int retval;
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
/* NOTE: we "know" here that the register identifiers used
swjdp_common_t *swjdp = &armv7m->swjdp_info;
/* NOTE: we "know" here that the register identifiers used
{
int retval;
uint32_t reg;
{
int retval;
uint32_t reg;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
#ifdef ARMV7_GDB_HACKS
swjdp_common_t *swjdp = &armv7m->swjdp_info;
#ifdef ARMV7_GDB_HACKS
static int cortex_m3_read_memory(struct target_s *target, uint32_t address,
uint32_t size, uint32_t count, uint8_t *buffer)
{
static int cortex_m3_read_memory(struct target_s *target, uint32_t address,
uint32_t size, uint32_t count, uint8_t *buffer)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
int retval;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
int retval;
static int cortex_m3_write_memory(struct target_s *target, uint32_t address,
uint32_t size, uint32_t count, uint8_t *buffer)
{
static int cortex_m3_write_memory(struct target_s *target, uint32_t address,
uint32_t size, uint32_t count, uint8_t *buffer)
{
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
int retval;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
int retval;
int retval;
uint32_t cpuid, fpcr;
int i;
int retval;
uint32_t cpuid, fpcr;
int i;
-
- /* get pointers to arch-specific information */
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
- swjdp_common_t *swjdp = &armv7m->swjdp_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct swjdp_common_s *swjdp = &cortex_m3->armv7m.swjdp_info;
if ((retval = ahbap_debugport_init(swjdp)) != ERROR_OK)
return retval;
if ((retval = ahbap_debugport_init(swjdp)) != ERROR_OK)
return retval;
static int cortex_m3_target_request_data(target_t *target,
uint32_t size, uint8_t *buffer)
{
static int cortex_m3_target_request_data(target_t *target,
uint32_t size, uint8_t *buffer)
{
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint8_t data;
uint8_t ctrl;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint8_t data;
uint8_t ctrl;
target_t *target = priv;
if (!target_was_examined(target))
return ERROR_OK;
target_t *target = priv;
if (!target_was_examined(target))
return ERROR_OK;
- armv7m_common_t *armv7m = target->arch_info;
+ struct armv7m_common_s *armv7m = target_to_armv7m(target);
swjdp_common_t *swjdp = &armv7m->swjdp_info;
if (!target->dbg_msg_enabled)
swjdp_common_t *swjdp = &armv7m->swjdp_info;
if (!target->dbg_msg_enabled)
cortex_m3_common_t *cortex_m3, jtag_tap_t *tap)
{
int retval;
cortex_m3_common_t *cortex_m3, jtag_tap_t *tap)
{
int retval;
- armv7m_common_t *armv7m;
- armv7m = &cortex_m3->armv7m;
+ struct armv7m_common_s *armv7m = &cortex_m3->armv7m;
armv7m_init_arch_info(target, armv7m);
armv7m_init_arch_info(target, armv7m);
armv7m->swjdp_info.memaccess_tck = 8;
armv7m->swjdp_info.tar_autoincr_block = (1 << 12); /* Cortex-M3 has 4096 bytes autoincrement range */
armv7m->swjdp_info.memaccess_tck = 8;
armv7m->swjdp_info.tar_autoincr_block = (1 << 12); /* Cortex-M3 has 4096 bytes autoincrement range */
- /* initialize arch-specific breakpoint handling */
-
- cortex_m3->common_magic = CORTEX_M3_COMMON_MAGIC;
- cortex_m3->arch_info = NULL;
-
/* register arch-specific functions */
armv7m->examine_debug_reason = cortex_m3_examine_debug_reason;
/* register arch-specific functions */
armv7m->examine_debug_reason = cortex_m3_examine_debug_reason;
armv7m->pre_restore_context = NULL;
armv7m->post_restore_context = NULL;
armv7m->pre_restore_context = NULL;
armv7m->post_restore_context = NULL;
- armv7m->arch_info = cortex_m3;
armv7m->load_core_reg_u32 = cortex_m3_load_core_reg_u32;
armv7m->store_core_reg_u32 = cortex_m3_store_core_reg_u32;
armv7m->load_core_reg_u32 = cortex_m3_load_core_reg_u32;
armv7m->store_core_reg_u32 = cortex_m3_store_core_reg_u32;
{
cortex_m3_common_t *cortex_m3 = calloc(1,sizeof(cortex_m3_common_t));
{
cortex_m3_common_t *cortex_m3 = calloc(1,sizeof(cortex_m3_common_t));
+ cortex_m3->common_magic = CORTEX_M3_COMMON_MAGIC;
cortex_m3_init_arch_info(target, cortex_m3, target->tap);
return ERROR_OK;
}
cortex_m3_init_arch_info(target, cortex_m3, target->tap);
return ERROR_OK;
}
+/*--------------------------------------------------------------------------*/
+
+static int cortex_m3_verify_pointer(struct command_context_s *cmd_ctx,
+ struct cortex_m3_common_s *cm3)
+{
+ if (cm3->common_magic != CORTEX_M3_COMMON_MAGIC) {
+ command_print(cmd_ctx, "target is not a Cortex-M3");
+ return ERROR_TARGET_INVALID;
+ }
+ return ERROR_OK;
+}
+
+/*
+ * Only stuff below this line should need to verify that its target
+ * is a Cortex-M3. Everything else should have indirected through the
+ * cortexm3_target structure, which is only used with CM3 targets.
+ */
+
/*
* REVISIT Thumb2 disassembly should work for all ARMv7 cores, as well
* as at least ARM-1156T2. The interesting thing about Cortex-M is
/*
* REVISIT Thumb2 disassembly should work for all ARMv7 cores, as well
* as at least ARM-1156T2. The interesting thing about Cortex-M is
handle_cortex_m3_disassemble_command(struct command_context_s *cmd_ctx,
char *cmd, char **args, int argc)
{
handle_cortex_m3_disassemble_command(struct command_context_s *cmd_ctx,
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
target_t *target = get_current_target(cmd_ctx);
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
uint32_t address;
unsigned long count = 1;
arm_instruction_t cur_instruction;
uint32_t address;
unsigned long count = 1;
arm_instruction_t cur_instruction;
+ retval = cortex_m3_verify_pointer(cmd_ctx, cortex_m3);
+ if (retval != ERROR_OK)
+ return retval;
+
errno = 0;
switch (argc) {
case 2:
errno = 0;
switch (argc) {
case 2:
char *cmd, char **argv, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **argv, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ struct armv7m_common_s *armv7m = &cortex_m3->armv7m;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint32_t demcr = 0;
swjdp_common_t *swjdp = &armv7m->swjdp_info;
uint32_t demcr = 0;
+ retval = cortex_m3_verify_pointer(cmd_ctx, cortex_m3);
+ if (retval != ERROR_OK)
+ return retval;
+
mem_ap_read_atomic_u32(swjdp, DCB_DEMCR, &demcr);
if (argc > 0) {
mem_ap_read_atomic_u32(swjdp, DCB_DEMCR, &demcr);
if (argc > 0) {
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
- armv7m_common_t *armv7m = target->arch_info;
- cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
+ struct cortex_m3_common_s *cortex_m3 = target_to_cm3(target);
+ int retval;
+
+ retval = cortex_m3_verify_pointer(cmd_ctx, cortex_m3);
+ if (retval != ERROR_OK)
+ return retval;
if (target->state != TARGET_HALTED)
{
if (target->state != TARGET_HALTED)
{
.has_mmu = cortex_m3_has_mmu,
.examine = cortex_m3_examine,
};
.has_mmu = cortex_m3_has_mmu,
.examine = cortex_m3_examine,
};
struct reg_cache_s *dwt_cache;
armv7m_common_t armv7m;
struct reg_cache_s *dwt_cache;
armv7m_common_t armv7m;
} cortex_m3_common_t;
static inline struct cortex_m3_common_s *
} cortex_m3_common_t;
static inline struct cortex_m3_common_s *
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)