gdb_server: support File-I/O Remote Protocol Extension
[fw/openocd] / src / target / target.h
index a610cd034380d9e8bd9e4a07d99d4e0f18ceb5d1..ee282b193e36af31b7aef169606bd668ec4d25d4 100644 (file)
@@ -27,7 +27,7 @@
  *   You should have received a copy of the GNU General Public License     *
  *   along with this program; if not, write to the                         *
  *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
  ***************************************************************************/
 
 #ifndef TARGET_H
@@ -41,6 +41,7 @@ struct watchpoint;
 struct mem_param;
 struct reg_param;
 struct target_list;
+struct gdb_fileio_info;
 
 /*
  * TARGET_UNKNOWN = 0: we don't know anything about the target yet
@@ -95,6 +96,7 @@ struct working_area {
        uint32_t size;
        bool free;
        uint8_t *backup;
+       struct working_area **user;
        struct working_area *next;
 };
 
@@ -107,6 +109,18 @@ struct gdb_service {
        int32_t core[2];
 };
 
+/* target back off timer */
+struct backoff_timer {
+       int times;
+       int count;
+};
+
+/* split target registers into multiple class */
+enum target_register_class {
+       REG_CLASS_ALL,
+       REG_CLASS_GENERAL,
+};
+
 /* target_type.h contains the full definition of struct target_type */
 struct target {
        struct target_type *type;                       /* target type definition (name, access functions) */
@@ -170,7 +184,7 @@ struct target {
        struct rtos *rtos;                                      /* Instance of Real Time Operating System support */
        bool rtos_auto_detect;                          /* A flag that indicates that the RTOS has been specified as "auto"
                                                                                 * and must be detected when symbols are offered */
-
+       struct backoff_timer backoff;
        int smp;                                                        /* add some target attributes for smp support */
        struct target_list *head;
        /* the gdb service is there in case of smp, we have only one gdb server
@@ -178,6 +192,9 @@ struct target {
         * the target attached to the gdb is changing dynamically by changing
         * gdb_service->target pointer */
        struct gdb_service *gdb_service;
+
+       /* file-I/O information for host to do syscall */
+       struct gdb_fileio_info *fileio_info;
 };
 
 struct target_list {
@@ -185,6 +202,14 @@ struct target_list {
        struct target_list *next;
 };
 
+struct gdb_fileio_info {
+       char *identifier;
+       uint32_t param_1;
+       uint32_t param_2;
+       uint32_t param_3;
+       uint32_t param_4;
+};
+
 /** Returns the instance-specific name of the specified target. */
 static inline const char *target_name(struct target *target)
 {
@@ -386,13 +411,22 @@ int target_add_watchpoint(struct target *target,
 int target_remove_watchpoint(struct target *target,
                struct watchpoint *watchpoint);
 
+/**
+ * Find out the just hit @a watchpoint for @a target.
+ *
+ * This routine is a wrapper for target->type->hit_watchpoint.
+ */
+int target_hit_watchpoint(struct target *target,
+               struct watchpoint **watchpoint);
+
 /**
  * Obtain the registers for GDB.
  *
  * This routine is a wrapper for target->type->get_gdb_reg_list.
  */
 int target_get_gdb_reg_list(struct target *target,
-               struct reg **reg_list[], int *reg_list_size);
+               struct reg **reg_list[], int *reg_list_size,
+               enum target_register_class reg_class);
 
 /**
  * Step the target.
@@ -454,6 +488,8 @@ int target_run_flash_async_algorithm(struct target *target,
  */
 int target_read_memory(struct target *target,
                uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
+int target_read_phys_memory(struct target *target,
+               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. @a address must be aligned to @a size
@@ -473,16 +509,8 @@ int target_read_memory(struct target *target,
  */
 int target_write_memory(struct target *target,
                uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
-
-/**
- * Write @a count items of 4 bytes to the memory of @a target at
- * the @a address given.  Because it operates only on whole words,
- * this should be faster than target_write_memory().
- *
- * This routine is wrapper for target->type->bulk_write_memory.
- */
-int target_bulk_write_memory(struct target *target,
-               uint32_t address, uint32_t count, const uint8_t *buffer);
+int target_write_phys_memory(struct target *target,
+               uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
 
 /*
  * Write to target memory using the virtual address.
@@ -518,6 +546,22 @@ int target_blank_check_memory(struct target *target,
                uint32_t address, uint32_t size, uint32_t *blank);
 int target_wait_state(struct target *target, enum target_state state, int ms);
 
+/**
+ * Obtain file-I/O information from target for GDB to do syscall.
+ *
+ * This routine is a wrapper for target->type->get_gdb_fileio_info.
+ */
+int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info);
+
+/**
+ * Pass GDB file-I/O response to target after finishing host syscall.
+ *
+ * This routine is a wrapper for target->type->gdb_fileio_end.
+ */
+int target_gdb_fileio_end(struct target *target, int retcode, int fileio_errno, bool ctrl_c);
+
+
+
 /** Return the *name* of this targets current state */
 const char *target_state_name(struct target *target);