target: document possibly unreachable target in deinit_target()
[fw/openocd] / src / target / target_type.h
index 0960e6d59392391ffc86870f247c5f73c0a9924f..a26c2e7d875a7145041b9ba3c5ffe343ea4d8520 100644 (file)
@@ -25,7 +25,7 @@
 #ifndef OPENOCD_TARGET_TARGET_TYPE_H
 #define OPENOCD_TARGET_TARGET_TYPE_H
 
-#include <jim-nvp.h>
+#include <helper/jim-nvp.h>
 
 struct target;
 
@@ -40,7 +40,6 @@ struct target_type {
         * field directly, use target_type_name() instead.
         */
        const char *name;
-       const char *deprecated_name;
 
        /* poll current target status */
        int (*poll)(struct target *target);
@@ -80,14 +79,23 @@ struct target_type {
         * state correctly.
         *
         * Otherwise the following would fail, as there will not
-        * be any "poll" invoked inbetween the "reset run" and
+        * be any "poll" invoked between the "reset run" and
         * "halt".
         *
         * reset run; halt
-     */
+        */
        int (*deassert_reset)(struct target *target);
        int (*soft_reset_halt)(struct target *target);
 
+       /**
+        * Target architecture for GDB.
+        *
+        * The string returned by this function will not be automatically freed;
+        * if dynamic allocation is used for this value, it must be managed by
+        * the target, ideally by caching the result for subsequent calls.
+        */
+       const char *(*get_gdb_arch)(struct target *target);
+
        /**
         * Target register access for GDB.  Do @b not call this function
         * directly, use target_get_gdb_reg_list() instead.
@@ -102,6 +110,13 @@ struct target_type {
        int (*get_gdb_reg_list)(struct target *target, struct reg **reg_list[],
                        int *reg_list_size, enum target_register_class reg_class);
 
+       /**
+        * Same as get_gdb_reg_list, but doesn't read the register values.
+        * */
+       int (*get_gdb_reg_list_noread)(struct target *target,
+                       struct reg **reg_list[], int *reg_list_size,
+                       enum target_register_class reg_class);
+
        /* target memory access
        * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
        * count: number of items of <size>
@@ -130,8 +145,9 @@ struct target_type {
 
        int (*checksum_memory)(struct target *target, target_addr_t address,
                        uint32_t count, uint32_t *checksum);
-       int (*blank_check_memory)(struct target *target, target_addr_t address,
-                       uint32_t count, uint32_t *blank, uint8_t erased_value);
+       int (*blank_check_memory)(struct target *target,
+                       struct target_memory_check_block *blocks, int num_blocks,
+                       uint8_t erased_value);
 
        /*
         * target break-/watchpoint control
@@ -194,11 +210,11 @@ struct target_type {
        /* called for various config parameters */
        /* returns JIM_CONTINUE - if option not understood */
        /* otherwise: JIM_OK, or JIM_ERR, */
-       int (*target_jim_configure)(struct target *target, Jim_GetOptInfo *goi);
+       int (*target_jim_configure)(struct target *target, struct jim_getopt_info *goi);
 
        /* target commands specifically handled by the target */
        /* returns JIM_OK, or JIM_ERR, or JIM_CONTINUE - if option not understood */
-       int (*target_jim_commands)(struct target *target, Jim_GetOptInfo *goi);
+       int (*target_jim_commands)(struct target *target, struct jim_getopt_info *goi);
 
        /**
         * This method is used to perform target setup that requires
@@ -226,6 +242,17 @@ struct target_type {
        /**
         * Free all the resources allocated by the target.
         *
+        * WARNING: deinit_target is called unconditionally regardless the target has
+        * ever been examined/initialised or not.
+        * If a problem has prevented establishing JTAG/SWD/... communication
+        *  or
+        * if the target was created with -defer-examine flag and has never been
+        *  examined
+        * then it is not possible to communicate with the target.
+        *
+        * If you need to talk to the target during deinit, first check if
+        * target_was_examined()!
+        *
         * @param target The target to deinit
         */
        void (*deinit_target)(struct target *target);
@@ -274,6 +301,16 @@ struct target_type {
         */
        int (*profiling)(struct target *target, uint32_t *samples,
                        uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds);
+
+       /* Return the number of address bits this target supports. This will
+        * typically be 32 for 32-bit targets, and 64 for 64-bit targets. If not
+        * implemented, it's assumed to be 32. */
+       unsigned (*address_bits)(struct target *target);
+
+       /* Return the number of system bus data bits this target supports. This
+        * will typically be 32 for 32-bit targets, and 64 for 64-bit targets. If
+        * not implemented, it's assumed to be 32. */
+       unsigned int (*data_bits)(struct target *target);
 };
 
 #endif /* OPENOCD_TARGET_TARGET_TYPE_H */