ARM920 uses the new inheritance/nesting scheme
[fw/openocd] / src / target / target.h
index 6547d4d782026c44219193e959d30c1b30cb5c64..1bbf40f0cd3d3c67892f9fd40f1348c29230ca42 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                                  *
@@ -26,6 +26,8 @@
 #ifndef TARGET_H
 #define TARGET_H
 
+#include <stddef.h>
+
 #include "breakpoints.h"
 #include "algorithm.h"
 #include "command.h"
@@ -34,6 +36,19 @@ struct reg_s;
 struct trace_s;
 struct command_context_s;
 
+
+/**
+ * Cast a member of a structure out to the containing structure.
+ * @param ptr The pointer to the member.
+ * @param type The type of the container struct this is embedded in.
+ * @param member The name of the member within the struct.
+ *
+ * This is a mechanism which is used throughout the Linux kernel.
+ */
+#define container_of(ptr, type, member) ({                     \
+       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+       (type *)( (char *)__mptr - offsetof(type,member) );})
+
 /*
  * TARGET_UNKNOWN = 0: we don't know anything about the target yet
  * TARGET_RUNNING = 1: the target is executing user code
@@ -128,9 +143,11 @@ typedef struct target_s
        int reset_halt;                                         /* attempt resetting the CPU into the halted mode? */
        uint32_t working_area;                                  /* working area (initialized RAM). Evaluated
                                                                                 * upon first allocation from virtual/physical address. */
-       uint32_t working_area_virt;                             /* virtual address */
-       uint32_t working_area_phys;                             /* physical address */
-       uint32_t working_area_size;                             /* size in bytes */
+       bool working_area_virt_spec;            /* virtual address specified? */
+       uint32_t working_area_virt;                     /* virtual address */
+       bool working_area_phys_spec;            /* virtual address specified? */
+       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 */
@@ -148,6 +165,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
@@ -361,6 +380,30 @@ 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);