X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget.h;h=dae5f19e717ae7084787e764f14107239c6b7d3c;hb=96261e827782235709fcdfb2c1bbb93fedc977be;hp=dc6d8ce14927153a6a5772adacfa2df1a65e9efc;hpb=ef139a3a5e41fbcbabdf4be0ecbbb5591448ad2e;p=openocd.git diff --git a/src/target/target.h b/src/target/target.h index dc6d8ce149..dae5f19e71 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -23,6 +23,7 @@ #include "register.h" #include "breakpoints.h" #include "algorithm.h" +#include "trace.h" #include "command.h" #include "types.h" @@ -32,7 +33,16 @@ struct reg_s; struct command_context_s; - +/* +TARGET_UNKNOWN = 0: we don't know anything about the target yet +TARGET_RUNNING = 1: the target is executing 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, +not sure how this is used with all the recent changes) +TARGET_DEBUG_RUNNING = 4: the target is running, but it is executing code on +behalf of the debugger (e.g. algorithm for flashing) +*/ enum target_state { TARGET_UNKNOWN = 0, @@ -50,6 +60,8 @@ enum daemon_startup_mode DAEMON_RESET, /* reset target (behaviour defined by reset_mode */ }; +extern enum daemon_startup_mode startup_mode; + enum target_reset_mode { RESET_RUN = 0, /* reset and let target run */ @@ -66,7 +78,8 @@ enum target_debug_reason 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[]; @@ -95,9 +108,13 @@ typedef struct target_type_s char *name; /* poll current target status */ - enum target_state (*poll)(struct target_s *target); - /* architecture specific status reply */ - int (*arch_state)(struct target_s *target, char *buf, int buf_size); + int (*poll)(struct target_s *target); + /* Invoked only from target_arch_state(). + * Issue USER() w/architecture specific status. */ + int (*arch_state)(struct target_s *target); + + /* target request support */ + int (*target_request_data)(struct target_s *target, u32 size, u8 *buffer); /* target execution control */ int (*halt)(struct target_s *target); @@ -108,6 +125,7 @@ typedef struct target_type_s int (*assert_reset)(struct target_s *target); int (*deassert_reset)(struct target_s *target); int (*soft_reset_halt)(struct target_s *target); + int (*prepare_reset_halt)(struct target_s *target); /* target register access for gdb */ int (*get_gdb_reg_list)(struct target_s *target, struct reg_s **reg_list[], int *reg_list_size); @@ -122,12 +140,14 @@ typedef struct target_type_s /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */ int (*bulk_write_memory)(struct target_s *target, u32 address, u32 count, u8 *buffer); + int (*checksum_memory)(struct target_s *target, u32 address, u32 count, u32* checksum); + /* target break-/watchpoint control * rw: 0 = write, 1 = read, 2 = access */ - int (*add_breakpoint)(struct target_s *target, u32 address, u32 length, enum breakpoint_type type); + int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint); int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint); - int (*add_watchpoint)(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw); + int (*add_watchpoint)(struct target_s *target, watchpoint_t *watchpoint); int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint); /* target algorithm support */ @@ -138,6 +158,9 @@ typedef struct target_type_s int (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target); int (*quit)(void); + int (*virt2phys)(struct target_s *target, u32 address, u32 *physical); + int (*mmu)(struct target_s *target, int *enabled); + } target_type_t; typedef struct target_s @@ -148,16 +171,24 @@ typedef struct target_s char *reset_script; /* script file to initialize the target after a reset */ char *post_halt_script; /* script file to execute after the target halted */ char *pre_resume_script; /* script file to execute before the target resumed */ - u32 working_area; /* working area (initialized RAM) */ + char *gdb_program_script; /* script file to execute before programming vis gdb */ + u32 working_area; /* working area (initialized RAM). Evaluated + upon first allocation from virtual/physical address. + */ + u32 working_area_virt; /* virtual address */ + u32 working_area_phys; /* physical address */ u32 working_area_size; /* size in bytes */ u32 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 */ + enum target_debug_reason debug_reason;/* reason why the target entered debug state */ enum target_endianess endianness; /* target endianess */ enum target_state state; /* the current backend-state (running, halted, ...) */ struct reg_cache_s *reg_cache; /* the first register cache of the target (core regs) */ struct breakpoint_s *breakpoints; /* list of breakpoints */ struct watchpoint_s *watchpoints; /* list of watchpoints */ + struct trace_s *trace_info; /* generic trace information */ + struct debug_msg_receiver_s *dbgmsg;/* list of debug message receivers */ + u32 dbg_msg_enabled; /* debug message status */ void *arch_info; /* architecture specific information */ struct target_s *next; /* next target in list */ } target_t; @@ -169,6 +200,7 @@ enum target_event TARGET_EVENT_RESET, /* target entered reset */ TARGET_EVENT_DEBUG_HALTED, /* target entered debug state, but was executing on behalf of the debugger */ TARGET_EVENT_DEBUG_RESUMED, /* target resumed to execute on behalf of the debugger */ + TARGET_EVENT_GDB_PROGRAM /* target about to be be programmed by gdb */ }; typedef struct target_event_callback_s @@ -191,7 +223,9 @@ typedef struct target_timer_callback_s extern int target_register_commands(struct command_context_s *cmd_ctx); extern int target_register_user_commands(struct command_context_s *cmd_ctx); extern int target_init(struct command_context_s *cmd_ctx); +extern int target_init_reset(struct command_context_s *cmd_ctx); extern int handle_target(void *priv); +extern int target_process_reset(struct command_context_s *cmd_ctx); extern int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv); extern int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv); @@ -207,6 +241,7 @@ extern target_t* get_target_by_num(int num); extern int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer); extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer); +extern int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc); extern int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area); extern int target_free_working_area(struct target_s *target, working_area_t *area); @@ -222,6 +257,16 @@ extern u16 target_buffer_get_u16(target_t *target, u8 *buffer); extern void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value); extern void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value); +int target_read_u32(struct target_s *target, u32 address, u32 *value); +int target_read_u16(struct target_s *target, u32 address, u16 *value); +int target_read_u8(struct target_s *target, u32 address, u8 *value); +int target_write_u32(struct target_s *target, u32 address, u32 value); +int target_write_u16(struct target_s *target, u32 address, u16 value); +int target_write_u8(struct target_s *target, u32 address, u8 value); + +/* Issues USER() statements with target state information */ +int target_arch_state(struct target_s *target); + #define ERROR_TARGET_INVALID (-300) #define ERROR_TARGET_INIT_FAILED (-301) #define ERROR_TARGET_TIMEOUT (-302)