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.
 
 
 
 
 
 

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