#define ARMV4_5_COMMON_MAGIC 0x0A450A45
 
-typedef struct armv4_5_common_s
+/* NOTE:  this is being morphed into a generic toplevel holder for ARMs. */
+#define armv4_5_common_s arm
+
+/**
+ * Represents a generic ARM core, with standard application registers.
+ *
+ * There are sixteen application registers (including PC, SP, LR) and a PSR.
+ * Cortex-M series cores do not support as many core states or shadowed
+ * registers as traditional ARM cores, and only support Thumb2 instructions.
+ */
+typedef struct arm
 {
        int common_magic;
        reg_cache_t *core_cache;
+
        int /* armv4_5_mode */ core_mode;
        enum armv4_5_state core_state;
+
+       /** Flag reporting unavailability of the BKPT instruction. */
        bool is_armv4;
+
+       /** Handle for the Embedded Trace Module, if one is present. */
+       struct etm *etm;
+
        int (*full_context)(struct target_s *target);
-       int (*read_core_reg)(struct target_s *target, int num, enum armv4_5_mode mode);
-       int (*write_core_reg)(struct target_s *target, int num, enum armv4_5_mode mode, uint32_t value);
+       int (*read_core_reg)(struct target_s *target,
+                       int num, enum armv4_5_mode mode);
+       int (*write_core_reg)(struct target_s *target,
+                       int num, enum armv4_5_mode mode, uint32_t value);
        void *arch_info;
 } armv4_5_common_t;
 
-static inline struct armv4_5_common_s *
-target_to_armv4_5(struct target_s *target)
+#define target_to_armv4_5 target_to_arm
+
+/** Convert target handle to generic ARM target state handle. */
+static inline struct arm *target_to_arm(struct target_s *target)
 {
        return target->arch_info;
 }
 
+static inline bool is_arm(struct arm *arm)
+{
+       return arm && arm->common_magic == ARMV4_5_COMMON_MAGIC;
+}
+
 typedef struct armv4_5_algorithm_s
 {
        int common_magic;
 
                char *cmd, char **args, int argc)
 {
        target_t *target;
-       armv4_5_common_t *armv4_5;
+       struct arm *arm;
        arm7_9_common_t *arm7_9;
        etm_portmode_t portmode = 0x0;
        struct etm *etm_ctx;
                return ERROR_FAIL;
        }
 
-       if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
+       if (arm7_9_get_arch_pointers(target, &arm, &arm7_9) != ERROR_OK)
        {
                command_print(cmd_ctx, "target '%s' is '%s'; not an ARM",
                                target->cmd_name, target_get_name(target));
        etm_ctx->target = target;
        etm_ctx->trigger_percent = 50;
        etm_ctx->trace_data = NULL;
-       etm_ctx->trace_depth = 0;
        etm_ctx->portmode = portmode;
-       etm_ctx->tracemode = 0x0;
        etm_ctx->core_state = ARMV4_5_STATE_ARM;
-       etm_ctx->image = NULL;
-       etm_ctx->pipe_index = 0;
-       etm_ctx->data_index = 0;
-       etm_ctx->current_pc = 0x0;
-       etm_ctx->pc_ok = 0;
-       etm_ctx->last_branch = 0x0;
-       etm_ctx->last_branch_reason = 0x0;
-       etm_ctx->last_ptr = 0x0;
-       etm_ctx->ptr_ok = 0x0;
-       etm_ctx->last_instruction = 0;
 
        arm7_9->etm_ctx = etm_ctx;
+       arm->etm = etm_ctx;
 
        return etm_register_user_commands(cmd_ctx);
 }