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.
 
 
 
 
 
 

1676 lines
47 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * Copyright (C) 2006 by Magnus Lundin *
  6. * lundin@mlu.mine.nu *
  7. * *
  8. * Copyright (C) 2008 by Spencer Oliver *
  9. * spen@spen-soft.co.uk *
  10. * *
  11. * Copyright (C) 2009 by Dirk Behme *
  12. * dirk.behme@gmail.com - copy from cortex_m3 *
  13. * *
  14. * This program is free software; you can redistribute it and/or modify *
  15. * it under the terms of the GNU General Public License as published by *
  16. * the Free Software Foundation; either version 2 of the License, or *
  17. * (at your option) any later version. *
  18. * *
  19. * This program is distributed in the hope that it will be useful, *
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  22. * GNU General Public License for more details. *
  23. * *
  24. * You should have received a copy of the GNU General Public License *
  25. * along with this program; if not, write to the *
  26. * Free Software Foundation, Inc., *
  27. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  28. * *
  29. * Cortex-A8(tm) TRM, ARM DDI 0344H *
  30. * *
  31. ***************************************************************************/
  32. #ifdef HAVE_CONFIG_H
  33. #include "config.h"
  34. #endif
  35. #include "cortex_a8.h"
  36. #include "armv7a.h"
  37. #include "armv4_5.h"
  38. #include "target_request.h"
  39. #include "target_type.h"
  40. /* cli handling */
  41. int cortex_a8_register_commands(struct command_context_s *cmd_ctx);
  42. /* forward declarations */
  43. int cortex_a8_target_create(struct target_s *target, Jim_Interp *interp);
  44. int cortex_a8_init_target(struct command_context_s *cmd_ctx,
  45. struct target_s *target);
  46. int cortex_a8_examine(struct target_s *target);
  47. int cortex_a8_poll(target_t *target);
  48. int cortex_a8_halt(target_t *target);
  49. int cortex_a8_resume(struct target_s *target, int current, uint32_t address,
  50. int handle_breakpoints, int debug_execution);
  51. int cortex_a8_step(struct target_s *target, int current, uint32_t address,
  52. int handle_breakpoints);
  53. int cortex_a8_debug_entry(target_t *target);
  54. int cortex_a8_restore_context(target_t *target);
  55. int cortex_a8_bulk_write_memory(target_t *target, uint32_t address,
  56. uint32_t count, uint8_t *buffer);
  57. int cortex_a8_set_breakpoint(struct target_s *target,
  58. breakpoint_t *breakpoint, uint8_t matchmode);
  59. int cortex_a8_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
  60. int cortex_a8_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
  61. int cortex_a8_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
  62. int cortex_a8_dap_read_coreregister_u32(target_t *target,
  63. uint32_t *value, int regnum);
  64. int cortex_a8_dap_write_coreregister_u32(target_t *target,
  65. uint32_t value, int regnum);
  66. int cortex_a8_assert_reset(target_t *target);
  67. int cortex_a8_deassert_reset(target_t *target);
  68. target_type_t cortexa8_target =
  69. {
  70. .name = "cortex_a8",
  71. .poll = cortex_a8_poll,
  72. .arch_state = armv7a_arch_state,
  73. .target_request_data = NULL,
  74. .halt = cortex_a8_halt,
  75. .resume = cortex_a8_resume,
  76. .step = cortex_a8_step,
  77. .assert_reset = cortex_a8_assert_reset,
  78. .deassert_reset = cortex_a8_deassert_reset,
  79. .soft_reset_halt = NULL,
  80. .get_gdb_reg_list = armv4_5_get_gdb_reg_list,
  81. .read_memory = cortex_a8_read_memory,
  82. .write_memory = cortex_a8_write_memory,
  83. .bulk_write_memory = cortex_a8_bulk_write_memory,
  84. .checksum_memory = arm7_9_checksum_memory,
  85. .blank_check_memory = arm7_9_blank_check_memory,
  86. .run_algorithm = armv4_5_run_algorithm,
  87. .add_breakpoint = cortex_a8_add_breakpoint,
  88. .remove_breakpoint = cortex_a8_remove_breakpoint,
  89. .add_watchpoint = NULL,
  90. .remove_watchpoint = NULL,
  91. .register_commands = cortex_a8_register_commands,
  92. .target_create = cortex_a8_target_create,
  93. .init_target = cortex_a8_init_target,
  94. .examine = cortex_a8_examine,
  95. .quit = NULL
  96. };
  97. /*
  98. * FIXME do topology discovery using the ROM; don't
  99. * assume this is an OMAP3.
  100. */
  101. #define swjdp_memoryap 0
  102. #define swjdp_debugap 1
  103. #define OMAP3530_DEBUG_BASE 0x54011000
  104. /*
  105. * Cortex-A8 Basic debug access, very low level assumes state is saved
  106. */
  107. int cortex_a8_init_debug_access(target_t *target)
  108. {
  109. /* get pointers to arch-specific information */
  110. armv4_5_common_t *armv4_5 = target->arch_info;
  111. armv7a_common_t *armv7a = armv4_5->arch_info;
  112. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  113. int retval;
  114. uint32_t dummy;
  115. LOG_DEBUG(" ");
  116. /* Unlocking the debug registers for modification */
  117. /* The debugport might be uninitialised so try twice */
  118. retval = mem_ap_write_atomic_u32(swjdp, armv7a->debug_base + CPUDBG_LOCKACCESS, 0xC5ACCE55);
  119. if (retval != ERROR_OK)
  120. mem_ap_write_atomic_u32(swjdp, armv7a->debug_base + CPUDBG_LOCKACCESS, 0xC5ACCE55);
  121. /* Clear Sticky Power Down status Bit in PRSR to enable access to
  122. the registers in the Core Power Domain */
  123. retval = mem_ap_read_atomic_u32(swjdp, armv7a->debug_base + CPUDBG_PRSR, &dummy);
  124. /* Enabling of instruction execution in debug mode is done in debug_entry code */
  125. /* Resync breakpoint registers */
  126. /* Since this is likley called from init or reset, update targtet state information*/
  127. cortex_a8_poll(target);
  128. return retval;
  129. }
  130. int cortex_a8_exec_opcode(target_t *target, uint32_t opcode)
  131. {
  132. uint32_t dscr;
  133. int retval;
  134. /* get pointers to arch-specific information */
  135. armv4_5_common_t *armv4_5 = target->arch_info;
  136. armv7a_common_t *armv7a = armv4_5->arch_info;
  137. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  138. LOG_DEBUG("exec opcode 0x%08" PRIx32, opcode);
  139. do
  140. {
  141. retval = mem_ap_read_atomic_u32(swjdp,
  142. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  143. if (retval != ERROR_OK)
  144. {
  145. LOG_ERROR("Could not read DSCR register, opcode = 0x%08" PRIx32, opcode);
  146. return retval;
  147. }
  148. }
  149. while ((dscr & (1 << DSCR_INSTR_COMP)) == 0); /* Wait for InstrCompl bit to be set */
  150. mem_ap_write_u32(swjdp, armv7a->debug_base + CPUDBG_ITR, opcode);
  151. do
  152. {
  153. retval = mem_ap_read_atomic_u32(swjdp,
  154. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  155. if (retval != ERROR_OK)
  156. {
  157. LOG_ERROR("Could not read DSCR register");
  158. return retval;
  159. }
  160. }
  161. while ((dscr & (1 << DSCR_INSTR_COMP)) == 0); /* Wait for InstrCompl bit to be set */
  162. return retval;
  163. }
  164. /**************************************************************************
  165. Read core register with very few exec_opcode, fast but needs work_area.
  166. This can cause problems with MMU active.
  167. **************************************************************************/
  168. int cortex_a8_read_regs_through_mem(target_t *target, uint32_t address,
  169. uint32_t * regfile)
  170. {
  171. int retval = ERROR_OK;
  172. /* get pointers to arch-specific information */
  173. armv4_5_common_t *armv4_5 = target->arch_info;
  174. armv7a_common_t *armv7a = armv4_5->arch_info;
  175. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  176. cortex_a8_dap_read_coreregister_u32(target, regfile, 0);
  177. cortex_a8_dap_write_coreregister_u32(target, address, 0);
  178. cortex_a8_exec_opcode(target, ARMV4_5_STMIA(0, 0xFFFE, 0, 0));
  179. dap_ap_select(swjdp, swjdp_memoryap);
  180. mem_ap_read_buf_u32(swjdp, (uint8_t *)(&regfile[1]), 4*15, address);
  181. dap_ap_select(swjdp, swjdp_debugap);
  182. return retval;
  183. }
  184. int cortex_a8_read_cp(target_t *target, uint32_t *value, uint8_t CP,
  185. uint8_t op1, uint8_t CRn, uint8_t CRm, uint8_t op2)
  186. {
  187. int retval;
  188. /* get pointers to arch-specific information */
  189. armv4_5_common_t *armv4_5 = target->arch_info;
  190. armv7a_common_t *armv7a = armv4_5->arch_info;
  191. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  192. cortex_a8_exec_opcode(target, ARMV4_5_MRC(CP, op1, 0, CRn, CRm, op2));
  193. /* Move R0 to DTRTX */
  194. cortex_a8_exec_opcode(target, ARMV4_5_MCR(14, 0, 0, 0, 5, 0));
  195. /* Read DCCTX */
  196. retval = mem_ap_read_atomic_u32(swjdp,
  197. armv7a->debug_base + CPUDBG_DTRTX, value);
  198. return retval;
  199. }
  200. int cortex_a8_write_cp(target_t *target, uint32_t value,
  201. uint8_t CP, uint8_t op1, uint8_t CRn, uint8_t CRm, uint8_t op2)
  202. {
  203. int retval;
  204. uint32_t dscr;
  205. /* get pointers to arch-specific information */
  206. armv4_5_common_t *armv4_5 = target->arch_info;
  207. armv7a_common_t *armv7a = armv4_5->arch_info;
  208. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  209. LOG_DEBUG("CP%i, CRn %i, value 0x%08" PRIx32, CP, CRn, value);
  210. /* Check that DCCRX is not full */
  211. retval = mem_ap_read_atomic_u32(swjdp,
  212. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  213. if (dscr & (1 << DSCR_DTR_RX_FULL))
  214. {
  215. LOG_ERROR("DSCR_DTR_RX_FULL, dscr 0x%08" PRIx32, dscr);
  216. /* Clear DCCRX with MCR(p14, 0, Rd, c0, c5, 0), opcode 0xEE000E15 */
  217. cortex_a8_exec_opcode(target, ARMV4_5_MRC(14, 0, 0, 0, 5, 0));
  218. }
  219. retval = mem_ap_write_u32(swjdp,
  220. armv7a->debug_base + CPUDBG_DTRRX, value);
  221. /* Move DTRRX to r0 */
  222. cortex_a8_exec_opcode(target, ARMV4_5_MRC(14, 0, 0, 0, 5, 0));
  223. cortex_a8_exec_opcode(target, ARMV4_5_MCR(CP, op1, 0, CRn, CRm, op2));
  224. return retval;
  225. }
  226. int cortex_a8_read_cp15(target_t *target, uint32_t op1, uint32_t op2,
  227. uint32_t CRn, uint32_t CRm, uint32_t *value)
  228. {
  229. return cortex_a8_read_cp(target, value, 15, op1, CRn, CRm, op2);
  230. }
  231. int cortex_a8_write_cp15(target_t *target, uint32_t op1, uint32_t op2,
  232. uint32_t CRn, uint32_t CRm, uint32_t value)
  233. {
  234. return cortex_a8_write_cp(target, value, 15, op1, CRn, CRm, op2);
  235. }
  236. int cortex_a8_dap_read_coreregister_u32(target_t *target,
  237. uint32_t *value, int regnum)
  238. {
  239. int retval = ERROR_OK;
  240. uint8_t reg = regnum&0xFF;
  241. uint32_t dscr;
  242. /* get pointers to arch-specific information */
  243. armv4_5_common_t *armv4_5 = target->arch_info;
  244. armv7a_common_t *armv7a = armv4_5->arch_info;
  245. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  246. if (reg > 16)
  247. return retval;
  248. if (reg < 15)
  249. {
  250. /* Rn to DCCTX, MCR p14, 0, Rd, c0, c5, 0, 0xEE000E15 */
  251. cortex_a8_exec_opcode(target, ARMV4_5_MCR(14, 0, reg, 0, 5, 0));
  252. }
  253. else if (reg == 15)
  254. {
  255. cortex_a8_exec_opcode(target, 0xE1A0000F);
  256. cortex_a8_exec_opcode(target, ARMV4_5_MCR(14, 0, 0, 0, 5, 0));
  257. }
  258. else if (reg == 16)
  259. {
  260. cortex_a8_exec_opcode(target, ARMV4_5_MRS(0, 0));
  261. cortex_a8_exec_opcode(target, ARMV4_5_MCR(14, 0, 0, 0, 5, 0));
  262. }
  263. /* Read DTRRTX */
  264. do
  265. {
  266. retval = mem_ap_read_atomic_u32(swjdp,
  267. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  268. }
  269. while ((dscr & (1 << DSCR_DTR_TX_FULL)) == 0); /* Wait for DTRRXfull */
  270. retval = mem_ap_read_atomic_u32(swjdp,
  271. armv7a->debug_base + CPUDBG_DTRTX, value);
  272. return retval;
  273. }
  274. int cortex_a8_dap_write_coreregister_u32(target_t *target, uint32_t value, int regnum)
  275. {
  276. int retval = ERROR_OK;
  277. uint8_t Rd = regnum&0xFF;
  278. uint32_t dscr;
  279. /* get pointers to arch-specific information */
  280. armv4_5_common_t *armv4_5 = target->arch_info;
  281. armv7a_common_t *armv7a = armv4_5->arch_info;
  282. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  283. LOG_DEBUG("register %i, value 0x%08" PRIx32, regnum, value);
  284. /* Check that DCCRX is not full */
  285. retval = mem_ap_read_atomic_u32(swjdp,
  286. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  287. if (dscr & (1 << DSCR_DTR_RX_FULL))
  288. {
  289. LOG_ERROR("DSCR_DTR_RX_FULL, dscr 0x%08" PRIx32, dscr);
  290. /* Clear DCCRX with MCR(p14, 0, Rd, c0, c5, 0), opcode 0xEE000E15 */
  291. cortex_a8_exec_opcode(target, ARMV4_5_MRC(14, 0, 0, 0, 5, 0));
  292. }
  293. if (Rd > 16)
  294. return retval;
  295. /* Write to DCCRX */
  296. retval = mem_ap_write_u32(swjdp,
  297. armv7a->debug_base + CPUDBG_DTRRX, value);
  298. if (Rd < 15)
  299. {
  300. /* DCCRX to Rd, MCR p14, 0, Rd, c0, c5, 0, 0xEE000E15 */
  301. cortex_a8_exec_opcode(target, ARMV4_5_MRC(14, 0, Rd, 0, 5, 0));
  302. }
  303. else if (Rd == 15)
  304. {
  305. cortex_a8_exec_opcode(target, ARMV4_5_MRC(14, 0, 0, 0, 5, 0));
  306. cortex_a8_exec_opcode(target, 0xE1A0F000);
  307. }
  308. else if (Rd == 16)
  309. {
  310. cortex_a8_exec_opcode(target, ARMV4_5_MRC(14, 0, 0, 0, 5, 0));
  311. cortex_a8_exec_opcode(target, ARMV4_5_MSR_GP(0, 0xF, 0));
  312. /* Execute a PrefetchFlush instruction through the ITR. */
  313. cortex_a8_exec_opcode(target, ARMV4_5_MCR(15, 0, 0, 7, 5, 4));
  314. }
  315. return retval;
  316. }
  317. /* Write to memory mapped registers directly with no cache or mmu handling */
  318. int cortex_a8_dap_write_memap_register_u32(target_t *target, uint32_t address, uint32_t value)
  319. {
  320. int retval;
  321. /* get pointers to arch-specific information */
  322. armv4_5_common_t *armv4_5 = target->arch_info;
  323. armv7a_common_t *armv7a = armv4_5->arch_info;
  324. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  325. retval = mem_ap_write_atomic_u32(swjdp, address, value);
  326. return retval;
  327. }
  328. /*
  329. * Cortex-A8 Run control
  330. */
  331. int cortex_a8_poll(target_t *target)
  332. {
  333. int retval = ERROR_OK;
  334. uint32_t dscr;
  335. /* get pointers to arch-specific information */
  336. armv4_5_common_t *armv4_5 = target->arch_info;
  337. armv7a_common_t *armv7a = armv4_5->arch_info;
  338. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  339. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  340. enum target_state prev_target_state = target->state;
  341. uint8_t saved_apsel = dap_ap_get_select(swjdp);
  342. dap_ap_select(swjdp, swjdp_debugap);
  343. retval = mem_ap_read_atomic_u32(swjdp,
  344. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  345. if (retval != ERROR_OK)
  346. {
  347. dap_ap_select(swjdp, saved_apsel);
  348. return retval;
  349. }
  350. cortex_a8->cpudbg_dscr = dscr;
  351. if ((dscr & 0x3) == 0x3)
  352. {
  353. if (prev_target_state != TARGET_HALTED)
  354. {
  355. /* We have a halting debug event */
  356. LOG_DEBUG("Target halted");
  357. target->state = TARGET_HALTED;
  358. if ((prev_target_state == TARGET_RUNNING)
  359. || (prev_target_state == TARGET_RESET))
  360. {
  361. retval = cortex_a8_debug_entry(target);
  362. if (retval != ERROR_OK)
  363. return retval;
  364. target_call_event_callbacks(target,
  365. TARGET_EVENT_HALTED);
  366. }
  367. if (prev_target_state == TARGET_DEBUG_RUNNING)
  368. {
  369. LOG_DEBUG(" ");
  370. retval = cortex_a8_debug_entry(target);
  371. if (retval != ERROR_OK)
  372. return retval;
  373. target_call_event_callbacks(target,
  374. TARGET_EVENT_DEBUG_HALTED);
  375. }
  376. }
  377. }
  378. else if ((dscr & 0x3) == 0x2)
  379. {
  380. target->state = TARGET_RUNNING;
  381. }
  382. else
  383. {
  384. LOG_DEBUG("Unknown target state dscr = 0x%08" PRIx32, dscr);
  385. target->state = TARGET_UNKNOWN;
  386. }
  387. dap_ap_select(swjdp, saved_apsel);
  388. return retval;
  389. }
  390. int cortex_a8_halt(target_t *target)
  391. {
  392. int retval = ERROR_OK;
  393. uint32_t dscr;
  394. /* get pointers to arch-specific information */
  395. armv4_5_common_t *armv4_5 = target->arch_info;
  396. armv7a_common_t *armv7a = armv4_5->arch_info;
  397. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  398. uint8_t saved_apsel = dap_ap_get_select(swjdp);
  399. dap_ap_select(swjdp, swjdp_debugap);
  400. /*
  401. * Tell the core to be halted by writing DRCR with 0x1
  402. * and then wait for the core to be halted.
  403. */
  404. retval = mem_ap_write_atomic_u32(swjdp,
  405. armv7a->debug_base + CPUDBG_DRCR, 0x1);
  406. /*
  407. * enter halting debug mode
  408. */
  409. mem_ap_read_atomic_u32(swjdp, armv7a->debug_base + CPUDBG_DSCR, &dscr);
  410. retval = mem_ap_write_atomic_u32(swjdp,
  411. armv7a->debug_base + CPUDBG_DSCR, dscr | (1 << DSCR_HALT_DBG_MODE));
  412. if (retval != ERROR_OK)
  413. goto out;
  414. do {
  415. mem_ap_read_atomic_u32(swjdp,
  416. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  417. } while ((dscr & (1 << DSCR_CORE_HALTED)) == 0);
  418. target->debug_reason = DBG_REASON_DBGRQ;
  419. out:
  420. dap_ap_select(swjdp, saved_apsel);
  421. return retval;
  422. }
  423. int cortex_a8_resume(struct target_s *target, int current,
  424. uint32_t address, int handle_breakpoints, int debug_execution)
  425. {
  426. /* get pointers to arch-specific information */
  427. armv4_5_common_t *armv4_5 = target->arch_info;
  428. armv7a_common_t *armv7a = armv4_5->arch_info;
  429. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  430. // breakpoint_t *breakpoint = NULL;
  431. uint32_t resume_pc, dscr;
  432. uint8_t saved_apsel = dap_ap_get_select(swjdp);
  433. dap_ap_select(swjdp, swjdp_debugap);
  434. if (!debug_execution)
  435. {
  436. target_free_all_working_areas(target);
  437. // cortex_m3_enable_breakpoints(target);
  438. // cortex_m3_enable_watchpoints(target);
  439. }
  440. #if 0
  441. if (debug_execution)
  442. {
  443. /* Disable interrupts */
  444. /* We disable interrupts in the PRIMASK register instead of
  445. * masking with C_MASKINTS,
  446. * This is probably the same issue as Cortex-M3 Errata 377493:
  447. * C_MASKINTS in parallel with disabled interrupts can cause
  448. * local faults to not be taken. */
  449. buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_PRIMASK].value, 0, 32, 1);
  450. armv7m->core_cache->reg_list[ARMV7M_PRIMASK].dirty = 1;
  451. armv7m->core_cache->reg_list[ARMV7M_PRIMASK].valid = 1;
  452. /* Make sure we are in Thumb mode */
  453. buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_xPSR].value, 0, 32,
  454. buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_xPSR].value, 0, 32) | (1 << 24));
  455. armv7m->core_cache->reg_list[ARMV7M_xPSR].dirty = 1;
  456. armv7m->core_cache->reg_list[ARMV7M_xPSR].valid = 1;
  457. }
  458. #endif
  459. /* current = 1: continue on current pc, otherwise continue at <address> */
  460. resume_pc = buf_get_u32(
  461. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  462. armv4_5->core_mode, 15).value,
  463. 0, 32);
  464. if (!current)
  465. resume_pc = address;
  466. /* Make sure that the Armv7 gdb thumb fixups does not
  467. * kill the return address
  468. */
  469. if (armv7a->core_state == ARMV7A_STATE_ARM)
  470. {
  471. resume_pc &= 0xFFFFFFFC;
  472. }
  473. /* When the return address is loaded into PC
  474. * bit 0 must be 1 to stay in Thumb state
  475. */
  476. if (armv7a->core_state == ARMV7A_STATE_THUMB)
  477. {
  478. resume_pc |= 0x1;
  479. }
  480. LOG_DEBUG("resume pc = 0x%08" PRIx32, resume_pc);
  481. buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  482. armv4_5->core_mode, 15).value,
  483. 0, 32, resume_pc);
  484. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  485. armv4_5->core_mode, 15).dirty = 1;
  486. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  487. armv4_5->core_mode, 15).valid = 1;
  488. cortex_a8_restore_context(target);
  489. // arm7_9_restore_context(target); TODO Context is currently NOT Properly restored
  490. #if 0
  491. /* the front-end may request us not to handle breakpoints */
  492. if (handle_breakpoints)
  493. {
  494. /* Single step past breakpoint at current address */
  495. if ((breakpoint = breakpoint_find(target, resume_pc)))
  496. {
  497. LOG_DEBUG("unset breakpoint at 0x%8.8x", breakpoint->address);
  498. cortex_m3_unset_breakpoint(target, breakpoint);
  499. cortex_m3_single_step_core(target);
  500. cortex_m3_set_breakpoint(target, breakpoint);
  501. }
  502. }
  503. #endif
  504. /* Restart core and wait for it to be started */
  505. mem_ap_write_atomic_u32(swjdp, armv7a->debug_base + CPUDBG_DRCR, 0x2);
  506. do {
  507. mem_ap_read_atomic_u32(swjdp,
  508. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  509. } while ((dscr & (1 << DSCR_CORE_RESTARTED)) == 0);
  510. target->debug_reason = DBG_REASON_NOTHALTED;
  511. target->state = TARGET_RUNNING;
  512. /* registers are now invalid */
  513. armv4_5_invalidate_core_regs(target);
  514. if (!debug_execution)
  515. {
  516. target->state = TARGET_RUNNING;
  517. target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
  518. LOG_DEBUG("target resumed at 0x%" PRIx32, resume_pc);
  519. }
  520. else
  521. {
  522. target->state = TARGET_DEBUG_RUNNING;
  523. target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
  524. LOG_DEBUG("target debug resumed at 0x%" PRIx32, resume_pc);
  525. }
  526. dap_ap_select(swjdp, saved_apsel);
  527. return ERROR_OK;
  528. }
  529. int cortex_a8_debug_entry(target_t *target)
  530. {
  531. int i;
  532. uint32_t regfile[16], pc, cpsr, dscr;
  533. int retval = ERROR_OK;
  534. working_area_t *regfile_working_area = NULL;
  535. /* get pointers to arch-specific information */
  536. armv4_5_common_t *armv4_5 = target->arch_info;
  537. armv7a_common_t *armv7a = armv4_5->arch_info;
  538. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  539. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  540. if (armv7a->pre_debug_entry)
  541. armv7a->pre_debug_entry(target);
  542. LOG_DEBUG("dscr = 0x%08" PRIx32, cortex_a8->cpudbg_dscr);
  543. /* Enable the ITR execution once we are in debug mode */
  544. mem_ap_read_atomic_u32(swjdp,
  545. armv7a->debug_base + CPUDBG_DSCR, &dscr);
  546. dscr |= (1 << DSCR_EXT_INT_EN);
  547. retval = mem_ap_write_atomic_u32(swjdp,
  548. armv7a->debug_base + CPUDBG_DSCR, dscr);
  549. /* Examine debug reason */
  550. switch ((cortex_a8->cpudbg_dscr >> 2)&0xF)
  551. {
  552. case 0:
  553. case 4:
  554. target->debug_reason = DBG_REASON_DBGRQ;
  555. break;
  556. case 1:
  557. case 3:
  558. target->debug_reason = DBG_REASON_BREAKPOINT;
  559. break;
  560. case 10:
  561. target->debug_reason = DBG_REASON_WATCHPOINT;
  562. break;
  563. default:
  564. target->debug_reason = DBG_REASON_UNDEFINED;
  565. break;
  566. }
  567. /* Examine target state and mode */
  568. if (cortex_a8->fast_reg_read)
  569. target_alloc_working_area(target, 64, &regfile_working_area);
  570. /* First load register acessible through core debug port*/
  571. if (!regfile_working_area)
  572. {
  573. for (i = 0; i <= 15; i++)
  574. cortex_a8_dap_read_coreregister_u32(target,
  575. &regfile[i], i);
  576. }
  577. else
  578. {
  579. dap_ap_select(swjdp, swjdp_memoryap);
  580. cortex_a8_read_regs_through_mem(target,
  581. regfile_working_area->address, regfile);
  582. dap_ap_select(swjdp, swjdp_memoryap);
  583. target_free_working_area(target, regfile_working_area);
  584. }
  585. cortex_a8_dap_read_coreregister_u32(target, &cpsr, 16);
  586. pc = regfile[15];
  587. dap_ap_select(swjdp, swjdp_debugap);
  588. LOG_DEBUG("cpsr: %8.8" PRIx32, cpsr);
  589. armv4_5->core_mode = cpsr & 0x1F;
  590. armv7a->core_state = (cpsr & 0x20)?ARMV7A_STATE_THUMB:ARMV7A_STATE_ARM;
  591. for (i = 0; i <= ARM_PC; i++)
  592. {
  593. buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  594. armv4_5->core_mode, i).value,
  595. 0, 32, regfile[i]);
  596. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  597. armv4_5->core_mode, i).valid = 1;
  598. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  599. armv4_5->core_mode, i).dirty = 0;
  600. }
  601. buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  602. armv4_5->core_mode, 16).value,
  603. 0, 32, cpsr);
  604. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).valid = 1;
  605. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).dirty = 0;
  606. /* Fixup PC Resume Address */
  607. if (armv7a->core_state == ARMV7A_STATE_THUMB)
  608. {
  609. // T bit set for Thumb or ThumbEE state
  610. regfile[ARM_PC] -= 4;
  611. }
  612. else
  613. {
  614. // ARM state
  615. regfile[ARM_PC] -= 8;
  616. }
  617. buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  618. armv4_5->core_mode, ARM_PC).value,
  619. 0, 32, regfile[ARM_PC]);
  620. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 0)
  621. .dirty = ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  622. armv4_5->core_mode, 0).valid;
  623. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 15)
  624. .dirty = ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  625. armv4_5->core_mode, 15).valid;
  626. #if 0
  627. /* TODO, Move this */
  628. uint32_t cp15_control_register, cp15_cacr, cp15_nacr;
  629. cortex_a8_read_cp(target, &cp15_control_register, 15, 0, 1, 0, 0);
  630. LOG_DEBUG("cp15_control_register = 0x%08x", cp15_control_register);
  631. cortex_a8_read_cp(target, &cp15_cacr, 15, 0, 1, 0, 2);
  632. LOG_DEBUG("cp15 Coprocessor Access Control Register = 0x%08x", cp15_cacr);
  633. cortex_a8_read_cp(target, &cp15_nacr, 15, 0, 1, 1, 2);
  634. LOG_DEBUG("cp15 Nonsecure Access Control Register = 0x%08x", cp15_nacr);
  635. #endif
  636. /* Are we in an exception handler */
  637. // armv4_5->exception_number = 0;
  638. if (armv7a->post_debug_entry)
  639. armv7a->post_debug_entry(target);
  640. return retval;
  641. }
  642. void cortex_a8_post_debug_entry(target_t *target)
  643. {
  644. /* get pointers to arch-specific information */
  645. armv4_5_common_t *armv4_5 = target->arch_info;
  646. armv7a_common_t *armv7a = armv4_5->arch_info;
  647. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  648. // cortex_a8_read_cp(target, &cp15_control_register, 15, 0, 1, 0, 0);
  649. /* examine cp15 control reg */
  650. armv7a->read_cp15(target, 0, 0, 1, 0, &cortex_a8->cp15_control_reg);
  651. jtag_execute_queue();
  652. LOG_DEBUG("cp15_control_reg: %8.8" PRIx32, cortex_a8->cp15_control_reg);
  653. if (armv7a->armv4_5_mmu.armv4_5_cache.ctype == -1)
  654. {
  655. uint32_t cache_type_reg;
  656. /* identify caches */
  657. armv7a->read_cp15(target, 0, 1, 0, 0, &cache_type_reg);
  658. jtag_execute_queue();
  659. /* FIXME the armv4_4 cache info DOES NOT APPLY to Cortex-A8 */
  660. armv4_5_identify_cache(cache_type_reg,
  661. &armv7a->armv4_5_mmu.armv4_5_cache);
  662. }
  663. armv7a->armv4_5_mmu.mmu_enabled =
  664. (cortex_a8->cp15_control_reg & 0x1U) ? 1 : 0;
  665. armv7a->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled =
  666. (cortex_a8->cp15_control_reg & 0x4U) ? 1 : 0;
  667. armv7a->armv4_5_mmu.armv4_5_cache.i_cache_enabled =
  668. (cortex_a8->cp15_control_reg & 0x1000U) ? 1 : 0;
  669. }
  670. int cortex_a8_step(struct target_s *target, int current, uint32_t address,
  671. int handle_breakpoints)
  672. {
  673. /* get pointers to arch-specific information */
  674. armv4_5_common_t *armv4_5 = target->arch_info;
  675. armv7a_common_t *armv7a = armv4_5->arch_info;
  676. breakpoint_t *breakpoint = NULL;
  677. breakpoint_t stepbreakpoint;
  678. int timeout = 100;
  679. if (target->state != TARGET_HALTED)
  680. {
  681. LOG_WARNING("target not halted");
  682. return ERROR_TARGET_NOT_HALTED;
  683. }
  684. /* current = 1: continue on current pc, otherwise continue at <address> */
  685. if (!current)
  686. {
  687. buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  688. armv4_5->core_mode, ARM_PC).value,
  689. 0, 32, address);
  690. }
  691. else
  692. {
  693. address = buf_get_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  694. armv4_5->core_mode, ARM_PC).value,
  695. 0, 32);
  696. }
  697. /* The front-end may request us not to handle breakpoints.
  698. * But since Cortex-A8 uses breakpoint for single step,
  699. * we MUST handle breakpoints.
  700. */
  701. handle_breakpoints = 1;
  702. if (handle_breakpoints) {
  703. breakpoint = breakpoint_find(target,
  704. buf_get_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  705. armv4_5->core_mode, 15).value,
  706. 0, 32));
  707. if (breakpoint)
  708. cortex_a8_unset_breakpoint(target, breakpoint);
  709. }
  710. /* Setup single step breakpoint */
  711. stepbreakpoint.address = address;
  712. stepbreakpoint.length = (armv7a->core_state == ARMV7A_STATE_THUMB) ? 2 : 4;
  713. stepbreakpoint.type = BKPT_HARD;
  714. stepbreakpoint.set = 0;
  715. /* Break on IVA mismatch */
  716. cortex_a8_set_breakpoint(target, &stepbreakpoint, 0x04);
  717. target->debug_reason = DBG_REASON_SINGLESTEP;
  718. cortex_a8_resume(target, 1, address, 0, 0);
  719. while (target->state != TARGET_HALTED)
  720. {
  721. cortex_a8_poll(target);
  722. if (--timeout == 0)
  723. {
  724. LOG_WARNING("timeout waiting for target halt");
  725. break;
  726. }
  727. }
  728. cortex_a8_unset_breakpoint(target, &stepbreakpoint);
  729. if (timeout > 0) target->debug_reason = DBG_REASON_BREAKPOINT;
  730. if (breakpoint)
  731. cortex_a8_set_breakpoint(target, breakpoint, 0);
  732. if (target->state != TARGET_HALTED)
  733. LOG_DEBUG("target stepped");
  734. return ERROR_OK;
  735. }
  736. int cortex_a8_restore_context(target_t *target)
  737. {
  738. int i;
  739. uint32_t value;
  740. /* get pointers to arch-specific information */
  741. armv4_5_common_t *armv4_5 = target->arch_info;
  742. armv7a_common_t *armv7a = armv4_5->arch_info;
  743. LOG_DEBUG(" ");
  744. if (armv7a->pre_restore_context)
  745. armv7a->pre_restore_context(target);
  746. for (i = 15; i >= 0; i--)
  747. {
  748. if (ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  749. armv4_5->core_mode, i).dirty)
  750. {
  751. value = buf_get_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  752. armv4_5->core_mode, i).value,
  753. 0, 32);
  754. /* TODO Check return values */
  755. cortex_a8_dap_write_coreregister_u32(target, value, i);
  756. }
  757. }
  758. if (armv7a->post_restore_context)
  759. armv7a->post_restore_context(target);
  760. return ERROR_OK;
  761. }
  762. /*
  763. * Cortex-A8 Core register functions
  764. */
  765. int cortex_a8_load_core_reg_u32(struct target_s *target, int num,
  766. armv4_5_mode_t mode, uint32_t * value)
  767. {
  768. int retval;
  769. /* get pointers to arch-specific information */
  770. armv4_5_common_t *armv4_5 = target->arch_info;
  771. if ((num <= ARM_CPSR))
  772. {
  773. /* read a normal core register */
  774. retval = cortex_a8_dap_read_coreregister_u32(target, value, num);
  775. if (retval != ERROR_OK)
  776. {
  777. LOG_ERROR("JTAG failure %i", retval);
  778. return ERROR_JTAG_DEVICE_ERROR;
  779. }
  780. LOG_DEBUG("load from core reg %i value 0x%" PRIx32, num, *value);
  781. }
  782. else
  783. {
  784. return ERROR_INVALID_ARGUMENTS;
  785. }
  786. /* Register other than r0 - r14 uses r0 for access */
  787. if (num > 14)
  788. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  789. armv4_5->core_mode, 0).dirty =
  790. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  791. armv4_5->core_mode, 0).valid;
  792. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  793. armv4_5->core_mode, 15).dirty =
  794. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  795. armv4_5->core_mode, 15).valid;
  796. return ERROR_OK;
  797. }
  798. int cortex_a8_store_core_reg_u32(struct target_s *target, int num,
  799. armv4_5_mode_t mode, uint32_t value)
  800. {
  801. int retval;
  802. // uint32_t reg;
  803. /* get pointers to arch-specific information */
  804. armv4_5_common_t *armv4_5 = target->arch_info;
  805. #ifdef ARMV7_GDB_HACKS
  806. /* If the LR register is being modified, make sure it will put us
  807. * in "thumb" mode, or an INVSTATE exception will occur. This is a
  808. * hack to deal with the fact that gdb will sometimes "forge"
  809. * return addresses, and doesn't set the LSB correctly (i.e., when
  810. * printing expressions containing function calls, it sets LR=0.) */
  811. if (num == 14)
  812. value |= 0x01;
  813. #endif
  814. if ((num <= ARM_CPSR))
  815. {
  816. retval = cortex_a8_dap_write_coreregister_u32(target, value, num);
  817. if (retval != ERROR_OK)
  818. {
  819. LOG_ERROR("JTAG failure %i", retval);
  820. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  821. armv4_5->core_mode, num).dirty =
  822. ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  823. armv4_5->core_mode, num).valid;
  824. return ERROR_JTAG_DEVICE_ERROR;
  825. }
  826. LOG_DEBUG("write core reg %i value 0x%" PRIx32, num, value);
  827. }
  828. else
  829. {
  830. return ERROR_INVALID_ARGUMENTS;
  831. }
  832. return ERROR_OK;
  833. }
  834. int cortex_a8_read_core_reg(struct target_s *target, int num,
  835. enum armv4_5_mode mode)
  836. {
  837. uint32_t value;
  838. int retval;
  839. armv4_5_common_t *armv4_5 = target->arch_info;
  840. cortex_a8_dap_read_coreregister_u32(target, &value, num);
  841. if ((retval = jtag_execute_queue()) != ERROR_OK)
  842. {
  843. return retval;
  844. }
  845. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, mode, num).valid = 1;
  846. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, mode, num).dirty = 0;
  847. buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
  848. mode, num).value, 0, 32, value);
  849. return ERROR_OK;
  850. }
  851. int cortex_a8_write_core_reg(struct target_s *target, int num,
  852. enum armv4_5_mode mode, uint32_t value)
  853. {
  854. int retval;
  855. armv4_5_common_t *armv4_5 = target->arch_info;
  856. cortex_a8_dap_write_coreregister_u32(target, value, num);
  857. if ((retval = jtag_execute_queue()) != ERROR_OK)
  858. {
  859. return retval;
  860. }
  861. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, mode, num).valid = 1;
  862. ARMV7A_CORE_REG_MODE(armv4_5->core_cache, mode, num).dirty = 0;
  863. return ERROR_OK;
  864. }
  865. /*
  866. * Cortex-A8 Breakpoint and watchpoint fuctions
  867. */
  868. /* Setup hardware Breakpoint Register Pair */
  869. int cortex_a8_set_breakpoint(struct target_s *target,
  870. breakpoint_t *breakpoint, uint8_t matchmode)
  871. {
  872. int retval;
  873. int brp_i=0;
  874. uint32_t control;
  875. uint8_t byte_addr_select = 0x0F;
  876. /* get pointers to arch-specific information */
  877. armv4_5_common_t *armv4_5 = target->arch_info;
  878. armv7a_common_t *armv7a = armv4_5->arch_info;
  879. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  880. cortex_a8_brp_t * brp_list = cortex_a8->brp_list;
  881. if (breakpoint->set)
  882. {
  883. LOG_WARNING("breakpoint already set");
  884. return ERROR_OK;
  885. }
  886. if (breakpoint->type == BKPT_HARD)
  887. {
  888. while (brp_list[brp_i].used && (brp_i < cortex_a8->brp_num))
  889. brp_i++ ;
  890. if (brp_i >= cortex_a8->brp_num)
  891. {
  892. LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
  893. exit(-1);
  894. }
  895. breakpoint->set = brp_i + 1;
  896. if (breakpoint->length == 2)
  897. {
  898. byte_addr_select = (3 << (breakpoint->address & 0x02));
  899. }
  900. control = ((matchmode & 0x7) << 20)
  901. | (byte_addr_select << 5)
  902. | (3 << 1) | 1;
  903. brp_list[brp_i].used = 1;
  904. brp_list[brp_i].value = (breakpoint->address & 0xFFFFFFFC);
  905. brp_list[brp_i].control = control;
  906. cortex_a8_dap_write_memap_register_u32(target, armv7a->debug_base
  907. + CPUDBG_BVR_BASE + 4 * brp_list[brp_i].BRPn,
  908. brp_list[brp_i].value);
  909. cortex_a8_dap_write_memap_register_u32(target, armv7a->debug_base
  910. + CPUDBG_BCR_BASE + 4 * brp_list[brp_i].BRPn,
  911. brp_list[brp_i].control);
  912. LOG_DEBUG("brp %i control 0x%0" PRIx32 " value 0x%0" PRIx32, brp_i,
  913. brp_list[brp_i].control,
  914. brp_list[brp_i].value);
  915. }
  916. else if (breakpoint->type == BKPT_SOFT)
  917. {
  918. uint8_t code[4];
  919. if (breakpoint->length == 2)
  920. {
  921. buf_set_u32(code, 0, 32, ARMV5_T_BKPT(0x11));
  922. }
  923. else
  924. {
  925. buf_set_u32(code, 0, 32, ARMV5_BKPT(0x11));
  926. }
  927. retval = target->type->read_memory(target,
  928. breakpoint->address & 0xFFFFFFFE,
  929. breakpoint->length, 1,
  930. breakpoint->orig_instr);
  931. if (retval != ERROR_OK)
  932. return retval;
  933. retval = target->type->write_memory(target,
  934. breakpoint->address & 0xFFFFFFFE,
  935. breakpoint->length, 1, code);
  936. if (retval != ERROR_OK)
  937. return retval;
  938. breakpoint->set = 0x11; /* Any nice value but 0 */
  939. }
  940. return ERROR_OK;
  941. }
  942. int cortex_a8_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
  943. {
  944. int retval;
  945. /* get pointers to arch-specific information */
  946. armv4_5_common_t *armv4_5 = target->arch_info;
  947. armv7a_common_t *armv7a = armv4_5->arch_info;
  948. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  949. cortex_a8_brp_t * brp_list = cortex_a8->brp_list;
  950. if (!breakpoint->set)
  951. {
  952. LOG_WARNING("breakpoint not set");
  953. return ERROR_OK;
  954. }
  955. if (breakpoint->type == BKPT_HARD)
  956. {
  957. int brp_i = breakpoint->set - 1;
  958. if ((brp_i < 0) || (brp_i >= cortex_a8->brp_num))
  959. {
  960. LOG_DEBUG("Invalid BRP number in breakpoint");
  961. return ERROR_OK;
  962. }
  963. LOG_DEBUG("rbp %i control 0x%0" PRIx32 " value 0x%0" PRIx32, brp_i,
  964. brp_list[brp_i].control, brp_list[brp_i].value);
  965. brp_list[brp_i].used = 0;
  966. brp_list[brp_i].value = 0;
  967. brp_list[brp_i].control = 0;
  968. cortex_a8_dap_write_memap_register_u32(target, armv7a->debug_base
  969. + CPUDBG_BCR_BASE + 4 * brp_list[brp_i].BRPn,
  970. brp_list[brp_i].control);
  971. cortex_a8_dap_write_memap_register_u32(target, armv7a->debug_base
  972. + CPUDBG_BVR_BASE + 4 * brp_list[brp_i].BRPn,
  973. brp_list[brp_i].value);
  974. }
  975. else
  976. {
  977. /* restore original instruction (kept in target endianness) */
  978. if (breakpoint->length == 4)
  979. {
  980. retval = target->type->write_memory(target,
  981. breakpoint->address & 0xFFFFFFFE,
  982. 4, 1, breakpoint->orig_instr);
  983. if (retval != ERROR_OK)
  984. return retval;
  985. }
  986. else
  987. {
  988. retval = target->type->write_memory(target,
  989. breakpoint->address & 0xFFFFFFFE,
  990. 2, 1, breakpoint->orig_instr);
  991. if (retval != ERROR_OK)
  992. return retval;
  993. }
  994. }
  995. breakpoint->set = 0;
  996. return ERROR_OK;
  997. }
  998. int cortex_a8_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
  999. {
  1000. /* get pointers to arch-specific information */
  1001. armv4_5_common_t *armv4_5 = target->arch_info;
  1002. armv7a_common_t *armv7a = armv4_5->arch_info;
  1003. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  1004. if ((breakpoint->type == BKPT_HARD) && (cortex_a8->brp_num_available < 1))
  1005. {
  1006. LOG_INFO("no hardware breakpoint available");
  1007. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  1008. }
  1009. if (breakpoint->type == BKPT_HARD)
  1010. cortex_a8->brp_num_available--;
  1011. cortex_a8_set_breakpoint(target, breakpoint, 0x00); /* Exact match */
  1012. return ERROR_OK;
  1013. }
  1014. int cortex_a8_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
  1015. {
  1016. /* get pointers to arch-specific information */
  1017. armv4_5_common_t *armv4_5 = target->arch_info;
  1018. armv7a_common_t *armv7a = armv4_5->arch_info;
  1019. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  1020. #if 0
  1021. /* It is perfectly possible to remove brakpoints while the taget is running */
  1022. if (target->state != TARGET_HALTED)
  1023. {
  1024. LOG_WARNING("target not halted");
  1025. return ERROR_TARGET_NOT_HALTED;
  1026. }
  1027. #endif
  1028. if (breakpoint->set)
  1029. {
  1030. cortex_a8_unset_breakpoint(target, breakpoint);
  1031. if (breakpoint->type == BKPT_HARD)
  1032. cortex_a8->brp_num_available++ ;
  1033. }
  1034. return ERROR_OK;
  1035. }
  1036. /*
  1037. * Cortex-A8 Reset fuctions
  1038. */
  1039. int cortex_a8_assert_reset(target_t *target)
  1040. {
  1041. LOG_DEBUG(" ");
  1042. /* registers are now invalid */
  1043. armv4_5_invalidate_core_regs(target);
  1044. target->state = TARGET_RESET;
  1045. return ERROR_OK;
  1046. }
  1047. int cortex_a8_deassert_reset(target_t *target)
  1048. {
  1049. LOG_DEBUG(" ");
  1050. if (target->reset_halt)
  1051. {
  1052. int retval;
  1053. if ((retval = target_halt(target)) != ERROR_OK)
  1054. return retval;
  1055. }
  1056. return ERROR_OK;
  1057. }
  1058. /*
  1059. * Cortex-A8 Memory access
  1060. *
  1061. * This is same Cortex M3 but we must also use the correct
  1062. * ap number for every access.
  1063. */
  1064. int cortex_a8_read_memory(struct target_s *target, uint32_t address,
  1065. uint32_t size, uint32_t count, uint8_t *buffer)
  1066. {
  1067. /* get pointers to arch-specific information */
  1068. armv4_5_common_t *armv4_5 = target->arch_info;
  1069. armv7a_common_t *armv7a = armv4_5->arch_info;
  1070. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  1071. int retval = ERROR_OK;
  1072. /* sanitize arguments */
  1073. if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
  1074. return ERROR_INVALID_ARGUMENTS;
  1075. /* cortex_a8 handles unaligned memory access */
  1076. // ??? dap_ap_select(swjdp, swjdp_memoryap);
  1077. switch (size)
  1078. {
  1079. case 4:
  1080. retval = mem_ap_read_buf_u32(swjdp, buffer, 4 * count, address);
  1081. break;
  1082. case 2:
  1083. retval = mem_ap_read_buf_u16(swjdp, buffer, 2 * count, address);
  1084. break;
  1085. case 1:
  1086. retval = mem_ap_read_buf_u8(swjdp, buffer, count, address);
  1087. break;
  1088. default:
  1089. LOG_ERROR("BUG: we shouldn't get here");
  1090. exit(-1);
  1091. }
  1092. return retval;
  1093. }
  1094. int cortex_a8_write_memory(struct target_s *target, uint32_t address,
  1095. uint32_t size, uint32_t count, uint8_t *buffer)
  1096. {
  1097. /* get pointers to arch-specific information */
  1098. armv4_5_common_t *armv4_5 = target->arch_info;
  1099. armv7a_common_t *armv7a = armv4_5->arch_info;
  1100. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  1101. int retval;
  1102. /* sanitize arguments */
  1103. if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
  1104. return ERROR_INVALID_ARGUMENTS;
  1105. // ??? dap_ap_select(swjdp, swjdp_memoryap);
  1106. switch (size)
  1107. {
  1108. case 4:
  1109. retval = mem_ap_write_buf_u32(swjdp, buffer, 4 * count, address);
  1110. break;
  1111. case 2:
  1112. retval = mem_ap_write_buf_u16(swjdp, buffer, 2 * count, address);
  1113. break;
  1114. case 1:
  1115. retval = mem_ap_write_buf_u8(swjdp, buffer, count, address);
  1116. break;
  1117. default:
  1118. LOG_ERROR("BUG: we shouldn't get here");
  1119. exit(-1);
  1120. }
  1121. if (target->state == TARGET_HALTED)
  1122. {
  1123. /* The Cache handling will NOT work with MMU active, the wrong addresses will be invalidated */
  1124. /* invalidate I-Cache */
  1125. if (armv7a->armv4_5_mmu.armv4_5_cache.i_cache_enabled)
  1126. {
  1127. /* Invalidate ICache single entry with MVA, repeat this for all cache
  1128. lines in the address range, Cortex-A8 has fixed 64 byte line length */
  1129. /* Invalidate Cache single entry with MVA to PoU */
  1130. for (uint32_t cacheline=address; cacheline<address+size*count; cacheline+=64)
  1131. armv7a->write_cp15(target, 0, 1, 7, 5, cacheline); /* I-Cache to PoU */
  1132. }
  1133. /* invalidate D-Cache */
  1134. if (armv7a->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled)
  1135. {
  1136. /* Invalidate Cache single entry with MVA to PoC */
  1137. for (uint32_t cacheline=address; cacheline<address+size*count; cacheline+=64)
  1138. armv7a->write_cp15(target, 0, 1, 7, 6, cacheline); /* U/D cache to PoC */
  1139. }
  1140. }
  1141. return retval;
  1142. }
  1143. int cortex_a8_bulk_write_memory(target_t *target, uint32_t address,
  1144. uint32_t count, uint8_t *buffer)
  1145. {
  1146. return cortex_a8_write_memory(target, address, 4, count, buffer);
  1147. }
  1148. int cortex_a8_dcc_read(swjdp_common_t *swjdp, uint8_t *value, uint8_t *ctrl)
  1149. {
  1150. #if 0
  1151. u16 dcrdr;
  1152. mem_ap_read_buf_u16(swjdp, (uint8_t*)&dcrdr, 1, DCB_DCRDR);
  1153. *ctrl = (uint8_t)dcrdr;
  1154. *value = (uint8_t)(dcrdr >> 8);
  1155. LOG_DEBUG("data 0x%x ctrl 0x%x", *value, *ctrl);
  1156. /* write ack back to software dcc register
  1157. * signify we have read data */
  1158. if (dcrdr & (1 << 0))
  1159. {
  1160. dcrdr = 0;
  1161. mem_ap_write_buf_u16(swjdp, (uint8_t*)&dcrdr, 1, DCB_DCRDR);
  1162. }
  1163. #endif
  1164. return ERROR_OK;
  1165. }
  1166. int cortex_a8_handle_target_request(void *priv)
  1167. {
  1168. target_t *target = priv;
  1169. if (!target->type->examined)
  1170. return ERROR_OK;
  1171. armv4_5_common_t *armv4_5 = target->arch_info;
  1172. armv7a_common_t *armv7a = armv4_5->arch_info;
  1173. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  1174. if (!target->dbg_msg_enabled)
  1175. return ERROR_OK;
  1176. if (target->state == TARGET_RUNNING)
  1177. {
  1178. uint8_t data = 0;
  1179. uint8_t ctrl = 0;
  1180. cortex_a8_dcc_read(swjdp, &data, &ctrl);
  1181. /* check if we have data */
  1182. if (ctrl & (1 << 0))
  1183. {
  1184. uint32_t request;
  1185. /* we assume target is quick enough */
  1186. request = data;
  1187. cortex_a8_dcc_read(swjdp, &data, &ctrl);
  1188. request |= (data << 8);
  1189. cortex_a8_dcc_read(swjdp, &data, &ctrl);
  1190. request |= (data << 16);
  1191. cortex_a8_dcc_read(swjdp, &data, &ctrl);
  1192. request |= (data << 24);
  1193. target_request(target, request);
  1194. }
  1195. }
  1196. return ERROR_OK;
  1197. }
  1198. /*
  1199. * Cortex-A8 target information and configuration
  1200. */
  1201. int cortex_a8_examine(struct target_s *target)
  1202. {
  1203. /* get pointers to arch-specific information */
  1204. armv4_5_common_t *armv4_5 = target->arch_info;
  1205. armv7a_common_t *armv7a = armv4_5->arch_info;
  1206. cortex_a8_common_t *cortex_a8 = armv7a->arch_info;
  1207. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  1208. int i;
  1209. int retval = ERROR_OK;
  1210. uint32_t didr, ctypr, ttypr, cpuid;
  1211. LOG_DEBUG("TODO");
  1212. /* Here we shall insert a proper ROM Table scan */
  1213. armv7a->debug_base = OMAP3530_DEBUG_BASE;
  1214. /* We do one extra read to ensure DAP is configured,
  1215. * we call ahbap_debugport_init(swjdp) instead
  1216. */
  1217. ahbap_debugport_init(swjdp);
  1218. mem_ap_read_atomic_u32(swjdp, armv7a->debug_base + CPUDBG_CPUID, &cpuid);
  1219. if ((retval = mem_ap_read_atomic_u32(swjdp,
  1220. armv7a->debug_base + CPUDBG_CPUID, &cpuid)) != ERROR_OK)
  1221. {
  1222. LOG_DEBUG("Examine failed");
  1223. return retval;
  1224. }
  1225. if ((retval = mem_ap_read_atomic_u32(swjdp,
  1226. armv7a->debug_base + CPUDBG_CTYPR, &ctypr)) != ERROR_OK)
  1227. {
  1228. LOG_DEBUG("Examine failed");
  1229. return retval;
  1230. }
  1231. if ((retval = mem_ap_read_atomic_u32(swjdp,
  1232. armv7a->debug_base + CPUDBG_TTYPR, &ttypr)) != ERROR_OK)
  1233. {
  1234. LOG_DEBUG("Examine failed");
  1235. return retval;
  1236. }
  1237. if ((retval = mem_ap_read_atomic_u32(swjdp,
  1238. armv7a->debug_base + CPUDBG_DIDR, &didr)) != ERROR_OK)
  1239. {
  1240. LOG_DEBUG("Examine failed");
  1241. return retval;
  1242. }
  1243. LOG_DEBUG("cpuid = 0x%08" PRIx32, cpuid);
  1244. LOG_DEBUG("ctypr = 0x%08" PRIx32, ctypr);
  1245. LOG_DEBUG("ttypr = 0x%08" PRIx32, ttypr);
  1246. LOG_DEBUG("didr = 0x%08" PRIx32, didr);
  1247. /* Setup Breakpoint Register Pairs */
  1248. cortex_a8->brp_num = ((didr >> 24) & 0x0F) + 1;
  1249. cortex_a8->brp_num_context = ((didr >> 20) & 0x0F) + 1;
  1250. cortex_a8->brp_num_available = cortex_a8->brp_num;
  1251. cortex_a8->brp_list = calloc(cortex_a8->brp_num, sizeof(cortex_a8_brp_t));
  1252. // cortex_a8->brb_enabled = ????;
  1253. for (i = 0; i < cortex_a8->brp_num; i++)
  1254. {
  1255. cortex_a8->brp_list[i].used = 0;
  1256. if (i < (cortex_a8->brp_num-cortex_a8->brp_num_context))
  1257. cortex_a8->brp_list[i].type = BRP_NORMAL;
  1258. else
  1259. cortex_a8->brp_list[i].type = BRP_CONTEXT;
  1260. cortex_a8->brp_list[i].value = 0;
  1261. cortex_a8->brp_list[i].control = 0;
  1262. cortex_a8->brp_list[i].BRPn = i;
  1263. }
  1264. /* Setup Watchpoint Register Pairs */
  1265. cortex_a8->wrp_num = ((didr >> 28) & 0x0F) + 1;
  1266. cortex_a8->wrp_num_available = cortex_a8->wrp_num;
  1267. cortex_a8->wrp_list = calloc(cortex_a8->wrp_num, sizeof(cortex_a8_wrp_t));
  1268. for (i = 0; i < cortex_a8->wrp_num; i++)
  1269. {
  1270. cortex_a8->wrp_list[i].used = 0;
  1271. cortex_a8->wrp_list[i].type = 0;
  1272. cortex_a8->wrp_list[i].value = 0;
  1273. cortex_a8->wrp_list[i].control = 0;
  1274. cortex_a8->wrp_list[i].WRPn = i;
  1275. }
  1276. LOG_DEBUG("Configured %i hw breakpoint pairs and %i hw watchpoint pairs",
  1277. cortex_a8->brp_num , cortex_a8->wrp_num);
  1278. /* Configure core debug access */
  1279. cortex_a8_init_debug_access(target);
  1280. target->type->examined = 1;
  1281. return retval;
  1282. }
  1283. /*
  1284. * Cortex-A8 target creation and initialization
  1285. */
  1286. void cortex_a8_build_reg_cache(target_t *target)
  1287. {
  1288. reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
  1289. /* get pointers to arch-specific information */
  1290. armv4_5_common_t *armv4_5 = target->arch_info;
  1291. (*cache_p) = armv4_5_build_reg_cache(target, armv4_5);
  1292. armv4_5->core_cache = (*cache_p);
  1293. }
  1294. int cortex_a8_init_target(struct command_context_s *cmd_ctx,
  1295. struct target_s *target)
  1296. {
  1297. cortex_a8_build_reg_cache(target);
  1298. return ERROR_OK;
  1299. }
  1300. int cortex_a8_init_arch_info(target_t *target,
  1301. cortex_a8_common_t *cortex_a8, jtag_tap_t *tap)
  1302. {
  1303. armv4_5_common_t *armv4_5;
  1304. armv7a_common_t *armv7a;
  1305. armv7a = &cortex_a8->armv7a_common;
  1306. armv4_5 = &armv7a->armv4_5_common;
  1307. swjdp_common_t *swjdp = &armv7a->swjdp_info;
  1308. /* Setup cortex_a8_common_t */
  1309. cortex_a8->common_magic = CORTEX_A8_COMMON_MAGIC;
  1310. cortex_a8->arch_info = NULL;
  1311. armv7a->arch_info = cortex_a8;
  1312. armv4_5->arch_info = armv7a;
  1313. armv4_5_init_arch_info(target, armv4_5);
  1314. /* prepare JTAG information for the new target */
  1315. cortex_a8->jtag_info.tap = tap;
  1316. cortex_a8->jtag_info.scann_size = 4;
  1317. LOG_DEBUG(" ");
  1318. swjdp->dp_select_value = -1;
  1319. swjdp->ap_csw_value = -1;
  1320. swjdp->ap_tar_value = -1;
  1321. swjdp->jtag_info = &cortex_a8->jtag_info;
  1322. swjdp->memaccess_tck = 80;
  1323. /* Number of bits for tar autoincrement, impl. dep. at least 10 */
  1324. swjdp->tar_autoincr_block = (1 << 10);
  1325. cortex_a8->fast_reg_read = 0;
  1326. /* register arch-specific functions */
  1327. armv7a->examine_debug_reason = NULL;
  1328. armv7a->pre_debug_entry = NULL;
  1329. armv7a->post_debug_entry = cortex_a8_post_debug_entry;
  1330. armv7a->pre_restore_context = NULL;
  1331. armv7a->post_restore_context = NULL;
  1332. armv7a->armv4_5_mmu.armv4_5_cache.ctype = -1;
  1333. // armv7a->armv4_5_mmu.get_ttb = armv7a_get_ttb;
  1334. armv7a->armv4_5_mmu.read_memory = cortex_a8_read_memory;
  1335. armv7a->armv4_5_mmu.write_memory = cortex_a8_write_memory;
  1336. // armv7a->armv4_5_mmu.disable_mmu_caches = armv7a_disable_mmu_caches;
  1337. // armv7a->armv4_5_mmu.enable_mmu_caches = armv7a_enable_mmu_caches;
  1338. armv7a->armv4_5_mmu.has_tiny_pages = 1;
  1339. armv7a->armv4_5_mmu.mmu_enabled = 0;
  1340. armv7a->read_cp15 = cortex_a8_read_cp15;
  1341. armv7a->write_cp15 = cortex_a8_write_cp15;
  1342. // arm7_9->handle_target_request = cortex_a8_handle_target_request;
  1343. armv4_5->read_core_reg = cortex_a8_read_core_reg;
  1344. armv4_5->write_core_reg = cortex_a8_write_core_reg;
  1345. // armv4_5->full_context = arm7_9_full_context;
  1346. // armv4_5->load_core_reg_u32 = cortex_a8_load_core_reg_u32;
  1347. // armv4_5->store_core_reg_u32 = cortex_a8_store_core_reg_u32;
  1348. // armv4_5->read_core_reg = armv4_5_read_core_reg; /* this is default */
  1349. // armv4_5->write_core_reg = armv4_5_write_core_reg;
  1350. target_register_timer_callback(cortex_a8_handle_target_request, 1, 1, target);
  1351. return ERROR_OK;
  1352. }
  1353. int cortex_a8_target_create(struct target_s *target, Jim_Interp *interp)
  1354. {
  1355. cortex_a8_common_t *cortex_a8 = calloc(1, sizeof(cortex_a8_common_t));
  1356. cortex_a8_init_arch_info(target, cortex_a8, target->tap);
  1357. return ERROR_OK;
  1358. }
  1359. static int cortex_a8_handle_cache_info_command(struct command_context_s *cmd_ctx,
  1360. char *cmd, char **args, int argc)
  1361. {
  1362. target_t *target = get_current_target(cmd_ctx);
  1363. armv4_5_common_t *armv4_5 = target->arch_info;
  1364. armv7a_common_t *armv7a = armv4_5->arch_info;
  1365. return armv4_5_handle_cache_info_command(cmd_ctx,
  1366. &armv7a->armv4_5_mmu.armv4_5_cache);
  1367. }
  1368. static int cortex_a8_handle_dbginit_command(struct command_context_s *cmd_ctx,
  1369. char *cmd, char **args, int argc)
  1370. {
  1371. target_t *target = get_current_target(cmd_ctx);
  1372. cortex_a8_init_debug_access(target);
  1373. return ERROR_OK;
  1374. }
  1375. int cortex_a8_register_commands(struct command_context_s *cmd_ctx)
  1376. {
  1377. command_t *cortex_a8_cmd;
  1378. int retval = ERROR_OK;
  1379. armv4_5_register_commands(cmd_ctx);
  1380. armv7a_register_commands(cmd_ctx);
  1381. cortex_a8_cmd = register_command(cmd_ctx, NULL, "cortex_a8",
  1382. NULL, COMMAND_ANY,
  1383. "cortex_a8 specific commands");
  1384. register_command(cmd_ctx, cortex_a8_cmd, "cache_info",
  1385. cortex_a8_handle_cache_info_command, COMMAND_EXEC,
  1386. "display information about target caches");
  1387. register_command(cmd_ctx, cortex_a8_cmd, "dbginit",
  1388. cortex_a8_handle_dbginit_command, COMMAND_EXEC,
  1389. "Initialize core debug");
  1390. return retval;
  1391. }