mcr/mrc interface work. Implemented for arm926ejs and arm720t. mcr/mrc commands added.
[fw/openocd] / src / target / target.h
index 7632c9331a4cdc5a26b6596cff04efedbbe6007e..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
 };
 
@@ -116,7 +120,7 @@ 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;
@@ -131,6 +135,7 @@ typedef struct target_s
        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 */
@@ -143,6 +148,8 @@ typedef struct target_s
 
        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,
@@ -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);
 
 /**
@@ -351,12 +363,39 @@ extern int target_write_memory(struct target_s *target,
 extern int target_bulk_write_memory(struct target_s *target,
                uint32_t address, uint32_t count, uint8_t *buffer);
 
+/*
+ * 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
@@ -396,8 +435,8 @@ 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 */