mcr/mrc interface work. Implemented for arm926ejs and arm720t. mcr/mrc commands added.
[fw/openocd] / src / target / target.h
index b2e4c61ed97b86d784d3d3ecff2f9badbe8e9a06..ef578378df7942e943a344cc22e5933ed7945fac 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008,2009 Øyvind Harboe                            *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
@@ -42,7 +42,11 @@ struct command_context_s;
  * TARGET_RESET   = 3: the target is being held in reset (only a temporary state,
  * not sure how this is used with all the recent changes)
  * TARGET_DEBUG_RUNNING = 4: the target is running, but it is executing code on
- * behalf of the debugger (e.g. algorithm for flashing) */
+ * behalf of the debugger (e.g. algorithm for flashing)
+ *
+ * also see: target_state_name();
+ */
+
 
 enum target_state
 {
@@ -87,7 +91,7 @@ extern const Jim_Nvp nvp_target_debug_reason[];
 
 enum target_endianess
 {
-       TARGET_ENDIAN_UNKNOWN=0,
+       TARGET_ENDIAN_UNKNOWN = 0,
        TARGET_BIG_ENDIAN = 1, TARGET_LITTLE_ENDIAN = 2
 };
 
@@ -97,8 +101,8 @@ struct target_s;
 
 typedef struct working_area_s
 {
-       u32 address;
-       u32 size;
+       uint32_t address;
+       uint32_t size;
        int free;
        uint8_t *backup;
        struct working_area_s **user;
@@ -116,33 +120,36 @@ typedef struct target_s
 {
        target_type_t *type;                            /* target type definition (name, access functions) */
        const char *cmd_name;                           /* tcl Name of target */
-       int target_number;                                      /* generaly, target index but may not be in order */
+       int target_number;                                      /* DO NOT USE!  field to be removed in 2010 */
        jtag_tap_t *tap;                                        /* where on the jtag chain is this */
        const char *variant;                            /* what varient of this chip is it? */
        target_event_action_t *event_action;
 
        int reset_halt;                                         /* attempt resetting the CPU into the halted mode? */
-       u32 working_area;                                       /* working area (initialized RAM). Evaluated
+       uint32_t working_area;                                  /* working area (initialized RAM). Evaluated
                                                                                 * upon first allocation from virtual/physical address. */
-       u32 working_area_virt;                          /* virtual address */
-       u32 working_area_phys;                          /* physical address */
-       u32 working_area_size;                          /* size in bytes */
-       u32 backup_working_area;                        /* whether the content of the working area has to be preserved */
+       uint32_t working_area_virt;                             /* virtual address */
+       uint32_t working_area_phys;                             /* physical address */
+       uint32_t working_area_size;                             /* size in bytes */
+       uint32_t backup_working_area;                   /* whether the content of the working area has to be preserved */
        struct working_area_s *working_areas;/* list of allocated working areas */
        enum target_debug_reason debug_reason;/* reason why the target entered debug state */
        enum target_endianess endianness;       /* target endianess */
+       // also see: target_state_name()
        enum target_state state;                        /* the current backend-state (running, halted, ...) */
        struct reg_cache_s *reg_cache;          /* the first register cache of the target (core regs) */
        struct breakpoint_s *breakpoints;       /* list of breakpoints */
        struct watchpoint_s *watchpoints;       /* list of watchpoints */
        struct trace_s *trace_info;                     /* generic trace information */
        struct debug_msg_receiver_s *dbgmsg;/* list of debug message receivers */
-       u32 dbg_msg_enabled;                            /* debug message status */
+       uint32_t dbg_msg_enabled;                               /* debug message status */
        void *arch_info;                                        /* architecture specific information */
        struct target_s *next;                          /* next target in list */
 
        int display;                                            /* display async info in telnet session. Do not display
                                                                                 * lots of halted/resumed info when stepping in debugger. */
+       bool halt_issued;                                       /* did we transition to halted state? */
+       long long halt_issued_time;                     /* Note time when halt was issued */
 } target_t;
 
 enum target_event
@@ -158,8 +165,14 @@ enum target_event
 
        /* allow GDB to do stuff before others handle the halted event,
         * this is in lieu of defining ordering of invocation of events,
-        * which would be more complicated */
-       TARGET_EVENT_EARLY_HALTED,
+        * which would be more complicated
+        *
+        * Telling GDB to halt does not mean that the target stopped running,
+        * simply that we're dropping out of GDB's waiting for step or continue.
+        *
+        * This can be useful when e.g. detecting power dropout.
+        */
+       TARGET_EVENT_GDB_HALT,
        TARGET_EVENT_HALTED,            /* target entered debug state from normal execution or reset */
        TARGET_EVENT_RESUMED,           /* target resumed to normal execution */
        TARGET_EVENT_RESUME_START,
@@ -229,7 +242,7 @@ extern int target_process_reset(struct command_context_s *cmd_ctx, enum target_r
 extern int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
 extern int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
 extern int target_poll(target_t *target);
-extern int target_resume(target_t *target, int current, u32 address, int handle_breakpoints, int debug_execution);
+extern int target_resume(target_t *target, int current, uint32_t address, int handle_breakpoints, int debug_execution);
 extern int target_halt(target_t *target);
 extern int target_call_event_callbacks(target_t *target, enum target_event event);
 
@@ -245,7 +258,6 @@ extern int target_call_timer_callbacks(void);
 extern int target_call_timer_callbacks_now(void);
 
 extern target_t* get_current_target(struct command_context_s *cmd_ctx);
-extern int get_num_by_target(target_t *query_target);
 extern target_t *get_target(const char *id);
 
 /**
@@ -312,7 +324,7 @@ extern int target_get_gdb_reg_list(struct target_s *target,
  * This routine is a wrapper for target->type->step.
  */
 int target_step(struct target_s *target,
-               int current, u32 address, int handle_breakpoints);
+               int current, uint32_t address, int handle_breakpoints);
 /**
  * Run an algorithm on the @a target given.
  *
@@ -321,7 +333,7 @@ int target_step(struct target_s *target,
 extern int target_run_algorithm(struct target_s *target,
                int num_mem_params, mem_param_t *mem_params,
                int num_reg_params, reg_param_t *reg_param,
-               u32 entry_point, u32 exit_point,
+               uint32_t entry_point, uint32_t exit_point,
                int timeout_ms, void *arch_info);
 
 /**
@@ -331,7 +343,7 @@ extern int target_run_algorithm(struct target_s *target,
  * This routine is a wrapper for target->type->read_memory.
  */
 extern int target_read_memory(struct target_s *target,
-               u32 address, u32 size, u32 count, uint8_t *buffer);
+               uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
 /**
  * Write @a count items of @a size bytes to the memory of @a target at
  * the @a address given.
@@ -339,7 +351,7 @@ extern int target_read_memory(struct target_s *target,
  * This routine is wrapper for target->type->write_memory.
  */
 extern int target_write_memory(struct target_s *target,
-               u32 address, u32 size, u32 count, uint8_t *buffer);
+               uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
 
 /**
  * Write @a count items of 4 bytes to the memory of @a target at
@@ -349,14 +361,41 @@ extern int target_write_memory(struct target_s *target,
  * This routine is wrapper for target->type->bulk_write_memory.
  */
 extern int target_bulk_write_memory(struct target_s *target,
-               u32 address, u32 count, uint8_t *buffer);
+               uint32_t address, uint32_t count, uint8_t *buffer);
 
-extern int target_write_buffer(struct target_s *target, u32 address, u32 size, uint8_t *buffer);
-extern int target_read_buffer(struct target_s *target, u32 address, u32 size, uint8_t *buffer);
-extern int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc);
-extern int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank);
+/*
+ * Write to target memory using the virtual address.
+ *
+ * Note that this fn is used to implement software breakpoints. Targets
+ * can implement support for software breakpoints to memory marked as read
+ * only by making this fn write to ram even if it is read only(MMU or
+ * MPUs).
+ *
+ * It is sufficient to implement for writing a single word(16 or 32 in
+ * ARM32/16 bit case) to write the breakpoint to ram.
+ *
+ * The target should also take care of "other things" to make sure that
+ * software breakpoints can be written using this function. E.g.
+ * when there is a separate instruction and data cache, this fn must
+ * make sure that the instruction cache is synced up to the potential
+ * code change that can happen as a result of the memory write(typically
+ * by invalidating the cache).
+ *
+ * The high level wrapper fn in target.c will break down this memory write
+ * request to multiple write requests to the target driver to e.g. guarantee
+ * that writing 4 bytes to an aligned address happens with a single 32 bit
+ * write operation, thus making this fn suitable to e.g. write to special
+ * peripheral registers which do not support byte operations.
+ */
+extern int target_write_buffer(struct target_s *target, uint32_t address, uint32_t size, uint8_t *buffer);
+extern int target_read_buffer(struct target_s *target, uint32_t address, uint32_t size, uint8_t *buffer);
+extern int target_checksum_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t* crc);
+extern int target_blank_check_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t* blank);
 extern int target_wait_state(target_t *target, enum target_state state, int ms);
 
+/** Return the *name* of this targets current state */
+const char *target_state_name( target_t *target );
+
 /* DANGER!!!!!
  *
  * if "area" passed in to target_alloc_working_area() points to a memory
@@ -368,7 +407,7 @@ extern int target_wait_state(target_t *target, enum target_state state, int ms);
  * upon resuming or resetting the CPU.
  *
  */
-extern int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area);
+extern int target_alloc_working_area(struct target_s *target, uint32_t size, working_area_t **area);
 extern int target_free_working_area(struct target_s *target, working_area_t *area);
 extern int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore);
 extern void target_free_all_working_areas(struct target_s *target);
@@ -379,25 +418,25 @@ extern target_t *all_targets;
 extern target_event_callback_t *target_event_callbacks;
 extern target_timer_callback_t *target_timer_callbacks;
 
-extern u32 target_buffer_get_u32(target_t *target, const uint8_t *buffer);
+extern uint32_t target_buffer_get_u32(target_t *target, const uint8_t *buffer);
 extern uint16_t target_buffer_get_u16(target_t *target, const uint8_t *buffer);
 extern uint8_t  target_buffer_get_u8 (target_t *target, const uint8_t *buffer);
-extern void target_buffer_set_u32(target_t *target, uint8_t *buffer, u32 value);
+extern void target_buffer_set_u32(target_t *target, uint8_t *buffer, uint32_t value);
 extern void target_buffer_set_u16(target_t *target, uint8_t *buffer, uint16_t value);
 extern void target_buffer_set_u8 (target_t *target, uint8_t *buffer, uint8_t  value);
 
-int target_read_u32(struct target_s *target, u32 address, u32 *value);
-int target_read_u16(struct target_s *target, u32 address, uint16_t *value);
-int target_read_u8(struct target_s *target, u32 address, uint8_t *value);
-int target_write_u32(struct target_s *target, u32 address, u32 value);
-int target_write_u16(struct target_s *target, u32 address, uint16_t value);
-int target_write_u8(struct target_s *target, u32 address, uint8_t value);
+int target_read_u32(struct target_s *target, uint32_t address, uint32_t *value);
+int target_read_u16(struct target_s *target, uint32_t address, uint16_t *value);
+int target_read_u8(struct target_s *target, uint32_t address, uint8_t *value);
+int target_write_u32(struct target_s *target, uint32_t address, uint32_t value);
+int target_write_u16(struct target_s *target, uint32_t address, uint16_t value);
+int target_write_u8(struct target_s *target, uint32_t address, uint8_t value);
 
 /* Issues USER() statements with target state information */
 int target_arch_state(struct target_s *target);
 
-void target_handle_event( target_t *t, enum target_event e);
-void target_all_handle_event( enum target_event e );
+void target_handle_event(target_t *t, enum target_event e);
+void target_all_handle_event(enum target_event e);
 
 #define ERROR_TARGET_INVALID   (-300)
 #define ERROR_TARGET_INIT_FAILED (-301)
@@ -412,6 +451,6 @@ void target_all_handle_event( enum target_event e );
 #define ERROR_TARGET_NOT_EXAMINED (-311)
 
 extern const Jim_Nvp nvp_error_target[];
-extern const char *target_strerror_safe( int err );
+extern const char *target_strerror_safe(int err);
 
 #endif /* TARGET_H */