You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

418 lines
16 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * Copyright (C) 2007,2008 Øyvind Harboe *
  6. * oyvind.harboe@zylin.com *
  7. * *
  8. * Copyright (C) 2008 by Spencer Oliver *
  9. * spen@spen-soft.co.uk *
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. * This program is distributed in the hope that it will be useful, *
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  19. * GNU General Public License for more details. *
  20. * *
  21. * You should have received a copy of the GNU General Public License *
  22. * along with this program; if not, write to the *
  23. * Free Software Foundation, Inc., *
  24. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  25. ***************************************************************************/
  26. #ifndef TARGET_H
  27. #define TARGET_H
  28. #include "breakpoints.h"
  29. #include "algorithm.h"
  30. #include "command.h"
  31. struct reg_s;
  32. struct trace_s;
  33. struct command_context_s;
  34. /*
  35. * TARGET_UNKNOWN = 0: we don't know anything about the target yet
  36. * TARGET_RUNNING = 1: the target is executing user code
  37. * TARGET_HALTED = 2: the target is not executing code, and ready to talk to the
  38. * debugger. on an xscale it means that the debug handler is executing
  39. * TARGET_RESET = 3: the target is being held in reset (only a temporary state,
  40. * not sure how this is used with all the recent changes)
  41. * TARGET_DEBUG_RUNNING = 4: the target is running, but it is executing code on
  42. * behalf of the debugger (e.g. algorithm for flashing) */
  43. enum target_state
  44. {
  45. TARGET_UNKNOWN = 0,
  46. TARGET_RUNNING = 1,
  47. TARGET_HALTED = 2,
  48. TARGET_RESET = 3,
  49. TARGET_DEBUG_RUNNING = 4,
  50. };
  51. extern const Jim_Nvp nvp_target_state[];
  52. enum nvp_assert {
  53. NVP_DEASSERT,
  54. NVP_ASSERT,
  55. };
  56. extern const Jim_Nvp nvp_assert[];
  57. enum target_reset_mode
  58. {
  59. RESET_UNKNOWN = 0,
  60. RESET_RUN = 1, /* reset and let target run */
  61. RESET_HALT = 2, /* reset and halt target out of reset */
  62. RESET_INIT = 3, /* reset and halt target out of reset, then run init script */
  63. };
  64. extern const Jim_Nvp nvp_reset_mode[];
  65. enum target_debug_reason
  66. {
  67. DBG_REASON_DBGRQ = 0,
  68. DBG_REASON_BREAKPOINT = 1,
  69. DBG_REASON_WATCHPOINT = 2,
  70. DBG_REASON_WPTANDBKPT = 3,
  71. DBG_REASON_SINGLESTEP = 4,
  72. DBG_REASON_NOTHALTED = 5,
  73. DBG_REASON_UNDEFINED = 6
  74. };
  75. extern const Jim_Nvp nvp_target_debug_reason[];
  76. enum target_endianess
  77. {
  78. TARGET_ENDIAN_UNKNOWN=0,
  79. TARGET_BIG_ENDIAN = 1, TARGET_LITTLE_ENDIAN = 2
  80. };
  81. extern const Jim_Nvp nvp_target_endian[];
  82. struct target_s;
  83. typedef struct working_area_s
  84. {
  85. u32 address;
  86. u32 size;
  87. int free;
  88. u8 *backup;
  89. struct working_area_s **user;
  90. struct working_area_s *next;
  91. } working_area_t;
  92. // target_type.h contains the full definitionof struct target_type_s
  93. struct target_type_s;
  94. typedef struct target_type_s target_type_t;
  95. /* forward decloration */
  96. typedef struct target_event_action_s target_event_action_t;
  97. typedef struct target_s
  98. {
  99. target_type_t *type; /* target type definition (name, access functions) */
  100. const char *cmd_name; /* tcl Name of target */
  101. int target_number; /* generaly, target index but may not be in order */
  102. jtag_tap_t *tap; /* where on the jtag chain is this */
  103. const char *variant; /* what varient of this chip is it? */
  104. target_event_action_t *event_action;
  105. int reset_halt; /* attempt resetting the CPU into the halted mode? */
  106. u32 working_area; /* working area (initialized RAM). Evaluated
  107. * upon first allocation from virtual/physical address. */
  108. u32 working_area_virt; /* virtual address */
  109. u32 working_area_phys; /* physical address */
  110. u32 working_area_size; /* size in bytes */
  111. u32 backup_working_area; /* whether the content of the working area has to be preserved */
  112. struct working_area_s *working_areas;/* list of allocated working areas */
  113. enum target_debug_reason debug_reason;/* reason why the target entered debug state */
  114. enum target_endianess endianness; /* target endianess */
  115. enum target_state state; /* the current backend-state (running, halted, ...) */
  116. struct reg_cache_s *reg_cache; /* the first register cache of the target (core regs) */
  117. struct breakpoint_s *breakpoints; /* list of breakpoints */
  118. struct watchpoint_s *watchpoints; /* list of watchpoints */
  119. struct trace_s *trace_info; /* generic trace information */
  120. struct debug_msg_receiver_s *dbgmsg;/* list of debug message receivers */
  121. u32 dbg_msg_enabled; /* debug message status */
  122. void *arch_info; /* architecture specific information */
  123. struct target_s *next; /* next target in list */
  124. int display; /* display async info in telnet session. Do not display
  125. * lots of halted/resumed info when stepping in debugger. */
  126. } target_t;
  127. enum target_event
  128. {
  129. /* LD historical names
  130. * - Prior to the great TCL change
  131. * - June/July/Aug 2008
  132. * - Duane Ellis */
  133. TARGET_EVENT_OLD_gdb_program_config,
  134. TARGET_EVENT_OLD_pre_reset,
  135. TARGET_EVENT_OLD_post_reset,
  136. TARGET_EVENT_OLD_pre_resume,
  137. /* allow GDB to do stuff before others handle the halted event,
  138. * this is in lieu of defining ordering of invocation of events,
  139. * which would be more complicated */
  140. TARGET_EVENT_EARLY_HALTED,
  141. TARGET_EVENT_HALTED, /* target entered debug state from normal execution or reset */
  142. TARGET_EVENT_RESUMED, /* target resumed to normal execution */
  143. TARGET_EVENT_RESUME_START,
  144. TARGET_EVENT_RESUME_END,
  145. TARGET_EVENT_GDB_START, /* debugger started execution (step/run) */
  146. TARGET_EVENT_GDB_END, /* debugger stopped execution (step/run) */
  147. TARGET_EVENT_RESET_START,
  148. TARGET_EVENT_RESET_ASSERT_PRE,
  149. TARGET_EVENT_RESET_ASSERT_POST,
  150. TARGET_EVENT_RESET_DEASSERT_PRE,
  151. TARGET_EVENT_RESET_DEASSERT_POST,
  152. TARGET_EVENT_RESET_HALT_PRE,
  153. TARGET_EVENT_RESET_HALT_POST,
  154. TARGET_EVENT_RESET_WAIT_PRE,
  155. TARGET_EVENT_RESET_WAIT_POST,
  156. TARGET_EVENT_RESET_INIT,
  157. TARGET_EVENT_RESET_END,
  158. TARGET_EVENT_DEBUG_HALTED, /* target entered debug state, but was executing on behalf of the debugger */
  159. TARGET_EVENT_DEBUG_RESUMED, /* target resumed to execute on behalf of the debugger */
  160. TARGET_EVENT_EXAMINE_START,
  161. TARGET_EVENT_EXAMINE_END,
  162. TARGET_EVENT_GDB_ATTACH,
  163. TARGET_EVENT_GDB_DETACH,
  164. TARGET_EVENT_GDB_FLASH_ERASE_START,
  165. TARGET_EVENT_GDB_FLASH_ERASE_END,
  166. TARGET_EVENT_GDB_FLASH_WRITE_START,
  167. TARGET_EVENT_GDB_FLASH_WRITE_END,
  168. };
  169. struct target_event_action_s {
  170. enum target_event event;
  171. Jim_Obj *body;
  172. int has_percent;
  173. target_event_action_t *next;
  174. };
  175. typedef struct target_event_callback_s
  176. {
  177. int (*callback)(struct target_s *target, enum target_event event, void *priv);
  178. void *priv;
  179. struct target_event_callback_s *next;
  180. } target_event_callback_t;
  181. typedef struct target_timer_callback_s
  182. {
  183. int (*callback)(void *priv);
  184. int time_ms;
  185. int periodic;
  186. struct timeval when;
  187. void *priv;
  188. struct target_timer_callback_s *next;
  189. } target_timer_callback_t;
  190. extern int target_register_commands(struct command_context_s *cmd_ctx);
  191. extern int target_register_user_commands(struct command_context_s *cmd_ctx);
  192. extern int target_init(struct command_context_s *cmd_ctx);
  193. extern int target_examine(void);
  194. extern int handle_target(void *priv);
  195. extern int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode);
  196. extern int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
  197. extern int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
  198. extern int target_poll(target_t *target);
  199. extern int target_resume(target_t *target, int current, u32 address, int handle_breakpoints, int debug_execution);
  200. extern int target_halt(target_t *target);
  201. extern int target_call_event_callbacks(target_t *target, enum target_event event);
  202. /* The period is very approximate, the callback can happen much more often
  203. * or much more rarely than specified
  204. */
  205. extern int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv);
  206. extern int target_unregister_timer_callback(int (*callback)(void *priv), void *priv);
  207. extern int target_call_timer_callbacks(void);
  208. /* invoke this to ensure that e.g. polling timer callbacks happen before
  209. * a syncrhonous command completes.
  210. */
  211. extern int target_call_timer_callbacks_now(void);
  212. extern target_t* get_current_target(struct command_context_s *cmd_ctx);
  213. extern int get_num_by_target(target_t *query_target);
  214. extern target_t *get_target(const char *id);
  215. /**
  216. * Get the target name.
  217. *
  218. * This routine is a wrapper for the target->type->name field.
  219. */
  220. extern const char *target_get_name(struct target_s *target);
  221. /**
  222. * Examine the specified @a target.
  223. *
  224. * This routine is a wrapper for target->type->examine.
  225. */
  226. extern int target_examine_one(struct target_s *target);
  227. /// @returns @c true if the target has been examined.
  228. extern bool target_was_examined(struct target_s *target);
  229. /// Sets the @c examined flag for the given target.
  230. extern void target_set_examined(struct target_s *target);
  231. /// Reset the @c examined flag for the given target.
  232. extern void target_reset_examined(struct target_s *target);
  233. /**
  234. * Add the @a breakpoint for @a target.
  235. *
  236. * This routine is a wrapper for target->type->add_breakpoint.
  237. */
  238. extern int target_add_breakpoint(struct target_s *target,
  239. struct breakpoint_s *breakpoint);
  240. /**
  241. * Remove the @a breakpoint for @a target.
  242. *
  243. * This routine is a wrapper for target->type->remove_breakpoint.
  244. */
  245. extern int target_remove_breakpoint(struct target_s *target,
  246. struct breakpoint_s *breakpoint);
  247. /**
  248. * Add the @a watchpoint for @a target.
  249. *
  250. * This routine is a wrapper for target->type->add_watchpoint.
  251. */
  252. extern int target_add_watchpoint(struct target_s *target,
  253. struct watchpoint_s *watchpoint);
  254. /**
  255. * Remove the @a watchpoint for @a target.
  256. *
  257. * This routine is a wrapper for target->type->remove_watchpoint.
  258. */
  259. extern int target_remove_watchpoint(struct target_s *target,
  260. struct watchpoint_s *watchpoint);
  261. /**
  262. * Obtain the registers for GDB.
  263. *
  264. * This routine is a wrapper for target->type->get_gdb_reg_list.
  265. */
  266. extern int target_get_gdb_reg_list(struct target_s *target,
  267. struct reg_s **reg_list[], int *reg_list_size);
  268. /**
  269. * Step the target.
  270. *
  271. * This routine is a wrapper for target->type->step.
  272. */
  273. int target_step(struct target_s *target,
  274. int current, u32 address, int handle_breakpoints);
  275. /**
  276. * Run an algorithm on the @a target given.
  277. *
  278. * This routine is a wrapper for target->type->run_algorithm.
  279. */
  280. extern int target_run_algorithm(struct target_s *target,
  281. int num_mem_params, mem_param_t *mem_params,
  282. int num_reg_params, reg_param_t *reg_param,
  283. u32 entry_point, u32 exit_point,
  284. int timeout_ms, void *arch_info);
  285. /**
  286. * Read @a count items of @a size bytes from the memory of @a target at
  287. * the @a address given.
  288. *
  289. * This routine is a wrapper for target->type->read_memory.
  290. */
  291. extern int target_read_memory(struct target_s *target,
  292. u32 address, u32 size, u32 count, u8 *buffer);
  293. /**
  294. * Write @a count items of @a size bytes to the memory of @a target at
  295. * the @a address given.
  296. *
  297. * This routine is wrapper for target->type->write_memory.
  298. */
  299. extern int target_write_memory(struct target_s *target,
  300. u32 address, u32 size, u32 count, u8 *buffer);
  301. /**
  302. * Write @a count items of 4 bytes to the memory of @a target at
  303. * the @a address given. Because it operates only on whole words,
  304. * this should be faster than target_write_memory().
  305. *
  306. * This routine is wrapper for target->type->bulk_write_memory.
  307. */
  308. extern int target_bulk_write_memory(struct target_s *target,
  309. u32 address, u32 count, u8 *buffer);
  310. extern int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer);
  311. extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer);
  312. extern int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc);
  313. extern int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank);
  314. extern int target_wait_state(target_t *target, enum target_state state, int ms);
  315. /* DANGER!!!!!
  316. *
  317. * if "area" passed in to target_alloc_working_area() points to a memory
  318. * location that goes out of scope (e.g. a pointer on the stack), then
  319. * the caller of target_alloc_working_area() is responsible for invoking
  320. * target_free_working_area() before "area" goes out of scope.
  321. *
  322. * target_free_all_working_areas() will NULL out the "area" pointer
  323. * upon resuming or resetting the CPU.
  324. *
  325. */
  326. extern int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area);
  327. extern int target_free_working_area(struct target_s *target, working_area_t *area);
  328. extern int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore);
  329. extern void target_free_all_working_areas(struct target_s *target);
  330. extern void target_free_all_working_areas_restore(struct target_s *target, int restore);
  331. extern target_t *all_targets;
  332. extern target_event_callback_t *target_event_callbacks;
  333. extern target_timer_callback_t *target_timer_callbacks;
  334. extern u32 target_buffer_get_u32(target_t *target, const u8 *buffer);
  335. extern u16 target_buffer_get_u16(target_t *target, const u8 *buffer);
  336. extern u8 target_buffer_get_u8 (target_t *target, const u8 *buffer);
  337. extern void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value);
  338. extern void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value);
  339. extern void target_buffer_set_u8 (target_t *target, u8 *buffer, u8 value);
  340. int target_read_u32(struct target_s *target, u32 address, u32 *value);
  341. int target_read_u16(struct target_s *target, u32 address, u16 *value);
  342. int target_read_u8(struct target_s *target, u32 address, u8 *value);
  343. int target_write_u32(struct target_s *target, u32 address, u32 value);
  344. int target_write_u16(struct target_s *target, u32 address, u16 value);
  345. int target_write_u8(struct target_s *target, u32 address, u8 value);
  346. /* Issues USER() statements with target state information */
  347. int target_arch_state(struct target_s *target);
  348. void target_handle_event( target_t *t, enum target_event e);
  349. void target_all_handle_event( enum target_event e );
  350. #define ERROR_TARGET_INVALID (-300)
  351. #define ERROR_TARGET_INIT_FAILED (-301)
  352. #define ERROR_TARGET_TIMEOUT (-302)
  353. #define ERROR_TARGET_NOT_HALTED (-304)
  354. #define ERROR_TARGET_FAILURE (-305)
  355. #define ERROR_TARGET_UNALIGNED_ACCESS (-306)
  356. #define ERROR_TARGET_DATA_ABORT (-307)
  357. #define ERROR_TARGET_RESOURCE_NOT_AVAILABLE (-308)
  358. #define ERROR_TARGET_TRANSLATION_FAULT (-309)
  359. #define ERROR_TARGET_NOT_RUNNING (-310)
  360. #define ERROR_TARGET_NOT_EXAMINED (-311)
  361. extern const Jim_Nvp nvp_error_target[];
  362. extern const char *target_strerror_safe( int err );
  363. #endif /* TARGET_H */