DBG_REASON_WATCHPOINT = 2,
DBG_REASON_WPTANDBKPT = 3,
DBG_REASON_SINGLESTEP = 4,
- DBG_REASON_NOTHALTED = 5
+ DBG_REASON_NOTHALTED = 5,
+ DBG_REASON_UNDEFINED = 6
};
extern char *target_debug_reason_strings[];
/* target request support */
int (*target_request_data)(struct target_s *target, u32 size, u8 *buffer);
- /* target execution control */
+ /* halt will log a warning, but return ERROR_OK if the target is already halted. */
int (*halt)(struct target_s *target);
int (*resume)(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution);
int (*step)(struct target_s *target, int current, u32 address, int handle_breakpoints);
int (*soft_reset_halt)(struct target_s *target);
int (*prepare_reset_halt)(struct target_s *target);
- /* target register access for gdb */
+ /* target register access for gdb.
+ *
+ * Danger! this function will succeed even if the target is running
+ * and return a register list with dummy values.
+ *
+ * The reason is that GDB connection will fail without a valid register
+ * list, however it is after GDB is connected that monitor commands can
+ * be run to properly initialize the target
+ */
int (*get_gdb_reg_list)(struct target_s *target, struct reg_s **reg_list[], int *reg_list_size);
/* target memory access
extern int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
extern int target_call_event_callbacks(target_t *target, enum target_event event);
+/* The period is very approximate, the callback can happen much more often
+ * or much more rarely than specified
+ */
extern int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv);
extern int target_unregister_timer_callback(int (*callback)(void *priv), void *priv);
-extern int target_call_timer_callbacks();
+extern int target_call_timer_callbacks_now();
+/* invoke this to ensure that e.g. polling timer callbacks happen before
+ * a syncrhonous command completes.
+ */
+extern int target_call_timer_callbacks_now_now();
extern target_t* get_current_target(struct command_context_s *cmd_ctx);
extern int get_num_by_target(target_t *query_target);
#define ERROR_TARGET_INVALID (-300)
#define ERROR_TARGET_INIT_FAILED (-301)
#define ERROR_TARGET_TIMEOUT (-302)
-#define ERROR_TARGET_ALREADY_HALTED (-303)
#define ERROR_TARGET_NOT_HALTED (-304)
#define ERROR_TARGET_FAILURE (-305)
#define ERROR_TARGET_UNALIGNED_ACCESS (-306)