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.
 
 
 
 
 
 

2289 lines
54 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2008 digenius technology GmbH. *
  3. * Michael Bruck *
  4. * *
  5. * Copyright (C) 2008,2009 Oyvind Harboe oyvind.harboe@zylin.com *
  6. * *
  7. * Copyright (C) 2008 Georg Acher <acher@in.tum.de> *
  8. * *
  9. * This program is free software; you can redistribute it and/or modify *
  10. * it under the terms of the GNU General Public License as published by *
  11. * the Free Software Foundation; either version 2 of the License, or *
  12. * (at your option) any later version. *
  13. * *
  14. * This program is distributed in the hope that it will be useful, *
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  17. * GNU General Public License for more details. *
  18. * *
  19. * You should have received a copy of the GNU General Public License *
  20. * along with this program; if not, write to the *
  21. * Free Software Foundation, Inc., *
  22. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  23. ***************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. #include "config.h"
  26. #endif
  27. #include "arm11.h"
  28. #include "arm11_dbgtap.h"
  29. #include "armv4_5.h"
  30. #include "arm_simulator.h"
  31. #include "time_support.h"
  32. #include "target_type.h"
  33. #if 0
  34. #define _DEBUG_INSTRUCTION_EXECUTION_
  35. #endif
  36. #if 0
  37. #define FNC_INFO LOG_DEBUG("-")
  38. #else
  39. #define FNC_INFO
  40. #endif
  41. #if 1
  42. #define FNC_INFO_NOTIMPLEMENTED do { LOG_DEBUG("NOT IMPLEMENTED"); /*exit(-1);*/ } while (0)
  43. #else
  44. #define FNC_INFO_NOTIMPLEMENTED
  45. #endif
  46. static bool arm11_config_memwrite_burst = true;
  47. static bool arm11_config_memwrite_error_fatal = true;
  48. static uint32_t arm11_vcr = 0;
  49. static bool arm11_config_step_irq_enable = false;
  50. static bool arm11_config_hardware_step = false;
  51. static int arm11_regs_arch_type = -1;
  52. enum arm11_regtype
  53. {
  54. ARM11_REGISTER_CORE,
  55. ARM11_REGISTER_CPSR,
  56. ARM11_REGISTER_FX,
  57. ARM11_REGISTER_FPS,
  58. ARM11_REGISTER_FIQ,
  59. ARM11_REGISTER_SVC,
  60. ARM11_REGISTER_ABT,
  61. ARM11_REGISTER_IRQ,
  62. ARM11_REGISTER_UND,
  63. ARM11_REGISTER_MON,
  64. ARM11_REGISTER_SPSR_FIQ,
  65. ARM11_REGISTER_SPSR_SVC,
  66. ARM11_REGISTER_SPSR_ABT,
  67. ARM11_REGISTER_SPSR_IRQ,
  68. ARM11_REGISTER_SPSR_UND,
  69. ARM11_REGISTER_SPSR_MON,
  70. /* debug regs */
  71. ARM11_REGISTER_DSCR,
  72. ARM11_REGISTER_WDTR,
  73. ARM11_REGISTER_RDTR,
  74. };
  75. struct arm11_reg_defs
  76. {
  77. char * name;
  78. uint32_t num;
  79. int gdb_num;
  80. enum arm11_regtype type;
  81. };
  82. /* update arm11_regcache_ids when changing this */
  83. static const struct arm11_reg_defs arm11_reg_defs[] =
  84. {
  85. {"r0", 0, 0, ARM11_REGISTER_CORE},
  86. {"r1", 1, 1, ARM11_REGISTER_CORE},
  87. {"r2", 2, 2, ARM11_REGISTER_CORE},
  88. {"r3", 3, 3, ARM11_REGISTER_CORE},
  89. {"r4", 4, 4, ARM11_REGISTER_CORE},
  90. {"r5", 5, 5, ARM11_REGISTER_CORE},
  91. {"r6", 6, 6, ARM11_REGISTER_CORE},
  92. {"r7", 7, 7, ARM11_REGISTER_CORE},
  93. {"r8", 8, 8, ARM11_REGISTER_CORE},
  94. {"r9", 9, 9, ARM11_REGISTER_CORE},
  95. {"r10", 10, 10, ARM11_REGISTER_CORE},
  96. {"r11", 11, 11, ARM11_REGISTER_CORE},
  97. {"r12", 12, 12, ARM11_REGISTER_CORE},
  98. {"sp", 13, 13, ARM11_REGISTER_CORE},
  99. {"lr", 14, 14, ARM11_REGISTER_CORE},
  100. {"pc", 15, 15, ARM11_REGISTER_CORE},
  101. #if ARM11_REGCACHE_FREGS
  102. {"f0", 0, 16, ARM11_REGISTER_FX},
  103. {"f1", 1, 17, ARM11_REGISTER_FX},
  104. {"f2", 2, 18, ARM11_REGISTER_FX},
  105. {"f3", 3, 19, ARM11_REGISTER_FX},
  106. {"f4", 4, 20, ARM11_REGISTER_FX},
  107. {"f5", 5, 21, ARM11_REGISTER_FX},
  108. {"f6", 6, 22, ARM11_REGISTER_FX},
  109. {"f7", 7, 23, ARM11_REGISTER_FX},
  110. {"fps", 0, 24, ARM11_REGISTER_FPS},
  111. #endif
  112. {"cpsr", 0, 25, ARM11_REGISTER_CPSR},
  113. #if ARM11_REGCACHE_MODEREGS
  114. {"r8_fiq", 8, -1, ARM11_REGISTER_FIQ},
  115. {"r9_fiq", 9, -1, ARM11_REGISTER_FIQ},
  116. {"r10_fiq", 10, -1, ARM11_REGISTER_FIQ},
  117. {"r11_fiq", 11, -1, ARM11_REGISTER_FIQ},
  118. {"r12_fiq", 12, -1, ARM11_REGISTER_FIQ},
  119. {"r13_fiq", 13, -1, ARM11_REGISTER_FIQ},
  120. {"r14_fiq", 14, -1, ARM11_REGISTER_FIQ},
  121. {"spsr_fiq", 0, -1, ARM11_REGISTER_SPSR_FIQ},
  122. {"r13_svc", 13, -1, ARM11_REGISTER_SVC},
  123. {"r14_svc", 14, -1, ARM11_REGISTER_SVC},
  124. {"spsr_svc", 0, -1, ARM11_REGISTER_SPSR_SVC},
  125. {"r13_abt", 13, -1, ARM11_REGISTER_ABT},
  126. {"r14_abt", 14, -1, ARM11_REGISTER_ABT},
  127. {"spsr_abt", 0, -1, ARM11_REGISTER_SPSR_ABT},
  128. {"r13_irq", 13, -1, ARM11_REGISTER_IRQ},
  129. {"r14_irq", 14, -1, ARM11_REGISTER_IRQ},
  130. {"spsr_irq", 0, -1, ARM11_REGISTER_SPSR_IRQ},
  131. {"r13_und", 13, -1, ARM11_REGISTER_UND},
  132. {"r14_und", 14, -1, ARM11_REGISTER_UND},
  133. {"spsr_und", 0, -1, ARM11_REGISTER_SPSR_UND},
  134. /* ARM1176 only */
  135. {"r13_mon", 13, -1, ARM11_REGISTER_MON},
  136. {"r14_mon", 14, -1, ARM11_REGISTER_MON},
  137. {"spsr_mon", 0, -1, ARM11_REGISTER_SPSR_MON},
  138. #endif
  139. /* Debug Registers */
  140. {"dscr", 0, -1, ARM11_REGISTER_DSCR},
  141. {"wdtr", 0, -1, ARM11_REGISTER_WDTR},
  142. {"rdtr", 0, -1, ARM11_REGISTER_RDTR},
  143. };
  144. enum arm11_regcache_ids
  145. {
  146. ARM11_RC_R0,
  147. ARM11_RC_RX = ARM11_RC_R0,
  148. ARM11_RC_R1,
  149. ARM11_RC_R2,
  150. ARM11_RC_R3,
  151. ARM11_RC_R4,
  152. ARM11_RC_R5,
  153. ARM11_RC_R6,
  154. ARM11_RC_R7,
  155. ARM11_RC_R8,
  156. ARM11_RC_R9,
  157. ARM11_RC_R10,
  158. ARM11_RC_R11,
  159. ARM11_RC_R12,
  160. ARM11_RC_R13,
  161. ARM11_RC_SP = ARM11_RC_R13,
  162. ARM11_RC_R14,
  163. ARM11_RC_LR = ARM11_RC_R14,
  164. ARM11_RC_R15,
  165. ARM11_RC_PC = ARM11_RC_R15,
  166. #if ARM11_REGCACHE_FREGS
  167. ARM11_RC_F0,
  168. ARM11_RC_FX = ARM11_RC_F0,
  169. ARM11_RC_F1,
  170. ARM11_RC_F2,
  171. ARM11_RC_F3,
  172. ARM11_RC_F4,
  173. ARM11_RC_F5,
  174. ARM11_RC_F6,
  175. ARM11_RC_F7,
  176. ARM11_RC_FPS,
  177. #endif
  178. ARM11_RC_CPSR,
  179. #if ARM11_REGCACHE_MODEREGS
  180. ARM11_RC_R8_FIQ,
  181. ARM11_RC_R9_FIQ,
  182. ARM11_RC_R10_FIQ,
  183. ARM11_RC_R11_FIQ,
  184. ARM11_RC_R12_FIQ,
  185. ARM11_RC_R13_FIQ,
  186. ARM11_RC_R14_FIQ,
  187. ARM11_RC_SPSR_FIQ,
  188. ARM11_RC_R13_SVC,
  189. ARM11_RC_R14_SVC,
  190. ARM11_RC_SPSR_SVC,
  191. ARM11_RC_R13_ABT,
  192. ARM11_RC_R14_ABT,
  193. ARM11_RC_SPSR_ABT,
  194. ARM11_RC_R13_IRQ,
  195. ARM11_RC_R14_IRQ,
  196. ARM11_RC_SPSR_IRQ,
  197. ARM11_RC_R13_UND,
  198. ARM11_RC_R14_UND,
  199. ARM11_RC_SPSR_UND,
  200. ARM11_RC_R13_MON,
  201. ARM11_RC_R14_MON,
  202. ARM11_RC_SPSR_MON,
  203. #endif
  204. ARM11_RC_DSCR,
  205. ARM11_RC_WDTR,
  206. ARM11_RC_RDTR,
  207. ARM11_RC_MAX,
  208. };
  209. #define ARM11_GDB_REGISTER_COUNT 26
  210. static uint8_t arm11_gdb_dummy_fp_value[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  211. static reg_t arm11_gdb_dummy_fp_reg =
  212. {
  213. "GDB dummy floating-point register", arm11_gdb_dummy_fp_value, 0, 1, 96, NULL, 0, NULL, 0
  214. };
  215. static uint8_t arm11_gdb_dummy_fps_value[] = {0, 0, 0, 0};
  216. static reg_t arm11_gdb_dummy_fps_reg =
  217. {
  218. "GDB dummy floating-point status register", arm11_gdb_dummy_fps_value, 0, 1, 32, NULL, 0, NULL, 0
  219. };
  220. static int arm11_on_enter_debug_state(struct arm11_common *arm11);
  221. static int arm11_step(struct target_s *target, int current,
  222. uint32_t address, int handle_breakpoints);
  223. /* helpers */
  224. static int arm11_build_reg_cache(target_t *target);
  225. static int arm11_set_reg(reg_t *reg, uint8_t *buf);
  226. static int arm11_get_reg(reg_t *reg);
  227. static void arm11_record_register_history(struct arm11_common * arm11);
  228. static void arm11_dump_reg_changes(struct arm11_common * arm11);
  229. /** Check and if necessary take control of the system
  230. *
  231. * \param arm11 Target state variable.
  232. * \param dscr If the current DSCR content is
  233. * available a pointer to a word holding the
  234. * DSCR can be passed. Otherwise use NULL.
  235. */
  236. static int arm11_check_init(struct arm11_common *arm11, uint32_t *dscr)
  237. {
  238. FNC_INFO;
  239. uint32_t dscr_local_tmp_copy;
  240. if (!dscr)
  241. {
  242. dscr = &dscr_local_tmp_copy;
  243. CHECK_RETVAL(arm11_read_DSCR(arm11, dscr));
  244. }
  245. if (!(*dscr & ARM11_DSCR_MODE_SELECT))
  246. {
  247. LOG_DEBUG("Bringing target into debug mode");
  248. *dscr |= ARM11_DSCR_MODE_SELECT; /* Halt debug-mode */
  249. arm11_write_DSCR(arm11, *dscr);
  250. /* add further reset initialization here */
  251. arm11->simulate_reset_on_next_halt = true;
  252. if (*dscr & ARM11_DSCR_CORE_HALTED)
  253. {
  254. /** \todo TODO: this needs further scrutiny because
  255. * arm11_on_enter_debug_state() never gets properly called.
  256. * As a result we don't read the actual register states from
  257. * the target.
  258. */
  259. arm11->target->state = TARGET_HALTED;
  260. arm11->target->debug_reason = arm11_get_DSCR_debug_reason(*dscr);
  261. }
  262. else
  263. {
  264. arm11->target->state = TARGET_RUNNING;
  265. arm11->target->debug_reason = DBG_REASON_NOTHALTED;
  266. }
  267. arm11_sc7_clear_vbw(arm11);
  268. }
  269. return ERROR_OK;
  270. }
  271. #define R(x) \
  272. (arm11->reg_values[ARM11_RC_##x])
  273. /** Save processor state.
  274. *
  275. * This is called when the HALT instruction has succeeded
  276. * or on other occasions that stop the processor.
  277. *
  278. */
  279. static int arm11_on_enter_debug_state(struct arm11_common *arm11)
  280. {
  281. int retval;
  282. FNC_INFO;
  283. for (size_t i = 0; i < asizeof(arm11->reg_values); i++)
  284. {
  285. arm11->reg_list[i].valid = 1;
  286. arm11->reg_list[i].dirty = 0;
  287. }
  288. /* Save DSCR */
  289. CHECK_RETVAL(arm11_read_DSCR(arm11, &R(DSCR)));
  290. /* Save wDTR */
  291. if (R(DSCR) & ARM11_DSCR_WDTR_FULL)
  292. {
  293. arm11_add_debug_SCAN_N(arm11, 0x05, ARM11_TAP_DEFAULT);
  294. arm11_add_IR(arm11, ARM11_INTEST, ARM11_TAP_DEFAULT);
  295. struct scan_field chain5_fields[3];
  296. arm11_setup_field(arm11, 32, NULL, &R(WDTR), chain5_fields + 0);
  297. arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 1);
  298. arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 2);
  299. arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_DRPAUSE);
  300. }
  301. else
  302. {
  303. arm11->reg_list[ARM11_RC_WDTR].valid = 0;
  304. }
  305. /* DSCR: set ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE */
  306. /* ARM1176 spec says this is needed only for wDTR/rDTR's "ITR mode", but not to issue ITRs
  307. ARM1136 seems to require this to issue ITR's as well */
  308. uint32_t new_dscr = R(DSCR) | ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE;
  309. /* this executes JTAG queue: */
  310. arm11_write_DSCR(arm11, new_dscr);
  311. /* From the spec:
  312. Before executing any instruction in debug state you have to drain the write buffer.
  313. This ensures that no imprecise Data Aborts can return at a later point:*/
  314. /** \todo TODO: Test drain write buffer. */
  315. #if 0
  316. while (1)
  317. {
  318. /* MRC p14,0,R0,c5,c10,0 */
  319. // arm11_run_instr_no_data1(arm11, /*0xee150e1a*/0xe320f000);
  320. /* mcr 15, 0, r0, cr7, cr10, {4} */
  321. arm11_run_instr_no_data1(arm11, 0xee070f9a);
  322. uint32_t dscr = arm11_read_DSCR(arm11);
  323. LOG_DEBUG("DRAIN, DSCR %08x", dscr);
  324. if (dscr & ARM11_DSCR_STICKY_IMPRECISE_DATA_ABORT)
  325. {
  326. arm11_run_instr_no_data1(arm11, 0xe320f000);
  327. dscr = arm11_read_DSCR(arm11);
  328. LOG_DEBUG("DRAIN, DSCR %08x (DONE)", dscr);
  329. break;
  330. }
  331. }
  332. #endif
  333. retval = arm11_run_instr_data_prepare(arm11);
  334. if (retval != ERROR_OK)
  335. return retval;
  336. /* save r0 - r14 */
  337. /** \todo TODO: handle other mode registers */
  338. for (size_t i = 0; i < 15; i++)
  339. {
  340. /* MCR p14,0,R?,c0,c5,0 */
  341. retval = arm11_run_instr_data_from_core(arm11, 0xEE000E15 | (i << 12), &R(RX + i), 1);
  342. if (retval != ERROR_OK)
  343. return retval;
  344. }
  345. /* save rDTR */
  346. /* check rDTRfull in DSCR */
  347. if (R(DSCR) & ARM11_DSCR_RDTR_FULL)
  348. {
  349. /* MRC p14,0,R0,c0,c5,0 (move rDTR -> r0 (-> wDTR -> local var)) */
  350. retval = arm11_run_instr_data_from_core_via_r0(arm11, 0xEE100E15, &R(RDTR));
  351. if (retval != ERROR_OK)
  352. return retval;
  353. }
  354. else
  355. {
  356. arm11->reg_list[ARM11_RC_RDTR].valid = 0;
  357. }
  358. /* save CPSR */
  359. /* MRS r0,CPSR (move CPSR -> r0 (-> wDTR -> local var)) */
  360. retval = arm11_run_instr_data_from_core_via_r0(arm11, 0xE10F0000, &R(CPSR));
  361. if (retval != ERROR_OK)
  362. return retval;
  363. /* save PC */
  364. /* MOV R0,PC (move PC -> r0 (-> wDTR -> local var)) */
  365. retval = arm11_run_instr_data_from_core_via_r0(arm11, 0xE1A0000F, &R(PC));
  366. if (retval != ERROR_OK)
  367. return retval;
  368. /* adjust PC depending on ARM state */
  369. if (R(CPSR) & ARM11_CPSR_J) /* Java state */
  370. {
  371. arm11->reg_values[ARM11_RC_PC] -= 0;
  372. }
  373. else if (R(CPSR) & ARM11_CPSR_T) /* Thumb state */
  374. {
  375. arm11->reg_values[ARM11_RC_PC] -= 4;
  376. }
  377. else /* ARM state */
  378. {
  379. arm11->reg_values[ARM11_RC_PC] -= 8;
  380. }
  381. if (arm11->simulate_reset_on_next_halt)
  382. {
  383. arm11->simulate_reset_on_next_halt = false;
  384. LOG_DEBUG("Reset c1 Control Register");
  385. /* Write 0 (reset value) to Control register 0 to disable MMU/Cache etc. */
  386. /* MCR p15,0,R0,c1,c0,0 */
  387. retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, 0);
  388. if (retval != ERROR_OK)
  389. return retval;
  390. }
  391. retval = arm11_run_instr_data_finish(arm11);
  392. if (retval != ERROR_OK)
  393. return retval;
  394. arm11_dump_reg_changes(arm11);
  395. return ERROR_OK;
  396. }
  397. void arm11_dump_reg_changes(struct arm11_common * arm11)
  398. {
  399. if (!(debug_level >= LOG_LVL_DEBUG))
  400. {
  401. return;
  402. }
  403. for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
  404. {
  405. if (!arm11->reg_list[i].valid)
  406. {
  407. if (arm11->reg_history[i].valid)
  408. LOG_DEBUG("%8s INVALID (%08" PRIx32 ")", arm11_reg_defs[i].name, arm11->reg_history[i].value);
  409. }
  410. else
  411. {
  412. if (arm11->reg_history[i].valid)
  413. {
  414. if (arm11->reg_history[i].value != arm11->reg_values[i])
  415. LOG_DEBUG("%8s %08" PRIx32 " (%08" PRIx32 ")", arm11_reg_defs[i].name, arm11->reg_values[i], arm11->reg_history[i].value);
  416. }
  417. else
  418. {
  419. LOG_DEBUG("%8s %08" PRIx32 " (INVALID)", arm11_reg_defs[i].name, arm11->reg_values[i]);
  420. }
  421. }
  422. }
  423. }
  424. /** Restore processor state
  425. *
  426. * This is called in preparation for the RESTART function.
  427. *
  428. */
  429. static int arm11_leave_debug_state(struct arm11_common *arm11)
  430. {
  431. FNC_INFO;
  432. int retval;
  433. retval = arm11_run_instr_data_prepare(arm11);
  434. if (retval != ERROR_OK)
  435. return retval;
  436. /** \todo TODO: handle other mode registers */
  437. /* restore R1 - R14 */
  438. for (size_t i = 1; i < 15; i++)
  439. {
  440. if (!arm11->reg_list[ARM11_RC_RX + i].dirty)
  441. continue;
  442. /* MRC p14,0,r?,c0,c5,0 */
  443. arm11_run_instr_data_to_core1(arm11, 0xee100e15 | (i << 12), R(RX + i));
  444. // LOG_DEBUG("RESTORE R" ZU " %08x", i, R(RX + i));
  445. }
  446. retval = arm11_run_instr_data_finish(arm11);
  447. if (retval != ERROR_OK)
  448. return retval;
  449. /* spec says clear wDTR and rDTR; we assume they are clear as
  450. otherwise our programming would be sloppy */
  451. {
  452. uint32_t DSCR;
  453. CHECK_RETVAL(arm11_read_DSCR(arm11, &DSCR));
  454. if (DSCR & (ARM11_DSCR_RDTR_FULL | ARM11_DSCR_WDTR_FULL))
  455. {
  456. /*
  457. The wDTR/rDTR two registers that are used to send/receive data to/from
  458. the core in tandem with corresponding instruction codes that are
  459. written into the core. The RDTR FULL/WDTR FULL flag indicates that the
  460. registers hold data that was written by one side (CPU or JTAG) and not
  461. read out by the other side.
  462. */
  463. LOG_ERROR("wDTR/rDTR inconsistent (DSCR %08" PRIx32 ")", DSCR);
  464. return ERROR_FAIL;
  465. }
  466. }
  467. retval = arm11_run_instr_data_prepare(arm11);
  468. if (retval != ERROR_OK)
  469. return retval;
  470. /* restore original wDTR */
  471. if ((R(DSCR) & ARM11_DSCR_WDTR_FULL) || arm11->reg_list[ARM11_RC_WDTR].dirty)
  472. {
  473. /* MCR p14,0,R0,c0,c5,0 */
  474. retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee000e15, R(WDTR));
  475. if (retval != ERROR_OK)
  476. return retval;
  477. }
  478. /* restore CPSR */
  479. /* MSR CPSR,R0*/
  480. retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xe129f000, R(CPSR));
  481. if (retval != ERROR_OK)
  482. return retval;
  483. /* restore PC */
  484. /* MOV PC,R0 */
  485. retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xe1a0f000, R(PC));
  486. if (retval != ERROR_OK)
  487. return retval;
  488. /* restore R0 */
  489. /* MRC p14,0,r0,c0,c5,0 */
  490. arm11_run_instr_data_to_core1(arm11, 0xee100e15, R(R0));
  491. retval = arm11_run_instr_data_finish(arm11);
  492. if (retval != ERROR_OK)
  493. return retval;
  494. /* restore DSCR */
  495. arm11_write_DSCR(arm11, R(DSCR));
  496. /* restore rDTR */
  497. if (R(DSCR) & ARM11_DSCR_RDTR_FULL || arm11->reg_list[ARM11_RC_RDTR].dirty)
  498. {
  499. arm11_add_debug_SCAN_N(arm11, 0x05, ARM11_TAP_DEFAULT);
  500. arm11_add_IR(arm11, ARM11_EXTEST, ARM11_TAP_DEFAULT);
  501. struct scan_field chain5_fields[3];
  502. uint8_t Ready = 0; /* ignored */
  503. uint8_t Valid = 0; /* ignored */
  504. arm11_setup_field(arm11, 32, &R(RDTR), NULL, chain5_fields + 0);
  505. arm11_setup_field(arm11, 1, &Ready, NULL, chain5_fields + 1);
  506. arm11_setup_field(arm11, 1, &Valid, NULL, chain5_fields + 2);
  507. arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_DRPAUSE);
  508. }
  509. arm11_record_register_history(arm11);
  510. return ERROR_OK;
  511. }
  512. static void arm11_record_register_history(struct arm11_common *arm11)
  513. {
  514. for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
  515. {
  516. arm11->reg_history[i].value = arm11->reg_values[i];
  517. arm11->reg_history[i].valid = arm11->reg_list[i].valid;
  518. arm11->reg_list[i].valid = 0;
  519. arm11->reg_list[i].dirty = 0;
  520. }
  521. }
  522. /* poll current target status */
  523. static int arm11_poll(struct target_s *target)
  524. {
  525. FNC_INFO;
  526. int retval;
  527. struct arm11_common * arm11 = target->arch_info;
  528. uint32_t dscr;
  529. CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
  530. LOG_DEBUG("DSCR %08" PRIx32 "", dscr);
  531. CHECK_RETVAL(arm11_check_init(arm11, &dscr));
  532. if (dscr & ARM11_DSCR_CORE_HALTED)
  533. {
  534. if (target->state != TARGET_HALTED)
  535. {
  536. enum target_state old_state = target->state;
  537. LOG_DEBUG("enter TARGET_HALTED");
  538. target->state = TARGET_HALTED;
  539. target->debug_reason = arm11_get_DSCR_debug_reason(dscr);
  540. retval = arm11_on_enter_debug_state(arm11);
  541. if (retval != ERROR_OK)
  542. return retval;
  543. target_call_event_callbacks(target,
  544. old_state == TARGET_DEBUG_RUNNING ? TARGET_EVENT_DEBUG_HALTED : TARGET_EVENT_HALTED);
  545. }
  546. }
  547. else
  548. {
  549. if (target->state != TARGET_RUNNING && target->state != TARGET_DEBUG_RUNNING)
  550. {
  551. LOG_DEBUG("enter TARGET_RUNNING");
  552. target->state = TARGET_RUNNING;
  553. target->debug_reason = DBG_REASON_NOTHALTED;
  554. }
  555. }
  556. return ERROR_OK;
  557. }
  558. /* architecture specific status reply */
  559. static int arm11_arch_state(struct target_s *target)
  560. {
  561. struct arm11_common * arm11 = target->arch_info;
  562. LOG_USER("target halted due to %s\ncpsr: 0x%8.8" PRIx32 " pc: 0x%8.8" PRIx32 "",
  563. Jim_Nvp_value2name_simple(nvp_target_debug_reason, target->debug_reason)->name,
  564. R(CPSR),
  565. R(PC));
  566. return ERROR_OK;
  567. }
  568. /* target request support */
  569. static int arm11_target_request_data(struct target_s *target,
  570. uint32_t size, uint8_t *buffer)
  571. {
  572. FNC_INFO_NOTIMPLEMENTED;
  573. return ERROR_OK;
  574. }
  575. /* target execution control */
  576. static int arm11_halt(struct target_s *target)
  577. {
  578. FNC_INFO;
  579. struct arm11_common * arm11 = target->arch_info;
  580. LOG_DEBUG("target->state: %s",
  581. target_state_name(target));
  582. if (target->state == TARGET_UNKNOWN)
  583. {
  584. arm11->simulate_reset_on_next_halt = true;
  585. }
  586. if (target->state == TARGET_HALTED)
  587. {
  588. LOG_DEBUG("target was already halted");
  589. return ERROR_OK;
  590. }
  591. arm11_add_IR(arm11, ARM11_HALT, TAP_IDLE);
  592. CHECK_RETVAL(jtag_execute_queue());
  593. uint32_t dscr;
  594. int i = 0;
  595. while (1)
  596. {
  597. CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
  598. if (dscr & ARM11_DSCR_CORE_HALTED)
  599. break;
  600. long long then = 0;
  601. if (i == 1000)
  602. {
  603. then = timeval_ms();
  604. }
  605. if (i >= 1000)
  606. {
  607. if ((timeval_ms()-then) > 1000)
  608. {
  609. LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
  610. return ERROR_FAIL;
  611. }
  612. }
  613. i++;
  614. }
  615. arm11_on_enter_debug_state(arm11);
  616. enum target_state old_state = target->state;
  617. target->state = TARGET_HALTED;
  618. target->debug_reason = arm11_get_DSCR_debug_reason(dscr);
  619. CHECK_RETVAL(
  620. target_call_event_callbacks(target,
  621. old_state == TARGET_DEBUG_RUNNING ? TARGET_EVENT_DEBUG_HALTED : TARGET_EVENT_HALTED));
  622. return ERROR_OK;
  623. }
  624. static int arm11_resume(struct target_s *target, int current,
  625. uint32_t address, int handle_breakpoints, int debug_execution)
  626. {
  627. FNC_INFO;
  628. // LOG_DEBUG("current %d address %08x handle_breakpoints %d debug_execution %d",
  629. // current, address, handle_breakpoints, debug_execution);
  630. struct arm11_common * arm11 = target->arch_info;
  631. LOG_DEBUG("target->state: %s",
  632. target_state_name(target));
  633. if (target->state != TARGET_HALTED)
  634. {
  635. LOG_ERROR("Target not halted");
  636. return ERROR_TARGET_NOT_HALTED;
  637. }
  638. if (!current)
  639. R(PC) = address;
  640. LOG_DEBUG("RESUME PC %08" PRIx32 "%s", R(PC), !current ? "!" : "");
  641. /* clear breakpoints/watchpoints and VCR*/
  642. arm11_sc7_clear_vbw(arm11);
  643. /* Set up breakpoints */
  644. if (!debug_execution)
  645. {
  646. /* check if one matches PC and step over it if necessary */
  647. struct breakpoint * bp;
  648. for (bp = target->breakpoints; bp; bp = bp->next)
  649. {
  650. if (bp->address == R(PC))
  651. {
  652. LOG_DEBUG("must step over %08" PRIx32 "", bp->address);
  653. arm11_step(target, 1, 0, 0);
  654. break;
  655. }
  656. }
  657. /* set all breakpoints */
  658. size_t brp_num = 0;
  659. for (bp = target->breakpoints; bp; bp = bp->next)
  660. {
  661. struct arm11_sc7_action brp[2];
  662. brp[0].write = 1;
  663. brp[0].address = ARM11_SC7_BVR0 + brp_num;
  664. brp[0].value = bp->address;
  665. brp[1].write = 1;
  666. brp[1].address = ARM11_SC7_BCR0 + brp_num;
  667. brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
  668. arm11_sc7_run(arm11, brp, asizeof(brp));
  669. LOG_DEBUG("Add BP " ZU " at %08" PRIx32 "", brp_num, bp->address);
  670. brp_num++;
  671. }
  672. arm11_sc7_set_vcr(arm11, arm11_vcr);
  673. }
  674. arm11_leave_debug_state(arm11);
  675. arm11_add_IR(arm11, ARM11_RESTART, TAP_IDLE);
  676. CHECK_RETVAL(jtag_execute_queue());
  677. int i = 0;
  678. while (1)
  679. {
  680. uint32_t dscr;
  681. CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
  682. LOG_DEBUG("DSCR %08" PRIx32 "", dscr);
  683. if (dscr & ARM11_DSCR_CORE_RESTARTED)
  684. break;
  685. long long then = 0;
  686. if (i == 1000)
  687. {
  688. then = timeval_ms();
  689. }
  690. if (i >= 1000)
  691. {
  692. if ((timeval_ms()-then) > 1000)
  693. {
  694. LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
  695. return ERROR_FAIL;
  696. }
  697. }
  698. i++;
  699. }
  700. if (!debug_execution)
  701. {
  702. target->state = TARGET_RUNNING;
  703. target->debug_reason = DBG_REASON_NOTHALTED;
  704. CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_RESUMED));
  705. }
  706. else
  707. {
  708. target->state = TARGET_DEBUG_RUNNING;
  709. target->debug_reason = DBG_REASON_NOTHALTED;
  710. CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_RESUMED));
  711. }
  712. return ERROR_OK;
  713. }
  714. static int armv4_5_to_arm11(int reg)
  715. {
  716. if (reg < 16)
  717. return reg;
  718. switch (reg)
  719. {
  720. case ARMV4_5_CPSR:
  721. return ARM11_RC_CPSR;
  722. case 16:
  723. /* FIX!!! handle thumb better! */
  724. return ARM11_RC_CPSR;
  725. default:
  726. LOG_ERROR("BUG: register translation from armv4_5 to arm11 not supported %d", reg);
  727. exit(-1);
  728. }
  729. }
  730. static uint32_t arm11_sim_get_reg(struct arm_sim_interface *sim, int reg)
  731. {
  732. struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
  733. reg=armv4_5_to_arm11(reg);
  734. return buf_get_u32(arm11->reg_list[reg].value, 0, 32);
  735. }
  736. static void arm11_sim_set_reg(struct arm_sim_interface *sim,
  737. int reg, uint32_t value)
  738. {
  739. struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
  740. reg=armv4_5_to_arm11(reg);
  741. buf_set_u32(arm11->reg_list[reg].value, 0, 32, value);
  742. }
  743. static uint32_t arm11_sim_get_cpsr(struct arm_sim_interface *sim,
  744. int pos, int bits)
  745. {
  746. struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
  747. return buf_get_u32(arm11->reg_list[ARM11_RC_CPSR].value, pos, bits);
  748. }
  749. static enum armv4_5_state arm11_sim_get_state(struct arm_sim_interface *sim)
  750. {
  751. // struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
  752. /* FIX!!!! we should implement thumb for arm11 */
  753. return ARMV4_5_STATE_ARM;
  754. }
  755. static void arm11_sim_set_state(struct arm_sim_interface *sim,
  756. enum armv4_5_state mode)
  757. {
  758. // struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
  759. /* FIX!!!! we should implement thumb for arm11 */
  760. LOG_ERROR("Not implemetned!");
  761. }
  762. static enum armv4_5_mode arm11_sim_get_mode(struct arm_sim_interface *sim)
  763. {
  764. //struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
  765. /* FIX!!!! we should implement something that returns the current mode here!!! */
  766. return ARMV4_5_MODE_USR;
  767. }
  768. static int arm11_simulate_step(target_t *target, uint32_t *dry_run_pc)
  769. {
  770. struct arm_sim_interface sim;
  771. sim.user_data=target->arch_info;
  772. sim.get_reg=&arm11_sim_get_reg;
  773. sim.set_reg=&arm11_sim_set_reg;
  774. sim.get_reg_mode=&arm11_sim_get_reg;
  775. sim.set_reg_mode=&arm11_sim_set_reg;
  776. sim.get_cpsr=&arm11_sim_get_cpsr;
  777. sim.get_mode=&arm11_sim_get_mode;
  778. sim.get_state=&arm11_sim_get_state;
  779. sim.set_state=&arm11_sim_set_state;
  780. return arm_simulate_step_core(target, dry_run_pc, &sim);
  781. }
  782. static int arm11_step(struct target_s *target, int current,
  783. uint32_t address, int handle_breakpoints)
  784. {
  785. FNC_INFO;
  786. LOG_DEBUG("target->state: %s",
  787. target_state_name(target));
  788. if (target->state != TARGET_HALTED)
  789. {
  790. LOG_WARNING("target was not halted");
  791. return ERROR_TARGET_NOT_HALTED;
  792. }
  793. struct arm11_common * arm11 = target->arch_info;
  794. if (!current)
  795. R(PC) = address;
  796. LOG_DEBUG("STEP PC %08" PRIx32 "%s", R(PC), !current ? "!" : "");
  797. /** \todo TODO: Thumb not supported here */
  798. uint32_t next_instruction;
  799. CHECK_RETVAL(arm11_read_memory_word(arm11, R(PC), &next_instruction));
  800. /* skip over BKPT */
  801. if ((next_instruction & 0xFFF00070) == 0xe1200070)
  802. {
  803. R(PC) += 4;
  804. arm11->reg_list[ARM11_RC_PC].valid = 1;
  805. arm11->reg_list[ARM11_RC_PC].dirty = 0;
  806. LOG_DEBUG("Skipping BKPT");
  807. }
  808. /* skip over Wait for interrupt / Standby */
  809. /* mcr 15, 0, r?, cr7, cr0, {4} */
  810. else if ((next_instruction & 0xFFFF0FFF) == 0xee070f90)
  811. {
  812. R(PC) += 4;
  813. arm11->reg_list[ARM11_RC_PC].valid = 1;
  814. arm11->reg_list[ARM11_RC_PC].dirty = 0;
  815. LOG_DEBUG("Skipping WFI");
  816. }
  817. /* ignore B to self */
  818. else if ((next_instruction & 0xFEFFFFFF) == 0xeafffffe)
  819. {
  820. LOG_DEBUG("Not stepping jump to self");
  821. }
  822. else
  823. {
  824. /** \todo TODO: check if break-/watchpoints make any sense at all in combination
  825. * with this. */
  826. /** \todo TODO: check if disabling IRQs might be a good idea here. Alternatively
  827. * the VCR might be something worth looking into. */
  828. /* Set up breakpoint for stepping */
  829. struct arm11_sc7_action brp[2];
  830. brp[0].write = 1;
  831. brp[0].address = ARM11_SC7_BVR0;
  832. brp[1].write = 1;
  833. brp[1].address = ARM11_SC7_BCR0;
  834. if (arm11_config_hardware_step)
  835. {
  836. /* hardware single stepping be used if possible or is it better to
  837. * always use the same code path? Hardware single stepping is not supported
  838. * on all hardware
  839. */
  840. brp[0].value = R(PC);
  841. brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (2 << 21);
  842. } else
  843. {
  844. /* sets a breakpoint on the next PC(calculated by simulation),
  845. */
  846. uint32_t next_pc;
  847. int retval;
  848. retval = arm11_simulate_step(target, &next_pc);
  849. if (retval != ERROR_OK)
  850. return retval;
  851. brp[0].value = next_pc;
  852. brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
  853. }
  854. CHECK_RETVAL(arm11_sc7_run(arm11, brp, asizeof(brp)));
  855. /* resume */
  856. if (arm11_config_step_irq_enable)
  857. R(DSCR) &= ~ARM11_DSCR_INTERRUPTS_DISABLE; /* should be redundant */
  858. else
  859. R(DSCR) |= ARM11_DSCR_INTERRUPTS_DISABLE;
  860. CHECK_RETVAL(arm11_leave_debug_state(arm11));
  861. arm11_add_IR(arm11, ARM11_RESTART, TAP_IDLE);
  862. CHECK_RETVAL(jtag_execute_queue());
  863. /* wait for halt */
  864. int i = 0;
  865. while (1)
  866. {
  867. uint32_t dscr;
  868. CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
  869. LOG_DEBUG("DSCR %08" PRIx32 "e", dscr);
  870. if ((dscr & (ARM11_DSCR_CORE_RESTARTED | ARM11_DSCR_CORE_HALTED)) ==
  871. (ARM11_DSCR_CORE_RESTARTED | ARM11_DSCR_CORE_HALTED))
  872. break;
  873. long long then = 0;
  874. if (i == 1000)
  875. {
  876. then = timeval_ms();
  877. }
  878. if (i >= 1000)
  879. {
  880. if ((timeval_ms()-then) > 1000)
  881. {
  882. LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
  883. return ERROR_FAIL;
  884. }
  885. }
  886. i++;
  887. }
  888. /* clear breakpoint */
  889. arm11_sc7_clear_vbw(arm11);
  890. /* save state */
  891. CHECK_RETVAL(arm11_on_enter_debug_state(arm11));
  892. /* restore default state */
  893. R(DSCR) &= ~ARM11_DSCR_INTERRUPTS_DISABLE;
  894. }
  895. // target->state = TARGET_HALTED;
  896. target->debug_reason = DBG_REASON_SINGLESTEP;
  897. CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_HALTED));
  898. return ERROR_OK;
  899. }
  900. static int arm11_assert_reset(target_t *target)
  901. {
  902. FNC_INFO;
  903. int retval;
  904. struct arm11_common * arm11 = target->arch_info;
  905. retval = arm11_check_init(arm11, NULL);
  906. if (retval != ERROR_OK)
  907. return retval;
  908. target->state = TARGET_UNKNOWN;
  909. /* we would very much like to reset into the halted, state,
  910. * but resetting and halting is second best... */
  911. if (target->reset_halt)
  912. {
  913. CHECK_RETVAL(target_halt(target));
  914. }
  915. /* srst is funny. We can not do *anything* else while it's asserted
  916. * and it has unkonwn side effects. Make sure no other code runs
  917. * meanwhile.
  918. *
  919. * Code below assumes srst:
  920. *
  921. * - Causes power-on-reset (but of what parts of the system?). Bug
  922. * in arm11?
  923. *
  924. * - Messes us TAP state without asserting trst.
  925. *
  926. * - There is another bug in the arm11 core. When you generate an access to
  927. * external logic (for example ddr controller via AHB bus) and that block
  928. * is not configured (perhaps it is still held in reset), that transaction
  929. * will never complete. This will hang arm11 core but it will also hang
  930. * JTAG controller. Nothing, short of srst assertion will bring it out of
  931. * this.
  932. *
  933. * Mysteries:
  934. *
  935. * - What should the PC be after an srst reset when starting in the halted
  936. * state?
  937. */
  938. jtag_add_reset(0, 1);
  939. jtag_add_reset(0, 0);
  940. /* How long do we have to wait? */
  941. jtag_add_sleep(5000);
  942. /* un-mess up TAP state */
  943. jtag_add_tlr();
  944. retval = jtag_execute_queue();
  945. if (retval != ERROR_OK)
  946. {
  947. return retval;
  948. }
  949. return ERROR_OK;
  950. }
  951. static int arm11_deassert_reset(target_t *target)
  952. {
  953. return ERROR_OK;
  954. }
  955. static int arm11_soft_reset_halt(struct target_s *target)
  956. {
  957. FNC_INFO_NOTIMPLEMENTED;
  958. return ERROR_OK;
  959. }
  960. /* target register access for gdb */
  961. static int arm11_get_gdb_reg_list(struct target_s *target,
  962. struct reg_s **reg_list[], int *reg_list_size)
  963. {
  964. FNC_INFO;
  965. struct arm11_common * arm11 = target->arch_info;
  966. *reg_list_size = ARM11_GDB_REGISTER_COUNT;
  967. *reg_list = malloc(sizeof(reg_t*) * ARM11_GDB_REGISTER_COUNT);
  968. for (size_t i = 16; i < 24; i++)
  969. {
  970. (*reg_list)[i] = &arm11_gdb_dummy_fp_reg;
  971. }
  972. (*reg_list)[24] = &arm11_gdb_dummy_fps_reg;
  973. for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
  974. {
  975. if (arm11_reg_defs[i].gdb_num == -1)
  976. continue;
  977. (*reg_list)[arm11_reg_defs[i].gdb_num] = arm11->reg_list + i;
  978. }
  979. return ERROR_OK;
  980. }
  981. /* target memory access
  982. * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
  983. * count: number of items of <size>
  984. *
  985. * arm11_config_memrw_no_increment - in the future we may want to be able
  986. * to read/write a range of data to a "port". a "port" is an action on
  987. * read memory address for some peripheral.
  988. */
  989. static int arm11_read_memory_inner(struct target_s *target,
  990. uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
  991. bool arm11_config_memrw_no_increment)
  992. {
  993. /** \todo TODO: check if buffer cast to uint32_t* and uint16_t* might cause alignment problems */
  994. int retval;
  995. FNC_INFO;
  996. if (target->state != TARGET_HALTED)
  997. {
  998. LOG_WARNING("target was not halted");
  999. return ERROR_TARGET_NOT_HALTED;
  1000. }
  1001. LOG_DEBUG("ADDR %08" PRIx32 " SIZE %08" PRIx32 " COUNT %08" PRIx32 "", address, size, count);
  1002. struct arm11_common * arm11 = target->arch_info;
  1003. retval = arm11_run_instr_data_prepare(arm11);
  1004. if (retval != ERROR_OK)
  1005. return retval;
  1006. /* MRC p14,0,r0,c0,c5,0 */
  1007. retval = arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
  1008. if (retval != ERROR_OK)
  1009. return retval;
  1010. switch (size)
  1011. {
  1012. case 1:
  1013. /** \todo TODO: check if dirty is the right choice to force a rewrite on arm11_resume() */
  1014. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  1015. for (size_t i = 0; i < count; i++)
  1016. {
  1017. /* ldrb r1, [r0], #1 */
  1018. /* ldrb r1, [r0] */
  1019. arm11_run_instr_no_data1(arm11,
  1020. !arm11_config_memrw_no_increment ? 0xe4d01001 : 0xe5d01000);
  1021. uint32_t res;
  1022. /* MCR p14,0,R1,c0,c5,0 */
  1023. arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
  1024. *buffer++ = res;
  1025. }
  1026. break;
  1027. case 2:
  1028. {
  1029. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  1030. for (size_t i = 0; i < count; i++)
  1031. {
  1032. /* ldrh r1, [r0], #2 */
  1033. arm11_run_instr_no_data1(arm11,
  1034. !arm11_config_memrw_no_increment ? 0xe0d010b2 : 0xe1d010b0);
  1035. uint32_t res;
  1036. /* MCR p14,0,R1,c0,c5,0 */
  1037. arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
  1038. uint16_t svalue = res;
  1039. memcpy(buffer + i * sizeof(uint16_t), &svalue, sizeof(uint16_t));
  1040. }
  1041. break;
  1042. }
  1043. case 4:
  1044. {
  1045. uint32_t instr = !arm11_config_memrw_no_increment ? 0xecb05e01 : 0xed905e00;
  1046. /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
  1047. uint32_t *words = (uint32_t *)buffer;
  1048. /* LDC p14,c5,[R0],#4 */
  1049. /* LDC p14,c5,[R0] */
  1050. arm11_run_instr_data_from_core(arm11, instr, words, count);
  1051. break;
  1052. }
  1053. }
  1054. return arm11_run_instr_data_finish(arm11);
  1055. }
  1056. static int arm11_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
  1057. {
  1058. return arm11_read_memory_inner(target, address, size, count, buffer, false);
  1059. }
  1060. /*
  1061. * arm11_config_memrw_no_increment - in the future we may want to be able
  1062. * to read/write a range of data to a "port". a "port" is an action on
  1063. * read memory address for some peripheral.
  1064. */
  1065. static int arm11_write_memory_inner(struct target_s *target,
  1066. uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
  1067. bool arm11_config_memrw_no_increment)
  1068. {
  1069. int retval;
  1070. FNC_INFO;
  1071. if (target->state != TARGET_HALTED)
  1072. {
  1073. LOG_WARNING("target was not halted");
  1074. return ERROR_TARGET_NOT_HALTED;
  1075. }
  1076. LOG_DEBUG("ADDR %08" PRIx32 " SIZE %08" PRIx32 " COUNT %08" PRIx32 "", address, size, count);
  1077. struct arm11_common * arm11 = target->arch_info;
  1078. retval = arm11_run_instr_data_prepare(arm11);
  1079. if (retval != ERROR_OK)
  1080. return retval;
  1081. /* MRC p14,0,r0,c0,c5,0 */
  1082. retval = arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
  1083. if (retval != ERROR_OK)
  1084. return retval;
  1085. /* burst writes are not used for single words as those may well be
  1086. * reset init script writes.
  1087. *
  1088. * The other advantage is that as burst writes are default, we'll
  1089. * now exercise both burst and non-burst code paths with the
  1090. * default settings, increasing code coverage.
  1091. */
  1092. bool burst = arm11_config_memwrite_burst && (count > 1);
  1093. switch (size)
  1094. {
  1095. case 1:
  1096. {
  1097. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  1098. for (size_t i = 0; i < count; i++)
  1099. {
  1100. /* MRC p14,0,r1,c0,c5,0 */
  1101. retval = arm11_run_instr_data_to_core1(arm11, 0xee101e15, *buffer++);
  1102. if (retval != ERROR_OK)
  1103. return retval;
  1104. /* strb r1, [r0], #1 */
  1105. /* strb r1, [r0] */
  1106. retval = arm11_run_instr_no_data1(arm11,
  1107. !arm11_config_memrw_no_increment ? 0xe4c01001 : 0xe5c01000);
  1108. if (retval != ERROR_OK)
  1109. return retval;
  1110. }
  1111. break;
  1112. }
  1113. case 2:
  1114. {
  1115. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  1116. for (size_t i = 0; i < count; i++)
  1117. {
  1118. uint16_t value;
  1119. memcpy(&value, buffer + i * sizeof(uint16_t), sizeof(uint16_t));
  1120. /* MRC p14,0,r1,c0,c5,0 */
  1121. retval = arm11_run_instr_data_to_core1(arm11, 0xee101e15, value);
  1122. if (retval != ERROR_OK)
  1123. return retval;
  1124. /* strh r1, [r0], #2 */
  1125. /* strh r1, [r0] */
  1126. retval = arm11_run_instr_no_data1(arm11,
  1127. !arm11_config_memrw_no_increment ? 0xe0c010b2 : 0xe1c010b0);
  1128. if (retval != ERROR_OK)
  1129. return retval;
  1130. }
  1131. break;
  1132. }
  1133. case 4: {
  1134. uint32_t instr = !arm11_config_memrw_no_increment ? 0xeca05e01 : 0xed805e00;
  1135. /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
  1136. uint32_t *words = (uint32_t*)buffer;
  1137. if (!burst)
  1138. {
  1139. /* STC p14,c5,[R0],#4 */
  1140. /* STC p14,c5,[R0]*/
  1141. retval = arm11_run_instr_data_to_core(arm11, instr, words, count);
  1142. if (retval != ERROR_OK)
  1143. return retval;
  1144. }
  1145. else
  1146. {
  1147. /* STC p14,c5,[R0],#4 */
  1148. /* STC p14,c5,[R0]*/
  1149. retval = arm11_run_instr_data_to_core_noack(arm11, instr, words, count);
  1150. if (retval != ERROR_OK)
  1151. return retval;
  1152. }
  1153. break;
  1154. }
  1155. }
  1156. /* r0 verification */
  1157. if (!arm11_config_memrw_no_increment)
  1158. {
  1159. uint32_t r0;
  1160. /* MCR p14,0,R0,c0,c5,0 */
  1161. retval = arm11_run_instr_data_from_core(arm11, 0xEE000E15, &r0, 1);
  1162. if (retval != ERROR_OK)
  1163. return retval;
  1164. if (address + size * count != r0)
  1165. {
  1166. LOG_ERROR("Data transfer failed. Expected end "
  1167. "address 0x%08x, got 0x%08x",
  1168. (unsigned) (address + size * count),
  1169. (unsigned) r0);
  1170. if (burst)
  1171. LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
  1172. if (arm11_config_memwrite_error_fatal)
  1173. return ERROR_FAIL;
  1174. }
  1175. }
  1176. return arm11_run_instr_data_finish(arm11);
  1177. }
  1178. static int arm11_write_memory(struct target_s *target,
  1179. uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
  1180. {
  1181. return arm11_write_memory_inner(target, address, size, count, buffer, false);
  1182. }
  1183. /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
  1184. static int arm11_bulk_write_memory(struct target_s *target,
  1185. uint32_t address, uint32_t count, uint8_t *buffer)
  1186. {
  1187. FNC_INFO;
  1188. if (target->state != TARGET_HALTED)
  1189. {
  1190. LOG_WARNING("target was not halted");
  1191. return ERROR_TARGET_NOT_HALTED;
  1192. }
  1193. return arm11_write_memory(target, address, 4, count, buffer);
  1194. }
  1195. /* here we have nothing target specific to contribute, so we fail and then the
  1196. * fallback code will read data from the target and calculate the CRC on the
  1197. * host.
  1198. */
  1199. static int arm11_checksum_memory(struct target_s *target,
  1200. uint32_t address, uint32_t count, uint32_t* checksum)
  1201. {
  1202. return ERROR_FAIL;
  1203. }
  1204. /* target break-/watchpoint control
  1205. * rw: 0 = write, 1 = read, 2 = access
  1206. */
  1207. static int arm11_add_breakpoint(struct target_s *target,
  1208. struct breakpoint *breakpoint)
  1209. {
  1210. FNC_INFO;
  1211. struct arm11_common * arm11 = target->arch_info;
  1212. #if 0
  1213. if (breakpoint->type == BKPT_SOFT)
  1214. {
  1215. LOG_INFO("sw breakpoint requested, but software breakpoints not enabled");
  1216. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  1217. }
  1218. #endif
  1219. if (!arm11->free_brps)
  1220. {
  1221. LOG_DEBUG("no breakpoint unit available for hardware breakpoint");
  1222. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  1223. }
  1224. if (breakpoint->length != 4)
  1225. {
  1226. LOG_DEBUG("only breakpoints of four bytes length supported");
  1227. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  1228. }
  1229. arm11->free_brps--;
  1230. return ERROR_OK;
  1231. }
  1232. static int arm11_remove_breakpoint(struct target_s *target,
  1233. struct breakpoint *breakpoint)
  1234. {
  1235. FNC_INFO;
  1236. struct arm11_common * arm11 = target->arch_info;
  1237. arm11->free_brps++;
  1238. return ERROR_OK;
  1239. }
  1240. static int arm11_add_watchpoint(struct target_s *target,
  1241. struct watchpoint *watchpoint)
  1242. {
  1243. FNC_INFO_NOTIMPLEMENTED;
  1244. return ERROR_OK;
  1245. }
  1246. static int arm11_remove_watchpoint(struct target_s *target,
  1247. struct watchpoint *watchpoint)
  1248. {
  1249. FNC_INFO_NOTIMPLEMENTED;
  1250. return ERROR_OK;
  1251. }
  1252. // HACKHACKHACK - FIXME mode/state
  1253. /* target algorithm support */
  1254. static int arm11_run_algorithm(struct target_s *target,
  1255. int num_mem_params, struct mem_param *mem_params,
  1256. int num_reg_params, struct reg_param *reg_params,
  1257. uint32_t entry_point, uint32_t exit_point,
  1258. int timeout_ms, void *arch_info)
  1259. {
  1260. struct arm11_common *arm11 = target->arch_info;
  1261. // enum armv4_5_state core_state = arm11->core_state;
  1262. // enum armv4_5_mode core_mode = arm11->core_mode;
  1263. uint32_t context[16];
  1264. uint32_t cpsr;
  1265. int exit_breakpoint_size = 0;
  1266. int retval = ERROR_OK;
  1267. LOG_DEBUG("Running algorithm");
  1268. if (target->state != TARGET_HALTED)
  1269. {
  1270. LOG_WARNING("target not halted");
  1271. return ERROR_TARGET_NOT_HALTED;
  1272. }
  1273. // FIXME
  1274. // if (armv4_5_mode_to_number(arm11->core_mode)==-1)
  1275. // return ERROR_FAIL;
  1276. // Save regs
  1277. for (unsigned i = 0; i < 16; i++)
  1278. {
  1279. context[i] = buf_get_u32((uint8_t*)(&arm11->reg_values[i]),0,32);
  1280. LOG_DEBUG("Save %u: 0x%" PRIx32 "", i, context[i]);
  1281. }
  1282. cpsr = buf_get_u32((uint8_t*)(arm11->reg_values + ARM11_RC_CPSR),0,32);
  1283. LOG_DEBUG("Save CPSR: 0x%" PRIx32 "", cpsr);
  1284. for (int i = 0; i < num_mem_params; i++)
  1285. {
  1286. target_write_buffer(target, mem_params[i].address, mem_params[i].size, mem_params[i].value);
  1287. }
  1288. // Set register parameters
  1289. for (int i = 0; i < num_reg_params; i++)
  1290. {
  1291. reg_t *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
  1292. if (!reg)
  1293. {
  1294. LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
  1295. exit(-1);
  1296. }
  1297. if (reg->size != reg_params[i].size)
  1298. {
  1299. LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size", reg_params[i].reg_name);
  1300. exit(-1);
  1301. }
  1302. arm11_set_reg(reg,reg_params[i].value);
  1303. // printf("%i: Set %s =%08x\n", i, reg_params[i].reg_name,val);
  1304. }
  1305. exit_breakpoint_size = 4;
  1306. /* arm11->core_state = arm11_algorithm_info->core_state;
  1307. if (arm11->core_state == ARMV4_5_STATE_ARM)
  1308. exit_breakpoint_size = 4;
  1309. else if (arm11->core_state == ARMV4_5_STATE_THUMB)
  1310. exit_breakpoint_size = 2;
  1311. else
  1312. {
  1313. LOG_ERROR("BUG: can't execute algorithms when not in ARM or Thumb state");
  1314. exit(-1);
  1315. }
  1316. */
  1317. /* arm11 at this point only supports ARM not THUMB mode
  1318. however if this test needs to be reactivated the current state can be read back
  1319. from CPSR */
  1320. #if 0
  1321. if (arm11_algorithm_info->core_mode != ARMV4_5_MODE_ANY)
  1322. {
  1323. LOG_DEBUG("setting core_mode: 0x%2.2x", arm11_algorithm_info->core_mode);
  1324. buf_set_u32(arm11->reg_list[ARM11_RC_CPSR].value, 0, 5, arm11_algorithm_info->core_mode);
  1325. arm11->reg_list[ARM11_RC_CPSR].dirty = 1;
  1326. arm11->reg_list[ARM11_RC_CPSR].valid = 1;
  1327. }
  1328. #endif
  1329. if ((retval = breakpoint_add(target, exit_point, exit_breakpoint_size, BKPT_HARD)) != ERROR_OK)
  1330. {
  1331. LOG_ERROR("can't add breakpoint to finish algorithm execution");
  1332. retval = ERROR_TARGET_FAILURE;
  1333. goto restore;
  1334. }
  1335. // no debug, otherwise breakpoint is not set
  1336. CHECK_RETVAL(target_resume(target, 0, entry_point, 1, 0));
  1337. CHECK_RETVAL(target_wait_state(target, TARGET_HALTED, timeout_ms));
  1338. if (target->state != TARGET_HALTED)
  1339. {
  1340. CHECK_RETVAL(target_halt(target));
  1341. CHECK_RETVAL(target_wait_state(target, TARGET_HALTED, 500));
  1342. retval = ERROR_TARGET_TIMEOUT;
  1343. goto del_breakpoint;
  1344. }
  1345. if (buf_get_u32(arm11->reg_list[15].value, 0, 32) != exit_point)
  1346. {
  1347. LOG_WARNING("target reentered debug state, but not at the desired exit point: 0x%4.4" PRIx32 "",
  1348. buf_get_u32(arm11->reg_list[15].value, 0, 32));
  1349. retval = ERROR_TARGET_TIMEOUT;
  1350. goto del_breakpoint;
  1351. }
  1352. for (int i = 0; i < num_mem_params; i++)
  1353. {
  1354. if (mem_params[i].direction != PARAM_OUT)
  1355. target_read_buffer(target, mem_params[i].address, mem_params[i].size, mem_params[i].value);
  1356. }
  1357. for (int i = 0; i < num_reg_params; i++)
  1358. {
  1359. if (reg_params[i].direction != PARAM_OUT)
  1360. {
  1361. reg_t *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
  1362. if (!reg)
  1363. {
  1364. LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
  1365. exit(-1);
  1366. }
  1367. if (reg->size != reg_params[i].size)
  1368. {
  1369. LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size", reg_params[i].reg_name);
  1370. exit(-1);
  1371. }
  1372. buf_set_u32(reg_params[i].value, 0, 32, buf_get_u32(reg->value, 0, 32));
  1373. }
  1374. }
  1375. del_breakpoint:
  1376. breakpoint_remove(target, exit_point);
  1377. restore:
  1378. // Restore context
  1379. for (size_t i = 0; i < 16; i++)
  1380. {
  1381. LOG_DEBUG("restoring register %s with value 0x%8.8" PRIx32 "",
  1382. arm11->reg_list[i].name, context[i]);
  1383. arm11_set_reg(&arm11->reg_list[i], (uint8_t*)&context[i]);
  1384. }
  1385. LOG_DEBUG("restoring CPSR with value 0x%8.8" PRIx32 "", cpsr);
  1386. arm11_set_reg(&arm11->reg_list[ARM11_RC_CPSR], (uint8_t*)&cpsr);
  1387. // arm11->core_state = core_state;
  1388. // arm11->core_mode = core_mode;
  1389. return retval;
  1390. }
  1391. static int arm11_target_create(struct target_s *target, Jim_Interp *interp)
  1392. {
  1393. FNC_INFO;
  1394. NEW(struct arm11_common, arm11, 1);
  1395. arm11->target = target;
  1396. if (target->tap == NULL)
  1397. return ERROR_FAIL;
  1398. if (target->tap->ir_length != 5)
  1399. {
  1400. LOG_ERROR("'target arm11' expects IR LENGTH = 5");
  1401. return ERROR_COMMAND_SYNTAX_ERROR;
  1402. }
  1403. target->arch_info = arm11;
  1404. return ERROR_OK;
  1405. }
  1406. static int arm11_init_target(struct command_context_s *cmd_ctx,
  1407. struct target_s *target)
  1408. {
  1409. /* Initialize anything we can set up without talking to the target */
  1410. return arm11_build_reg_cache(target);
  1411. }
  1412. /* talk to the target and set things up */
  1413. static int arm11_examine(struct target_s *target)
  1414. {
  1415. int retval;
  1416. FNC_INFO;
  1417. struct arm11_common * arm11 = target->arch_info;
  1418. /* check IDCODE */
  1419. arm11_add_IR(arm11, ARM11_IDCODE, ARM11_TAP_DEFAULT);
  1420. struct scan_field idcode_field;
  1421. arm11_setup_field(arm11, 32, NULL, &arm11->device_id, &idcode_field);
  1422. arm11_add_dr_scan_vc(1, &idcode_field, TAP_DRPAUSE);
  1423. /* check DIDR */
  1424. arm11_add_debug_SCAN_N(arm11, 0x00, ARM11_TAP_DEFAULT);
  1425. arm11_add_IR(arm11, ARM11_INTEST, ARM11_TAP_DEFAULT);
  1426. struct scan_field chain0_fields[2];
  1427. arm11_setup_field(arm11, 32, NULL, &arm11->didr, chain0_fields + 0);
  1428. arm11_setup_field(arm11, 8, NULL, &arm11->implementor, chain0_fields + 1);
  1429. arm11_add_dr_scan_vc(asizeof(chain0_fields), chain0_fields, TAP_IDLE);
  1430. CHECK_RETVAL(jtag_execute_queue());
  1431. switch (arm11->device_id & 0x0FFFF000)
  1432. {
  1433. case 0x07B36000: LOG_INFO("found ARM1136"); break;
  1434. case 0x07B56000: LOG_INFO("found ARM1156"); break;
  1435. case 0x07B76000: LOG_INFO("found ARM1176"); break;
  1436. default:
  1437. {
  1438. LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
  1439. return ERROR_FAIL;
  1440. }
  1441. }
  1442. arm11->debug_version = (arm11->didr >> 16) & 0x0F;
  1443. if (arm11->debug_version != ARM11_DEBUG_V6 &&
  1444. arm11->debug_version != ARM11_DEBUG_V61)
  1445. {
  1446. LOG_ERROR("Only ARMv6 v6 and v6.1 architectures supported.");
  1447. return ERROR_FAIL;
  1448. }
  1449. arm11->brp = ((arm11->didr >> 24) & 0x0F) + 1;
  1450. arm11->wrp = ((arm11->didr >> 28) & 0x0F) + 1;
  1451. /** \todo TODO: reserve one brp slot if we allow breakpoints during step */
  1452. arm11->free_brps = arm11->brp;
  1453. arm11->free_wrps = arm11->wrp;
  1454. LOG_DEBUG("IDCODE %08" PRIx32 " IMPLEMENTOR %02x DIDR %08" PRIx32 "",
  1455. arm11->device_id,
  1456. (int)(arm11->implementor),
  1457. arm11->didr);
  1458. /* as a side-effect this reads DSCR and thus
  1459. * clears the ARM11_DSCR_STICKY_PRECISE_DATA_ABORT / Sticky Precise Data Abort Flag
  1460. * as suggested by the spec.
  1461. */
  1462. retval = arm11_check_init(arm11, NULL);
  1463. if (retval != ERROR_OK)
  1464. return retval;
  1465. target_set_examined(target);
  1466. return ERROR_OK;
  1467. }
  1468. /** Load a register that is marked !valid in the register cache */
  1469. static int arm11_get_reg(reg_t *reg)
  1470. {
  1471. FNC_INFO;
  1472. target_t * target = ((struct arm11_reg_state *)reg->arch_info)->target;
  1473. if (target->state != TARGET_HALTED)
  1474. {
  1475. LOG_WARNING("target was not halted");
  1476. return ERROR_TARGET_NOT_HALTED;
  1477. }
  1478. /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
  1479. #if 0
  1480. struct arm11_common *arm11 = target->arch_info;
  1481. const struct arm11_reg_defs * arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
  1482. #endif
  1483. return ERROR_OK;
  1484. }
  1485. /** Change a value in the register cache */
  1486. static int arm11_set_reg(reg_t *reg, uint8_t *buf)
  1487. {
  1488. FNC_INFO;
  1489. target_t * target = ((struct arm11_reg_state *)reg->arch_info)->target;
  1490. struct arm11_common *arm11 = target->arch_info;
  1491. // const struct arm11_reg_defs * arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
  1492. arm11->reg_values[((struct arm11_reg_state *)reg->arch_info)->def_index] = buf_get_u32(buf, 0, 32);
  1493. reg->valid = 1;
  1494. reg->dirty = 1;
  1495. return ERROR_OK;
  1496. }
  1497. static int arm11_build_reg_cache(target_t *target)
  1498. {
  1499. struct arm11_common *arm11 = target->arch_info;
  1500. NEW(struct reg_cache, cache, 1);
  1501. NEW(reg_t, reg_list, ARM11_REGCACHE_COUNT);
  1502. NEW(struct arm11_reg_state, arm11_reg_states, ARM11_REGCACHE_COUNT);
  1503. if (arm11_regs_arch_type == -1)
  1504. arm11_regs_arch_type = register_reg_arch_type(arm11_get_reg, arm11_set_reg);
  1505. register_init_dummy(&arm11_gdb_dummy_fp_reg);
  1506. register_init_dummy(&arm11_gdb_dummy_fps_reg);
  1507. arm11->reg_list = reg_list;
  1508. /* Build the process context cache */
  1509. cache->name = "arm11 registers";
  1510. cache->next = NULL;
  1511. cache->reg_list = reg_list;
  1512. cache->num_regs = ARM11_REGCACHE_COUNT;
  1513. struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
  1514. (*cache_p) = cache;
  1515. arm11->core_cache = cache;
  1516. // armv7m->process_context = cache;
  1517. size_t i;
  1518. /* Not very elegant assertion */
  1519. if (ARM11_REGCACHE_COUNT != asizeof(arm11->reg_values) ||
  1520. ARM11_REGCACHE_COUNT != asizeof(arm11_reg_defs) ||
  1521. ARM11_REGCACHE_COUNT != ARM11_RC_MAX)
  1522. {
  1523. LOG_ERROR("BUG: arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
  1524. exit(-1);
  1525. }
  1526. for (i = 0; i < ARM11_REGCACHE_COUNT; i++)
  1527. {
  1528. reg_t * r = reg_list + i;
  1529. const struct arm11_reg_defs * rd = arm11_reg_defs + i;
  1530. struct arm11_reg_state * rs = arm11_reg_states + i;
  1531. r->name = rd->name;
  1532. r->size = 32;
  1533. r->value = (uint8_t *)(arm11->reg_values + i);
  1534. r->dirty = 0;
  1535. r->valid = 0;
  1536. r->bitfield_desc = NULL;
  1537. r->num_bitfields = 0;
  1538. r->arch_type = arm11_regs_arch_type;
  1539. r->arch_info = rs;
  1540. rs->def_index = i;
  1541. rs->target = target;
  1542. }
  1543. return ERROR_OK;
  1544. }
  1545. static COMMAND_HELPER(arm11_handle_bool, bool *var, char *name)
  1546. {
  1547. if (argc == 0)
  1548. {
  1549. LOG_INFO("%s is %s.", name, *var ? "enabled" : "disabled");
  1550. return ERROR_OK;
  1551. }
  1552. if (argc != 1)
  1553. return ERROR_COMMAND_SYNTAX_ERROR;
  1554. switch (args[0][0])
  1555. {
  1556. case '0': /* 0 */
  1557. case 'f': /* false */
  1558. case 'F':
  1559. case 'd': /* disable */
  1560. case 'D':
  1561. *var = false;
  1562. break;
  1563. case '1': /* 1 */
  1564. case 't': /* true */
  1565. case 'T':
  1566. case 'e': /* enable */
  1567. case 'E':
  1568. *var = true;
  1569. break;
  1570. }
  1571. LOG_INFO("%s %s.", *var ? "Enabled" : "Disabled", name);
  1572. return ERROR_OK;
  1573. }
  1574. #define BOOL_WRAPPER(name, print_name) \
  1575. COMMAND_HANDLER(arm11_handle_bool_##name) \
  1576. { \
  1577. return CALL_COMMAND_HANDLER(arm11_handle_bool, \
  1578. &arm11_config_##name, print_name); \
  1579. }
  1580. BOOL_WRAPPER(memwrite_burst, "memory write burst mode")
  1581. BOOL_WRAPPER(memwrite_error_fatal, "fatal error mode for memory writes")
  1582. BOOL_WRAPPER(step_irq_enable, "IRQs while stepping")
  1583. BOOL_WRAPPER(hardware_step, "hardware single step")
  1584. COMMAND_HANDLER(arm11_handle_vcr)
  1585. {
  1586. switch (argc) {
  1587. case 0:
  1588. break;
  1589. case 1:
  1590. COMMAND_PARSE_NUMBER(u32, args[0], arm11_vcr);
  1591. break;
  1592. default:
  1593. return ERROR_COMMAND_SYNTAX_ERROR;
  1594. }
  1595. LOG_INFO("VCR 0x%08" PRIx32 "", arm11_vcr);
  1596. return ERROR_OK;
  1597. }
  1598. static const uint32_t arm11_coproc_instruction_limits[] =
  1599. {
  1600. 15, /* coprocessor */
  1601. 7, /* opcode 1 */
  1602. 15, /* CRn */
  1603. 15, /* CRm */
  1604. 7, /* opcode 2 */
  1605. 0xFFFFFFFF, /* value */
  1606. };
  1607. static struct arm11_common * arm11_find_target(const char * arg)
  1608. {
  1609. struct jtag_tap * tap;
  1610. target_t * t;
  1611. tap = jtag_tap_by_string(arg);
  1612. if (!tap)
  1613. return 0;
  1614. for (t = all_targets; t; t = t->next)
  1615. {
  1616. if (t->tap != tap)
  1617. continue;
  1618. /* if (t->type == arm11_target) */
  1619. if (0 == strcmp(target_get_name(t), "arm11"))
  1620. return t->arch_info;
  1621. }
  1622. return 0;
  1623. }
  1624. static int arm11_mrc_inner(target_t *target, int cpnum,
  1625. uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm,
  1626. uint32_t *value, bool read)
  1627. {
  1628. int retval;
  1629. if (target->state != TARGET_HALTED)
  1630. {
  1631. LOG_ERROR("Target not halted");
  1632. return ERROR_FAIL;
  1633. }
  1634. struct arm11_common * arm11 = target->arch_info;
  1635. uint32_t instr = 0xEE000010 |
  1636. (cpnum << 8) |
  1637. (op1 << 21) |
  1638. (CRn << 16) |
  1639. (CRm << 0) |
  1640. (op2 << 5);
  1641. if (read)
  1642. instr |= 0x00100000;
  1643. retval = arm11_run_instr_data_prepare(arm11);
  1644. if (retval != ERROR_OK)
  1645. return retval;
  1646. if (read)
  1647. {
  1648. retval = arm11_run_instr_data_from_core_via_r0(arm11, instr, value);
  1649. if (retval != ERROR_OK)
  1650. return retval;
  1651. }
  1652. else
  1653. {
  1654. retval = arm11_run_instr_data_to_core_via_r0(arm11, instr, *value);
  1655. if (retval != ERROR_OK)
  1656. return retval;
  1657. }
  1658. return arm11_run_instr_data_finish(arm11);
  1659. }
  1660. static int arm11_mrc(target_t *target, int cpnum,
  1661. uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
  1662. {
  1663. return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, value, true);
  1664. }
  1665. static int arm11_mcr(target_t *target, int cpnum,
  1666. uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
  1667. {
  1668. return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, &value, false);
  1669. }
  1670. static COMMAND_HELPER(arm11_handle_etm_read_write, bool read)
  1671. {
  1672. if (argc != (read ? 2 : 3))
  1673. {
  1674. LOG_ERROR("Invalid number of arguments.");
  1675. return ERROR_COMMAND_SYNTAX_ERROR;
  1676. }
  1677. struct arm11_common * arm11 = arm11_find_target(args[0]);
  1678. if (!arm11)
  1679. {
  1680. LOG_ERROR("Parameter 1 is not the target name of an ARM11 device.");
  1681. return ERROR_COMMAND_SYNTAX_ERROR;
  1682. }
  1683. uint32_t address;
  1684. COMMAND_PARSE_NUMBER(u32, args[1], address);
  1685. if (!read)
  1686. {
  1687. uint32_t value;
  1688. COMMAND_PARSE_NUMBER(u32, args[2], value);
  1689. LOG_INFO("ETM write register 0x%02" PRIx32 " (%" PRId32 ") = 0x%08" PRIx32 " (%" PRId32 ")",
  1690. address, address, value, value);
  1691. CHECK_RETVAL(arm11_write_etm(arm11, address, value));
  1692. }
  1693. else
  1694. {
  1695. uint32_t value;
  1696. CHECK_RETVAL(arm11_read_etm(arm11, address, &value));
  1697. LOG_INFO("ETM read register 0x%02" PRIx32 " (%" PRId32 ") = 0x%08" PRIx32 " (%" PRId32 ")",
  1698. address, address, value, value);
  1699. }
  1700. return ERROR_OK;
  1701. }
  1702. COMMAND_HANDLER(arm11_handle_etmr)
  1703. {
  1704. return CALL_COMMAND_HANDLER(arm11_handle_etm_read_write, true);
  1705. }
  1706. COMMAND_HANDLER(arm11_handle_etmw)
  1707. {
  1708. return CALL_COMMAND_HANDLER(arm11_handle_etm_read_write, false);
  1709. }
  1710. #define ARM11_HANDLER(x) .x = arm11_##x
  1711. target_type_t arm11_target = {
  1712. .name = "arm11",
  1713. ARM11_HANDLER(poll),
  1714. ARM11_HANDLER(arch_state),
  1715. ARM11_HANDLER(target_request_data),
  1716. ARM11_HANDLER(halt),
  1717. ARM11_HANDLER(resume),
  1718. ARM11_HANDLER(step),
  1719. ARM11_HANDLER(assert_reset),
  1720. ARM11_HANDLER(deassert_reset),
  1721. ARM11_HANDLER(soft_reset_halt),
  1722. ARM11_HANDLER(get_gdb_reg_list),
  1723. ARM11_HANDLER(read_memory),
  1724. ARM11_HANDLER(write_memory),
  1725. ARM11_HANDLER(bulk_write_memory),
  1726. ARM11_HANDLER(checksum_memory),
  1727. ARM11_HANDLER(add_breakpoint),
  1728. ARM11_HANDLER(remove_breakpoint),
  1729. ARM11_HANDLER(add_watchpoint),
  1730. ARM11_HANDLER(remove_watchpoint),
  1731. ARM11_HANDLER(run_algorithm),
  1732. ARM11_HANDLER(register_commands),
  1733. ARM11_HANDLER(target_create),
  1734. ARM11_HANDLER(init_target),
  1735. ARM11_HANDLER(examine),
  1736. ARM11_HANDLER(mrc),
  1737. ARM11_HANDLER(mcr),
  1738. };
  1739. int arm11_register_commands(struct command_context_s *cmd_ctx)
  1740. {
  1741. FNC_INFO;
  1742. command_t *top_cmd, *mw_cmd;
  1743. top_cmd = register_command(cmd_ctx, NULL, "arm11",
  1744. NULL, COMMAND_ANY, NULL);
  1745. register_command(cmd_ctx, top_cmd, "etmr",
  1746. arm11_handle_etmr, COMMAND_ANY,
  1747. "Read Embedded Trace Macrocell (ETM) register. etmr <jtag_target> <ETM register address>");
  1748. register_command(cmd_ctx, top_cmd, "etmw",
  1749. arm11_handle_etmw, COMMAND_ANY,
  1750. "Write Embedded Trace Macrocell (ETM) register. etmr <jtag_target> <ETM register address> <value>");
  1751. /* "hardware_step" is only here to check if the default
  1752. * simulate + breakpoint implementation is broken.
  1753. * TEMPORARY! NOT DOCUMENTED!
  1754. */
  1755. register_command(cmd_ctx, top_cmd, "hardware_step",
  1756. arm11_handle_bool_hardware_step, COMMAND_ANY,
  1757. "DEBUG ONLY - Hardware single stepping"
  1758. " (default: disabled)");
  1759. mw_cmd = register_command(cmd_ctx, top_cmd, "memwrite",
  1760. NULL, COMMAND_ANY, NULL);
  1761. register_command(cmd_ctx, mw_cmd, "burst",
  1762. arm11_handle_bool_memwrite_burst, COMMAND_ANY,
  1763. "Enable/Disable non-standard but fast burst mode"
  1764. " (default: enabled)");
  1765. register_command(cmd_ctx, mw_cmd, "error_fatal",
  1766. arm11_handle_bool_memwrite_error_fatal, COMMAND_ANY,
  1767. "Terminate program if transfer error was found"
  1768. " (default: enabled)");
  1769. register_command(cmd_ctx, top_cmd, "step_irq_enable",
  1770. arm11_handle_bool_step_irq_enable, COMMAND_ANY,
  1771. "Enable interrupts while stepping"
  1772. " (default: disabled)");
  1773. register_command(cmd_ctx, top_cmd, "vcr",
  1774. arm11_handle_vcr, COMMAND_ANY,
  1775. "Control (Interrupt) Vector Catch Register");
  1776. return ERROR_OK;
  1777. }