X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Farmv7m.h;h=aef6b767bdf100354bf003eb065544571025442e;hb=3528457ba8f8b41e2bb96ee925dec21eaab1644a;hp=c60ab8cfff7bca3e5967a1a881b2194c6595be42;hpb=a4a2808c2a849eddd5d7d454c048ffdfd89ca9c6;p=openocd.git diff --git a/src/target/armv7m.h b/src/target/armv7m.h index c60ab8cfff..aef6b767bd 100644 --- a/src/target/armv7m.h +++ b/src/target/armv7m.h @@ -26,14 +26,20 @@ #ifndef ARMV7M_COMMON_H #define ARMV7M_COMMON_H -#include -#include +#include "arm_adi_v5.h" +#include "arm.h" /* define for enabling armv7 gdb workarounds */ #if 1 #define ARMV7_GDB_HACKS #endif +#ifdef ARMV7_GDB_HACKS +extern uint8_t armv7m_gdb_dummy_cpsr_value[]; +extern struct reg armv7m_gdb_dummy_cpsr_reg; +#endif + + enum armv7m_mode { ARMV7M_MODE_THREAD = 0, @@ -43,6 +49,8 @@ enum armv7m_mode }; extern char *armv7m_mode_strings[]; +extern const int armv7m_psp_reg_map[]; +extern const int armv7m_msp_reg_map[]; enum armv7m_regtype { @@ -94,30 +102,41 @@ enum struct armv7m_common { + struct arm arm; + int common_magic; struct reg_cache *core_cache; enum armv7m_mode core_mode; int exception_number; - struct swjdp_common swjdp_info; + struct adiv5_dap dap; + + uint32_t demcr; /* Direct processor core register read and writes */ - int (*load_core_reg_u32)(struct target *target, enum armv7m_regtype type, uint32_t num, uint32_t *value); - int (*store_core_reg_u32)(struct target *target, enum armv7m_regtype type, uint32_t num, uint32_t value); + int (*load_core_reg_u32)(struct target *target, + enum armv7m_regtype type, uint32_t num, uint32_t *value); + int (*store_core_reg_u32)(struct target *target, + enum armv7m_regtype type, uint32_t num, uint32_t value); + /* register cache to processor synchronization */ int (*read_core_reg)(struct target *target, unsigned num); int (*write_core_reg)(struct target *target, unsigned num); int (*examine_debug_reason)(struct target *target); - void (*post_debug_entry)(struct target *target); + int (*post_debug_entry)(struct target *target); void (*pre_restore_context)(struct target *target); - void (*post_restore_context)(struct target *target); }; static inline struct armv7m_common * target_to_armv7m(struct target *target) { - return target->arch_info; + return container_of(target->arch_info, struct armv7m_common, arm); +} + +static inline bool is_armv7m(struct armv7m_common *armv7m) +{ + return armv7m->common_magic == ARMV7M_COMMON_MAGIC; } struct armv7m_algorithm @@ -125,6 +144,8 @@ struct armv7m_algorithm int common_magic; enum armv7m_mode core_mode; + + uint32_t context[ARMV7M_CONTROL + 1]; //ARMV7M_NUM_REGS }; struct armv7m_core_reg @@ -151,6 +172,18 @@ int armv7m_run_algorithm(struct target *target, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info); +int armv7m_start_algorithm(struct target *target, + int num_mem_params, struct mem_param *mem_params, + int num_reg_params, struct reg_param *reg_params, + uint32_t entry_point, uint32_t exit_point, + void *arch_info); + +int armv7m_wait_algorithm(struct target *target, + int num_mem_params, struct mem_param *mem_params, + int num_reg_params, struct reg_param *reg_params, + uint32_t exit_point, int timeout_ms, + void *arch_info); + int armv7m_invalidate_core_regs(struct target *target); int armv7m_restore_context(struct target *target); @@ -160,6 +193,8 @@ int armv7m_checksum_memory(struct target *target, int armv7m_blank_check_memory(struct target *target, uint32_t address, uint32_t count, uint32_t* blank); +int armv7m_maybe_skip_bkpt_inst(struct target *target, bool *inst_found); + extern const struct command_registration armv7m_command_handlers[]; #endif /* ARMV7M_H */