aarch64: handle semihosting in aarch32 state
[fw/openocd] / src / target / target.h
index 794ee833ecc81b4a9811a1f8fbe9c6f131959bcb..b9ae2f78e1255f4ff4f71f59ef6dc4f61edd0448 100644 (file)
 #define OPENOCD_TARGET_TARGET_H
 
 #include <helper/list.h>
+#include <jim.h>
 
 struct reg;
 struct trace;
 struct command_context;
+struct command_invocation;
 struct breakpoint;
 struct watchpoint;
 struct mem_param;
@@ -45,7 +47,7 @@ struct gdb_fileio_info;
 
 /*
  * TARGET_UNKNOWN = 0: we don't know anything about the target yet
- * TARGET_RUNNING = 1: the target is executing user code
+ * TARGET_RUNNING = 1: the target is executing or ready to execute user code
  * TARGET_HALTED  = 2: the target is not executing code, and ready to talk to the
  * debugger. on an xscale it means that the debug handler is executing
  * TARGET_RESET   = 3: the target is being held in reset (only a temporary state,
@@ -209,6 +211,8 @@ struct target {
 
        char *gdb_port_override;                        /* target-specific override for gdb_port */
 
+       int gdb_max_connections;                        /* max number of simultaneous gdb connections */
+
        /* The semihosting information, extracted from the target. */
        struct semihosting *semihosting;
 };
@@ -257,6 +261,8 @@ enum target_event {
        TARGET_EVENT_RESUMED,           /* target resumed to normal execution */
        TARGET_EVENT_RESUME_START,
        TARGET_EVENT_RESUME_END,
+       TARGET_EVENT_STEP_START,
+       TARGET_EVENT_STEP_END,
 
        TARGET_EVENT_GDB_START, /* debugger started execution (step/run) */
        TARGET_EVENT_GDB_END, /* debugger stopped execution (step/run) */
@@ -274,6 +280,7 @@ enum target_event {
        TARGET_EVENT_DEBUG_RESUMED, /* target resumed to execute on behalf of the debugger */
 
        TARGET_EVENT_EXAMINE_START,
+       TARGET_EVENT_EXAMINE_FAIL,
        TARGET_EVENT_EXAMINE_END,
 
        TARGET_EVENT_GDB_ATTACH,
@@ -289,9 +296,8 @@ enum target_event {
 
 struct target_event_action {
        enum target_event event;
-       struct Jim_Interp *interp;
-       struct Jim_Obj *body;
-       int has_percent;
+       Jim_Interp *interp;
+       Jim_Obj *body;
        struct target_event_action *next;
 };
 
@@ -502,6 +508,16 @@ int target_get_gdb_reg_list(struct target *target,
                struct reg **reg_list[], int *reg_list_size,
                enum target_register_class reg_class);
 
+/**
+ * Obtain the registers for GDB, but don't read register values from the
+ * target.
+ *
+ * This routine is a wrapper for target->type->get_gdb_reg_list_noread.
+ */
+int target_get_gdb_reg_list_noread(struct target *target,
+               struct reg **reg_list[], int *reg_list_size,
+               enum target_register_class reg_class);
+
 /**
  * Check if @a target allows GDB connections.
  *
@@ -561,6 +577,18 @@ int target_run_flash_async_algorithm(struct target *target,
                uint32_t entry_point, uint32_t exit_point,
                void *arch_info);
 
+/**
+ * This routine is a wrapper for asynchronous algorithms.
+ *
+ */
+int target_run_read_async_algorithm(struct target *target,
+               uint8_t *buffer, uint32_t count, int block_size,
+               int num_mem_params, struct mem_param *mem_params,
+               int num_reg_params, struct reg_param *reg_params,
+               uint32_t buffer_start, uint32_t buffer_size,
+               uint32_t entry_point, uint32_t exit_point,
+               void *arch_info);
+
 /**
  * Read @a count items of @a size bytes from the memory of @a target at
  * the @a address given.
@@ -642,7 +670,17 @@ int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fi
  */
 int target_gdb_fileio_end(struct target *target, int retcode, int fileio_errno, bool ctrl_c);
 
+/**
+ * Return the highest accessible address for this target.
+ */
+target_addr_t target_address_max(struct target *target);
 
+/**
+ * Return the number of address bits this target supports.
+ *
+ * This routine is a wrapper for target->type->address_bits.
+ */
+unsigned target_address_bits(struct target *target);
 
 /** Return the *name* of this targets current state */
 const char *target_state_name(struct target *target);
@@ -720,6 +758,13 @@ int target_arch_state(struct target *target);
 
 void target_handle_event(struct target *t, enum target_event e);
 
+void target_handle_md_output(struct command_invocation *cmd,
+       struct target *target, target_addr_t address, unsigned size,
+       unsigned count, const uint8_t *buffer);
+
+int target_profiling_default(struct target *target, uint32_t *samples, uint32_t
+               max_num_samples, uint32_t *num_samples, uint32_t seconds);
+
 #define ERROR_TARGET_INVALID   (-300)
 #define ERROR_TARGET_INIT_FAILED (-301)
 #define ERROR_TARGET_TIMEOUT   (-302)
@@ -732,6 +777,7 @@ void target_handle_event(struct target *t, enum target_event e);
 #define ERROR_TARGET_NOT_RUNNING (-310)
 #define ERROR_TARGET_NOT_EXAMINED (-311)
 #define ERROR_TARGET_DUPLICATE_BREAKPOINT (-312)
+#define ERROR_TARGET_ALGO_EXIT  (-313)
 
 extern bool get_target_reset_nag(void);