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.
 
 
 
 
 
 

1802 lines
41 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2008 digenius technology GmbH. *
  3. * *
  4. * This program is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This program is distributed in the hope that it will be useful, *
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  12. * GNU General Public License for more details. *
  13. * *
  14. * You should have received a copy of the GNU General Public License *
  15. * along with this program; if not, write to the *
  16. * Free Software Foundation, Inc., *
  17. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  18. ***************************************************************************/
  19. #ifdef HAVE_CONFIG_H
  20. #include "config.h"
  21. #endif
  22. #include "arm11.h"
  23. #include "jtag.h"
  24. #include "log.h"
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #if 0
  28. #define _DEBUG_INSTRUCTION_EXECUTION_
  29. #endif
  30. #if 0
  31. #define FNC_INFO LOG_DEBUG("-")
  32. #else
  33. #define FNC_INFO
  34. #endif
  35. #if 1
  36. #define FNC_INFO_NOTIMPLEMENTED do { LOG_DEBUG("NOT IMPLEMENTED"); /*exit(-1);*/ } while (0)
  37. #else
  38. #define FNC_INFO_NOTIMPLEMENTED
  39. #endif
  40. static void arm11_on_enter_debug_state(arm11_common_t * arm11);
  41. bool arm11_config_memwrite_burst = true;
  42. bool arm11_config_memwrite_error_fatal = true;
  43. u32 arm11_vcr = 0;
  44. #define ARM11_HANDLER(x) \
  45. .x = arm11_##x
  46. target_type_t arm11_target =
  47. {
  48. .name = "arm11",
  49. ARM11_HANDLER(poll),
  50. ARM11_HANDLER(arch_state),
  51. ARM11_HANDLER(target_request_data),
  52. ARM11_HANDLER(halt),
  53. ARM11_HANDLER(resume),
  54. ARM11_HANDLER(step),
  55. ARM11_HANDLER(assert_reset),
  56. ARM11_HANDLER(deassert_reset),
  57. ARM11_HANDLER(soft_reset_halt),
  58. ARM11_HANDLER(get_gdb_reg_list),
  59. ARM11_HANDLER(read_memory),
  60. ARM11_HANDLER(write_memory),
  61. ARM11_HANDLER(bulk_write_memory),
  62. ARM11_HANDLER(checksum_memory),
  63. ARM11_HANDLER(add_breakpoint),
  64. ARM11_HANDLER(remove_breakpoint),
  65. ARM11_HANDLER(add_watchpoint),
  66. ARM11_HANDLER(remove_watchpoint),
  67. ARM11_HANDLER(run_algorithm),
  68. ARM11_HANDLER(register_commands),
  69. ARM11_HANDLER(target_command),
  70. ARM11_HANDLER(init_target),
  71. ARM11_HANDLER(examine),
  72. ARM11_HANDLER(quit),
  73. };
  74. int arm11_regs_arch_type = -1;
  75. enum arm11_regtype
  76. {
  77. ARM11_REGISTER_CORE,
  78. ARM11_REGISTER_CPSR,
  79. ARM11_REGISTER_FX,
  80. ARM11_REGISTER_FPS,
  81. ARM11_REGISTER_FIQ,
  82. ARM11_REGISTER_SVC,
  83. ARM11_REGISTER_ABT,
  84. ARM11_REGISTER_IRQ,
  85. ARM11_REGISTER_UND,
  86. ARM11_REGISTER_MON,
  87. ARM11_REGISTER_SPSR_FIQ,
  88. ARM11_REGISTER_SPSR_SVC,
  89. ARM11_REGISTER_SPSR_ABT,
  90. ARM11_REGISTER_SPSR_IRQ,
  91. ARM11_REGISTER_SPSR_UND,
  92. ARM11_REGISTER_SPSR_MON,
  93. /* debug regs */
  94. ARM11_REGISTER_DSCR,
  95. ARM11_REGISTER_WDTR,
  96. ARM11_REGISTER_RDTR,
  97. };
  98. typedef struct arm11_reg_defs_s
  99. {
  100. char * name;
  101. u32 num;
  102. int gdb_num;
  103. enum arm11_regtype type;
  104. } arm11_reg_defs_t;
  105. /* update arm11_regcache_ids when changing this */
  106. static const arm11_reg_defs_t arm11_reg_defs[] =
  107. {
  108. {"r0", 0, 0, ARM11_REGISTER_CORE},
  109. {"r1", 1, 1, ARM11_REGISTER_CORE},
  110. {"r2", 2, 2, ARM11_REGISTER_CORE},
  111. {"r3", 3, 3, ARM11_REGISTER_CORE},
  112. {"r4", 4, 4, ARM11_REGISTER_CORE},
  113. {"r5", 5, 5, ARM11_REGISTER_CORE},
  114. {"r6", 6, 6, ARM11_REGISTER_CORE},
  115. {"r7", 7, 7, ARM11_REGISTER_CORE},
  116. {"r8", 8, 8, ARM11_REGISTER_CORE},
  117. {"r9", 9, 9, ARM11_REGISTER_CORE},
  118. {"r10", 10, 10, ARM11_REGISTER_CORE},
  119. {"r11", 11, 11, ARM11_REGISTER_CORE},
  120. {"r12", 12, 12, ARM11_REGISTER_CORE},
  121. {"sp", 13, 13, ARM11_REGISTER_CORE},
  122. {"lr", 14, 14, ARM11_REGISTER_CORE},
  123. {"pc", 15, 15, ARM11_REGISTER_CORE},
  124. #if ARM11_REGCACHE_FREGS
  125. {"f0", 0, 16, ARM11_REGISTER_FX},
  126. {"f1", 1, 17, ARM11_REGISTER_FX},
  127. {"f2", 2, 18, ARM11_REGISTER_FX},
  128. {"f3", 3, 19, ARM11_REGISTER_FX},
  129. {"f4", 4, 20, ARM11_REGISTER_FX},
  130. {"f5", 5, 21, ARM11_REGISTER_FX},
  131. {"f6", 6, 22, ARM11_REGISTER_FX},
  132. {"f7", 7, 23, ARM11_REGISTER_FX},
  133. {"fps", 0, 24, ARM11_REGISTER_FPS},
  134. #endif
  135. {"cpsr", 0, 25, ARM11_REGISTER_CPSR},
  136. #if ARM11_REGCACHE_MODEREGS
  137. {"r8_fiq", 8, -1, ARM11_REGISTER_FIQ},
  138. {"r9_fiq", 9, -1, ARM11_REGISTER_FIQ},
  139. {"r10_fiq", 10, -1, ARM11_REGISTER_FIQ},
  140. {"r11_fiq", 11, -1, ARM11_REGISTER_FIQ},
  141. {"r12_fiq", 12, -1, ARM11_REGISTER_FIQ},
  142. {"r13_fiq", 13, -1, ARM11_REGISTER_FIQ},
  143. {"r14_fiq", 14, -1, ARM11_REGISTER_FIQ},
  144. {"spsr_fiq", 0, -1, ARM11_REGISTER_SPSR_FIQ},
  145. {"r13_svc", 13, -1, ARM11_REGISTER_SVC},
  146. {"r14_svc", 14, -1, ARM11_REGISTER_SVC},
  147. {"spsr_svc", 0, -1, ARM11_REGISTER_SPSR_SVC},
  148. {"r13_abt", 13, -1, ARM11_REGISTER_ABT},
  149. {"r14_abt", 14, -1, ARM11_REGISTER_ABT},
  150. {"spsr_abt", 0, -1, ARM11_REGISTER_SPSR_ABT},
  151. {"r13_irq", 13, -1, ARM11_REGISTER_IRQ},
  152. {"r14_irq", 14, -1, ARM11_REGISTER_IRQ},
  153. {"spsr_irq", 0, -1, ARM11_REGISTER_SPSR_IRQ},
  154. {"r13_und", 13, -1, ARM11_REGISTER_UND},
  155. {"r14_und", 14, -1, ARM11_REGISTER_UND},
  156. {"spsr_und", 0, -1, ARM11_REGISTER_SPSR_UND},
  157. /* ARM1176 only */
  158. {"r13_mon", 13, -1, ARM11_REGISTER_MON},
  159. {"r14_mon", 14, -1, ARM11_REGISTER_MON},
  160. {"spsr_mon", 0, -1, ARM11_REGISTER_SPSR_MON},
  161. #endif
  162. /* Debug Registers */
  163. {"dscr", 0, -1, ARM11_REGISTER_DSCR},
  164. {"wdtr", 0, -1, ARM11_REGISTER_WDTR},
  165. {"rdtr", 0, -1, ARM11_REGISTER_RDTR},
  166. };
  167. enum arm11_regcache_ids
  168. {
  169. ARM11_RC_R0,
  170. ARM11_RC_RX = ARM11_RC_R0,
  171. ARM11_RC_R1,
  172. ARM11_RC_R2,
  173. ARM11_RC_R3,
  174. ARM11_RC_R4,
  175. ARM11_RC_R5,
  176. ARM11_RC_R6,
  177. ARM11_RC_R7,
  178. ARM11_RC_R8,
  179. ARM11_RC_R9,
  180. ARM11_RC_R10,
  181. ARM11_RC_R11,
  182. ARM11_RC_R12,
  183. ARM11_RC_R13,
  184. ARM11_RC_SP = ARM11_RC_R13,
  185. ARM11_RC_R14,
  186. ARM11_RC_LR = ARM11_RC_R14,
  187. ARM11_RC_R15,
  188. ARM11_RC_PC = ARM11_RC_R15,
  189. #if ARM11_REGCACHE_FREGS
  190. ARM11_RC_F0,
  191. ARM11_RC_FX = ARM11_RC_F0,
  192. ARM11_RC_F1,
  193. ARM11_RC_F2,
  194. ARM11_RC_F3,
  195. ARM11_RC_F4,
  196. ARM11_RC_F5,
  197. ARM11_RC_F6,
  198. ARM11_RC_F7,
  199. ARM11_RC_FPS,
  200. #endif
  201. ARM11_RC_CPSR,
  202. #if ARM11_REGCACHE_MODEREGS
  203. ARM11_RC_R8_FIQ,
  204. ARM11_RC_R9_FIQ,
  205. ARM11_RC_R10_FIQ,
  206. ARM11_RC_R11_FIQ,
  207. ARM11_RC_R12_FIQ,
  208. ARM11_RC_R13_FIQ,
  209. ARM11_RC_R14_FIQ,
  210. ARM11_RC_SPSR_FIQ,
  211. ARM11_RC_R13_SVC,
  212. ARM11_RC_R14_SVC,
  213. ARM11_RC_SPSR_SVC,
  214. ARM11_RC_R13_ABT,
  215. ARM11_RC_R14_ABT,
  216. ARM11_RC_SPSR_ABT,
  217. ARM11_RC_R13_IRQ,
  218. ARM11_RC_R14_IRQ,
  219. ARM11_RC_SPSR_IRQ,
  220. ARM11_RC_R13_UND,
  221. ARM11_RC_R14_UND,
  222. ARM11_RC_SPSR_UND,
  223. ARM11_RC_R13_MON,
  224. ARM11_RC_R14_MON,
  225. ARM11_RC_SPSR_MON,
  226. #endif
  227. ARM11_RC_DSCR,
  228. ARM11_RC_WDTR,
  229. ARM11_RC_RDTR,
  230. ARM11_RC_MAX,
  231. };
  232. #define ARM11_GDB_REGISTER_COUNT 26
  233. u8 arm11_gdb_dummy_fp_value[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  234. reg_t arm11_gdb_dummy_fp_reg =
  235. {
  236. "GDB dummy floating-point register", arm11_gdb_dummy_fp_value, 0, 1, 96, NULL, 0, NULL, 0
  237. };
  238. u8 arm11_gdb_dummy_fps_value[] = {0, 0, 0, 0};
  239. reg_t arm11_gdb_dummy_fps_reg =
  240. {
  241. "GDB dummy floating-point status register", arm11_gdb_dummy_fps_value, 0, 1, 32, NULL, 0, NULL, 0
  242. };
  243. /** Check and if necessary take control of the system
  244. *
  245. * \param arm11 Target state variable.
  246. * \param dscr If the current DSCR content is
  247. * available a pointer to a word holding the
  248. * DSCR can be passed. Otherwise use NULL.
  249. */
  250. void arm11_check_init(arm11_common_t * arm11, u32 * dscr)
  251. {
  252. FNC_INFO;
  253. u32 dscr_local_tmp_copy;
  254. if (!dscr)
  255. {
  256. dscr = &dscr_local_tmp_copy;
  257. *dscr = arm11_read_DSCR(arm11);
  258. }
  259. if (!(*dscr & ARM11_DSCR_MODE_SELECT))
  260. {
  261. LOG_DEBUG("Bringing target into debug mode");
  262. *dscr |= ARM11_DSCR_MODE_SELECT; /* Halt debug-mode */
  263. arm11_write_DSCR(arm11, *dscr);
  264. /* add further reset initialization here */
  265. arm11->simulate_reset_on_next_halt = true;
  266. if (*dscr & ARM11_DSCR_CORE_HALTED)
  267. {
  268. /** \todo TODO: this needs further scrutiny because
  269. * arm11_on_enter_debug_state() never gets properly called
  270. */
  271. arm11->target->state = TARGET_HALTED;
  272. arm11->target->debug_reason = arm11_get_DSCR_debug_reason(*dscr);
  273. }
  274. else
  275. {
  276. arm11->target->state = TARGET_RUNNING;
  277. arm11->target->debug_reason = DBG_REASON_NOTHALTED;
  278. }
  279. arm11_sc7_clear_vbw(arm11);
  280. }
  281. }
  282. #define R(x) \
  283. (arm11->reg_values[ARM11_RC_##x])
  284. /** Save processor state.
  285. *
  286. * This is called when the HALT instruction has succeeded
  287. * or on other occasions that stop the processor.
  288. *
  289. */
  290. static void arm11_on_enter_debug_state(arm11_common_t * arm11)
  291. {
  292. FNC_INFO;
  293. {size_t i;
  294. for(i = 0; i < asizeof(arm11->reg_values); i++)
  295. {
  296. arm11->reg_list[i].valid = 1;
  297. arm11->reg_list[i].dirty = 0;
  298. }}
  299. /* Save DSCR */
  300. R(DSCR) = arm11_read_DSCR(arm11);
  301. /* Save wDTR */
  302. if (R(DSCR) & ARM11_DSCR_WDTR_FULL)
  303. {
  304. arm11_add_debug_SCAN_N(arm11, 0x05, -1);
  305. arm11_add_IR(arm11, ARM11_INTEST, -1);
  306. scan_field_t chain5_fields[3];
  307. arm11_setup_field(arm11, 32, NULL, &R(WDTR), chain5_fields + 0);
  308. arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 1);
  309. arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 2);
  310. arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_PD);
  311. }
  312. else
  313. {
  314. arm11->reg_list[ARM11_RC_WDTR].valid = 0;
  315. }
  316. /* DSCR: set ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE */
  317. /* ARM1176 spec says this is needed only for wDTR/rDTR's "ITR mode", but not to issue ITRs
  318. ARM1136 seems to require this to issue ITR's as well */
  319. u32 new_dscr = R(DSCR) | ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE;
  320. /* this executes JTAG queue: */
  321. arm11_write_DSCR(arm11, new_dscr);
  322. /* From the spec:
  323. Before executing any instruction in debug state you have to drain the write buffer.
  324. This ensures that no imprecise Data Aborts can return at a later point:*/
  325. /** \todo TODO: Test drain write buffer. */
  326. #if 0
  327. while (1)
  328. {
  329. /* MRC p14,0,R0,c5,c10,0 */
  330. // arm11_run_instr_no_data1(arm11, /*0xee150e1a*/0xe320f000);
  331. /* mcr 15, 0, r0, cr7, cr10, {4} */
  332. arm11_run_instr_no_data1(arm11, 0xee070f9a);
  333. u32 dscr = arm11_read_DSCR(arm11);
  334. LOG_DEBUG("DRAIN, DSCR %08x", dscr);
  335. if (dscr & ARM11_DSCR_STICKY_IMPRECISE_DATA_ABORT)
  336. {
  337. arm11_run_instr_no_data1(arm11, 0xe320f000);
  338. dscr = arm11_read_DSCR(arm11);
  339. LOG_DEBUG("DRAIN, DSCR %08x (DONE)", dscr);
  340. break;
  341. }
  342. }
  343. #endif
  344. arm11_run_instr_data_prepare(arm11);
  345. /* save r0 - r14 */
  346. /** \todo TODO: handle other mode registers */
  347. {size_t i;
  348. for (i = 0; i < 15; i++)
  349. {
  350. /* MCR p14,0,R?,c0,c5,0 */
  351. arm11_run_instr_data_from_core(arm11, 0xEE000E15 | (i << 12), &R(RX + i), 1);
  352. }}
  353. /* save rDTR */
  354. /* check rDTRfull in DSCR */
  355. if (R(DSCR) & ARM11_DSCR_RDTR_FULL)
  356. {
  357. /* MRC p14,0,R0,c0,c5,0 (move rDTR -> r0 (-> wDTR -> local var)) */
  358. arm11_run_instr_data_from_core_via_r0(arm11, 0xEE100E15, &R(RDTR));
  359. }
  360. else
  361. {
  362. arm11->reg_list[ARM11_RC_RDTR].valid = 0;
  363. }
  364. /* save CPSR */
  365. /* MRS r0,CPSR (move CPSR -> r0 (-> wDTR -> local var)) */
  366. arm11_run_instr_data_from_core_via_r0(arm11, 0xE10F0000, &R(CPSR));
  367. /* save PC */
  368. /* MOV R0,PC (move PC -> r0 (-> wDTR -> local var)) */
  369. arm11_run_instr_data_from_core_via_r0(arm11, 0xE1A0000F, &R(PC));
  370. /* adjust PC depending on ARM state */
  371. if (R(CPSR) & ARM11_CPSR_J) /* Java state */
  372. {
  373. arm11->reg_values[ARM11_RC_PC] -= 0;
  374. }
  375. else if (R(CPSR) & ARM11_CPSR_T) /* Thumb state */
  376. {
  377. arm11->reg_values[ARM11_RC_PC] -= 4;
  378. }
  379. else /* ARM state */
  380. {
  381. arm11->reg_values[ARM11_RC_PC] -= 8;
  382. }
  383. if (arm11->simulate_reset_on_next_halt)
  384. {
  385. arm11->simulate_reset_on_next_halt = false;
  386. LOG_DEBUG("Reset c1 Control Register");
  387. /* Write 0 (reset value) to Control register 0 to disable MMU/Cache etc. */
  388. /* MCR p15,0,R0,c1,c0,0 */
  389. arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, 0);
  390. }
  391. arm11_run_instr_data_finish(arm11);
  392. arm11_dump_reg_changes(arm11);
  393. }
  394. void arm11_dump_reg_changes(arm11_common_t * arm11)
  395. {
  396. {size_t i;
  397. for(i = 0; i < ARM11_REGCACHE_COUNT; i++)
  398. {
  399. if (!arm11->reg_list[i].valid)
  400. {
  401. if (arm11->reg_history[i].valid)
  402. LOG_INFO("%8s INVALID (%08x)", arm11_reg_defs[i].name, arm11->reg_history[i].value);
  403. }
  404. else
  405. {
  406. if (arm11->reg_history[i].valid)
  407. {
  408. if (arm11->reg_history[i].value != arm11->reg_values[i])
  409. LOG_INFO("%8s %08x (%08x)", arm11_reg_defs[i].name, arm11->reg_values[i], arm11->reg_history[i].value);
  410. }
  411. else
  412. {
  413. LOG_INFO("%8s %08x (INVALID)", arm11_reg_defs[i].name, arm11->reg_values[i]);
  414. }
  415. }
  416. }}
  417. }
  418. /** Restore processor state
  419. *
  420. * This is called in preparation for the RESTART function.
  421. *
  422. */
  423. void arm11_leave_debug_state(arm11_common_t * arm11)
  424. {
  425. FNC_INFO;
  426. arm11_run_instr_data_prepare(arm11);
  427. /** \todo TODO: handle other mode registers */
  428. /* restore R1 - R14 */
  429. {size_t i;
  430. for (i = 1; i < 15; i++)
  431. {
  432. if (!arm11->reg_list[ARM11_RC_RX + i].dirty)
  433. continue;
  434. /* MRC p14,0,r?,c0,c5,0 */
  435. arm11_run_instr_data_to_core1(arm11, 0xee100e15 | (i << 12), R(RX + i));
  436. // LOG_DEBUG("RESTORE R" ZU " %08x", i, R(RX + i));
  437. }}
  438. arm11_run_instr_data_finish(arm11);
  439. /* spec says clear wDTR and rDTR; we assume they are clear as
  440. otherwise our programming would be sloppy */
  441. {
  442. u32 DSCR = arm11_read_DSCR(arm11);
  443. if (DSCR & (ARM11_DSCR_RDTR_FULL | ARM11_DSCR_WDTR_FULL))
  444. {
  445. LOG_ERROR("wDTR/rDTR inconsistent (DSCR %08x)", DSCR);
  446. }
  447. }
  448. arm11_run_instr_data_prepare(arm11);
  449. /* restore original wDTR */
  450. if ((R(DSCR) & ARM11_DSCR_WDTR_FULL) || arm11->reg_list[ARM11_RC_WDTR].dirty)
  451. {
  452. /* MCR p14,0,R0,c0,c5,0 */
  453. arm11_run_instr_data_to_core_via_r0(arm11, 0xee000e15, R(WDTR));
  454. }
  455. /* restore CPSR */
  456. /* MSR CPSR,R0*/
  457. arm11_run_instr_data_to_core_via_r0(arm11, 0xe129f000, R(CPSR));
  458. /* restore PC */
  459. /* MOV PC,R0 */
  460. arm11_run_instr_data_to_core_via_r0(arm11, 0xe1a0f000, R(PC));
  461. /* restore R0 */
  462. /* MRC p14,0,r0,c0,c5,0 */
  463. arm11_run_instr_data_to_core1(arm11, 0xee100e15, R(R0));
  464. arm11_run_instr_data_finish(arm11);
  465. /* restore DSCR */
  466. arm11_write_DSCR(arm11, R(DSCR));
  467. /* restore rDTR */
  468. if (R(DSCR) & ARM11_DSCR_RDTR_FULL || arm11->reg_list[ARM11_RC_RDTR].dirty)
  469. {
  470. arm11_add_debug_SCAN_N(arm11, 0x05, -1);
  471. arm11_add_IR(arm11, ARM11_EXTEST, -1);
  472. scan_field_t chain5_fields[3];
  473. u8 Ready = 0; /* ignored */
  474. u8 Valid = 0; /* ignored */
  475. arm11_setup_field(arm11, 32, &R(RDTR), NULL, chain5_fields + 0);
  476. arm11_setup_field(arm11, 1, &Ready, NULL, chain5_fields + 1);
  477. arm11_setup_field(arm11, 1, &Valid, NULL, chain5_fields + 2);
  478. arm11_add_dr_scan_vc(asizeof(chain5_fields), chain5_fields, TAP_PD);
  479. }
  480. arm11_record_register_history(arm11);
  481. }
  482. void arm11_record_register_history(arm11_common_t * arm11)
  483. {
  484. {size_t i;
  485. for(i = 0; i < ARM11_REGCACHE_COUNT; i++)
  486. {
  487. arm11->reg_history[i].value = arm11->reg_values[i];
  488. arm11->reg_history[i].valid = arm11->reg_list[i].valid;
  489. arm11->reg_list[i].valid = 0;
  490. arm11->reg_list[i].dirty = 0;
  491. }}
  492. }
  493. /* poll current target status */
  494. int arm11_poll(struct target_s *target)
  495. {
  496. FNC_INFO;
  497. arm11_common_t * arm11 = target->arch_info;
  498. if (arm11->trst_active)
  499. return ERROR_OK;
  500. u32 dscr = arm11_read_DSCR(arm11);
  501. LOG_DEBUG("DSCR %08x", dscr);
  502. arm11_check_init(arm11, &dscr);
  503. if (dscr & ARM11_DSCR_CORE_HALTED)
  504. {
  505. if (target->state != TARGET_HALTED)
  506. {
  507. enum target_state old_state = target->state;
  508. LOG_DEBUG("enter TARGET_HALTED");
  509. target->state = TARGET_HALTED;
  510. target->debug_reason = arm11_get_DSCR_debug_reason(dscr);
  511. arm11_on_enter_debug_state(arm11);
  512. target_call_event_callbacks(target,
  513. old_state == TARGET_DEBUG_RUNNING ? TARGET_EVENT_DEBUG_HALTED : TARGET_EVENT_HALTED);
  514. }
  515. }
  516. else
  517. {
  518. if (target->state != TARGET_RUNNING && target->state != TARGET_DEBUG_RUNNING)
  519. {
  520. LOG_DEBUG("enter TARGET_RUNNING");
  521. target->state = TARGET_RUNNING;
  522. target->debug_reason = DBG_REASON_NOTHALTED;
  523. }
  524. }
  525. return ERROR_OK;
  526. }
  527. /* architecture specific status reply */
  528. int arm11_arch_state(struct target_s *target)
  529. {
  530. FNC_INFO_NOTIMPLEMENTED;
  531. return ERROR_OK;
  532. }
  533. /* target request support */
  534. int arm11_target_request_data(struct target_s *target, u32 size, u8 *buffer)
  535. {
  536. FNC_INFO_NOTIMPLEMENTED;
  537. return ERROR_OK;
  538. }
  539. /* target execution control */
  540. int arm11_halt(struct target_s *target)
  541. {
  542. FNC_INFO;
  543. arm11_common_t * arm11 = target->arch_info;
  544. LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
  545. if (target->state == TARGET_UNKNOWN)
  546. {
  547. arm11->simulate_reset_on_next_halt = true;
  548. }
  549. if (target->state == TARGET_HALTED)
  550. {
  551. LOG_DEBUG("target was already halted");
  552. return ERROR_OK;
  553. }
  554. if (arm11->trst_active)
  555. {
  556. arm11->halt_requested = true;
  557. return ERROR_OK;
  558. }
  559. arm11_add_IR(arm11, ARM11_HALT, TAP_RTI);
  560. jtag_execute_queue();
  561. u32 dscr;
  562. while (1)
  563. {
  564. dscr = arm11_read_DSCR(arm11);
  565. if (dscr & ARM11_DSCR_CORE_HALTED)
  566. break;
  567. }
  568. arm11_on_enter_debug_state(arm11);
  569. enum target_state old_state = target->state;
  570. target->state = TARGET_HALTED;
  571. target->debug_reason = arm11_get_DSCR_debug_reason(dscr);
  572. target_call_event_callbacks(target,
  573. old_state == TARGET_DEBUG_RUNNING ? TARGET_EVENT_DEBUG_HALTED : TARGET_EVENT_HALTED);
  574. return ERROR_OK;
  575. }
  576. int arm11_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution)
  577. {
  578. FNC_INFO;
  579. // LOG_DEBUG("current %d address %08x handle_breakpoints %d debug_execution %d",
  580. // current, address, handle_breakpoints, debug_execution);
  581. arm11_common_t * arm11 = target->arch_info;
  582. LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
  583. if (target->state != TARGET_HALTED)
  584. {
  585. LOG_ERROR("Target not halted");
  586. return ERROR_TARGET_NOT_HALTED;
  587. }
  588. if (!current)
  589. R(PC) = address;
  590. LOG_INFO("RESUME PC %08x%s", R(PC), !current ? "!" : "");
  591. /* clear breakpoints/watchpoints and VCR*/
  592. arm11_sc7_clear_vbw(arm11);
  593. /* Set up breakpoints */
  594. if (!debug_execution)
  595. {
  596. /* check if one matches PC and step over it if necessary */
  597. breakpoint_t * bp;
  598. for (bp = target->breakpoints; bp; bp = bp->next)
  599. {
  600. if (bp->address == R(PC))
  601. {
  602. LOG_DEBUG("must step over %08x", bp->address);
  603. arm11_step(target, 1, 0, 0);
  604. break;
  605. }
  606. }
  607. /* set all breakpoints */
  608. size_t brp_num = 0;
  609. for (bp = target->breakpoints; bp; bp = bp->next)
  610. {
  611. arm11_sc7_action_t brp[2];
  612. brp[0].write = 1;
  613. brp[0].address = ARM11_SC7_BVR0 + brp_num;
  614. brp[0].value = bp->address;
  615. brp[1].write = 1;
  616. brp[1].address = ARM11_SC7_BCR0 + brp_num;
  617. brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
  618. arm11_sc7_run(arm11, brp, asizeof(brp));
  619. LOG_DEBUG("Add BP " ZU " at %08x", brp_num, bp->address);
  620. brp_num++;
  621. }
  622. arm11_sc7_set_vcr(arm11, arm11_vcr);
  623. }
  624. arm11_leave_debug_state(arm11);
  625. arm11_add_IR(arm11, ARM11_RESTART, TAP_RTI);
  626. jtag_execute_queue();
  627. while (1)
  628. {
  629. u32 dscr = arm11_read_DSCR(arm11);
  630. LOG_DEBUG("DSCR %08x", dscr);
  631. if (dscr & ARM11_DSCR_CORE_RESTARTED)
  632. break;
  633. }
  634. if (!debug_execution)
  635. {
  636. target->state = TARGET_RUNNING;
  637. target->debug_reason = DBG_REASON_NOTHALTED;
  638. target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
  639. }
  640. else
  641. {
  642. target->state = TARGET_DEBUG_RUNNING;
  643. target->debug_reason = DBG_REASON_NOTHALTED;
  644. target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
  645. }
  646. return ERROR_OK;
  647. }
  648. int arm11_step(struct target_s *target, int current, u32 address, int handle_breakpoints)
  649. {
  650. FNC_INFO;
  651. LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
  652. if (target->state != TARGET_HALTED)
  653. {
  654. LOG_WARNING("target was not halted");
  655. return ERROR_TARGET_NOT_HALTED;
  656. }
  657. arm11_common_t * arm11 = target->arch_info;
  658. if (!current)
  659. R(PC) = address;
  660. LOG_INFO("STEP PC %08x%s", R(PC), !current ? "!" : "");
  661. /** \todo TODO: Thumb not supported here */
  662. u32 next_instruction;
  663. arm11_read_memory_word(arm11, R(PC), &next_instruction);
  664. /* skip over BKPT */
  665. if ((next_instruction & 0xFFF00070) == 0xe1200070)
  666. {
  667. R(PC) += 4;
  668. arm11->reg_list[ARM11_RC_PC].valid = 1;
  669. arm11->reg_list[ARM11_RC_PC].dirty = 0;
  670. LOG_INFO("Skipping BKPT");
  671. }
  672. /* skip over Wait for interrupt / Standby */
  673. /* mcr 15, 0, r?, cr7, cr0, {4} */
  674. else if ((next_instruction & 0xFFFF0FFF) == 0xee070f90)
  675. {
  676. R(PC) += 4;
  677. arm11->reg_list[ARM11_RC_PC].valid = 1;
  678. arm11->reg_list[ARM11_RC_PC].dirty = 0;
  679. LOG_INFO("Skipping WFI");
  680. }
  681. /* ignore B to self */
  682. else if ((next_instruction & 0xFEFFFFFF) == 0xeafffffe)
  683. {
  684. LOG_INFO("Not stepping jump to self");
  685. }
  686. else
  687. {
  688. /** \todo TODO: check if break-/watchpoints make any sense at all in combination
  689. * with this. */
  690. /** \todo TODO: check if disabling IRQs might be a good idea here. Alternatively
  691. * the VCR might be something worth looking into. */
  692. /* Set up breakpoint for stepping */
  693. arm11_sc7_action_t brp[2];
  694. brp[0].write = 1;
  695. brp[0].address = ARM11_SC7_BVR0;
  696. brp[0].value = R(PC);
  697. brp[1].write = 1;
  698. brp[1].address = ARM11_SC7_BCR0;
  699. brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (2 << 21);
  700. arm11_sc7_run(arm11, brp, asizeof(brp));
  701. /* resume */
  702. arm11_leave_debug_state(arm11);
  703. arm11_add_IR(arm11, ARM11_RESTART, TAP_RTI);
  704. jtag_execute_queue();
  705. /** \todo TODO: add a timeout */
  706. /* wait for halt */
  707. while (1)
  708. {
  709. u32 dscr = arm11_read_DSCR(arm11);
  710. LOG_DEBUG("DSCR %08x", dscr);
  711. if ((dscr & (ARM11_DSCR_CORE_RESTARTED | ARM11_DSCR_CORE_HALTED)) ==
  712. (ARM11_DSCR_CORE_RESTARTED | ARM11_DSCR_CORE_HALTED))
  713. break;
  714. }
  715. /* clear breakpoint */
  716. arm11_sc7_clear_vbw(arm11);
  717. /* save state */
  718. arm11_on_enter_debug_state(arm11);
  719. }
  720. // target->state = TARGET_HALTED;
  721. target->debug_reason = DBG_REASON_SINGLESTEP;
  722. target_call_event_callbacks(target, TARGET_EVENT_HALTED);
  723. return ERROR_OK;
  724. }
  725. /* target reset control */
  726. int arm11_assert_reset(struct target_s *target)
  727. {
  728. FNC_INFO;
  729. #if 0
  730. /* assert reset lines */
  731. /* resets only the DBGTAP, not the ARM */
  732. jtag_add_reset(1, 0);
  733. jtag_add_sleep(5000);
  734. arm11_common_t * arm11 = target->arch_info;
  735. arm11->trst_active = true;
  736. #endif
  737. if (target->reset_halt)
  738. {
  739. int retval;
  740. if ((retval = target_halt(target))!=ERROR_OK)
  741. return retval;
  742. }
  743. return ERROR_OK;
  744. }
  745. int arm11_deassert_reset(struct target_s *target)
  746. {
  747. FNC_INFO;
  748. #if 0
  749. LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
  750. /* deassert reset lines */
  751. jtag_add_reset(0, 0);
  752. arm11_common_t * arm11 = target->arch_info;
  753. arm11->trst_active = false;
  754. if (arm11->halt_requested)
  755. return arm11_halt(target);
  756. #endif
  757. return ERROR_OK;
  758. }
  759. int arm11_soft_reset_halt(struct target_s *target)
  760. {
  761. FNC_INFO_NOTIMPLEMENTED;
  762. return ERROR_OK;
  763. }
  764. /* target register access for gdb */
  765. int arm11_get_gdb_reg_list(struct target_s *target, struct reg_s **reg_list[], int *reg_list_size)
  766. {
  767. FNC_INFO;
  768. arm11_common_t * arm11 = target->arch_info;
  769. *reg_list_size = ARM11_GDB_REGISTER_COUNT;
  770. *reg_list = malloc(sizeof(reg_t*) * ARM11_GDB_REGISTER_COUNT);
  771. {size_t i;
  772. for (i = 16; i < 24; i++)
  773. {
  774. (*reg_list)[i] = &arm11_gdb_dummy_fp_reg;
  775. }}
  776. (*reg_list)[24] = &arm11_gdb_dummy_fps_reg;
  777. {size_t i;
  778. for (i = 0; i < ARM11_REGCACHE_COUNT; i++)
  779. {
  780. if (arm11_reg_defs[i].gdb_num == -1)
  781. continue;
  782. (*reg_list)[arm11_reg_defs[i].gdb_num] = arm11->reg_list + i;
  783. }}
  784. return ERROR_OK;
  785. }
  786. /* target memory access
  787. * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
  788. * count: number of items of <size>
  789. */
  790. int arm11_read_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
  791. {
  792. /** \todo TODO: check if buffer cast to u32* and u16* might cause alignment problems */
  793. FNC_INFO;
  794. if (target->state != TARGET_HALTED)
  795. {
  796. LOG_WARNING("target was not halted");
  797. return ERROR_TARGET_NOT_HALTED;
  798. }
  799. LOG_DEBUG("ADDR %08x SIZE %08x COUNT %08x", address, size, count);
  800. arm11_common_t * arm11 = target->arch_info;
  801. arm11_run_instr_data_prepare(arm11);
  802. /* MRC p14,0,r0,c0,c5,0 */
  803. arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
  804. switch (size)
  805. {
  806. case 1:
  807. /** \todo TODO: check if dirty is the right choice to force a rewrite on arm11_resume() */
  808. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  809. {size_t i;
  810. for (i = 0; i < count; i++)
  811. {
  812. /* ldrb r1, [r0], #1 */
  813. arm11_run_instr_no_data1(arm11, 0xe4d01001);
  814. u32 res;
  815. /* MCR p14,0,R1,c0,c5,0 */
  816. arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
  817. *buffer++ = res;
  818. }}
  819. break;
  820. case 2:
  821. {
  822. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  823. u16 * buf16 = (u16*)buffer;
  824. {size_t i;
  825. for (i = 0; i < count; i++)
  826. {
  827. /* ldrh r1, [r0], #2 */
  828. arm11_run_instr_no_data1(arm11, 0xe0d010b2);
  829. u32 res;
  830. /* MCR p14,0,R1,c0,c5,0 */
  831. arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
  832. *buf16++ = res;
  833. }}
  834. break;
  835. }
  836. case 4:
  837. /* LDC p14,c5,[R0],#4 */
  838. arm11_run_instr_data_from_core(arm11, 0xecb05e01, (u32 *)buffer, count);
  839. break;
  840. }
  841. arm11_run_instr_data_finish(arm11);
  842. return ERROR_OK;
  843. }
  844. int arm11_write_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
  845. {
  846. FNC_INFO;
  847. if (target->state != TARGET_HALTED)
  848. {
  849. LOG_WARNING("target was not halted");
  850. return ERROR_TARGET_NOT_HALTED;
  851. }
  852. LOG_DEBUG("ADDR %08x SIZE %08x COUNT %08x", address, size, count);
  853. arm11_common_t * arm11 = target->arch_info;
  854. arm11_run_instr_data_prepare(arm11);
  855. /* MRC p14,0,r0,c0,c5,0 */
  856. arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
  857. switch (size)
  858. {
  859. case 1:
  860. {
  861. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  862. {size_t i;
  863. for (i = 0; i < count; i++)
  864. {
  865. /* MRC p14,0,r1,c0,c5,0 */
  866. arm11_run_instr_data_to_core1(arm11, 0xee101e15, *buffer++);
  867. /* strb r1, [r0], #1 */
  868. arm11_run_instr_no_data1(arm11, 0xe4c01001);
  869. }}
  870. break;
  871. }
  872. case 2:
  873. {
  874. arm11->reg_list[ARM11_RC_R1].dirty = 1;
  875. u16 * buf16 = (u16*)buffer;
  876. {size_t i;
  877. for (i = 0; i < count; i++)
  878. {
  879. /* MRC p14,0,r1,c0,c5,0 */
  880. arm11_run_instr_data_to_core1(arm11, 0xee101e15, *buf16++);
  881. /* strh r1, [r0], #2 */
  882. arm11_run_instr_no_data1(arm11, 0xe0c010b2);
  883. }}
  884. break;
  885. }
  886. case 4:
  887. /** \todo TODO: check if buffer cast to u32* might cause alignment problems */
  888. if (!arm11_config_memwrite_burst)
  889. {
  890. /* STC p14,c5,[R0],#4 */
  891. arm11_run_instr_data_to_core(arm11, 0xeca05e01, (u32 *)buffer, count);
  892. }
  893. else
  894. {
  895. /* STC p14,c5,[R0],#4 */
  896. arm11_run_instr_data_to_core_noack(arm11, 0xeca05e01, (u32 *)buffer, count);
  897. }
  898. break;
  899. }
  900. #if 1
  901. /* r0 verification */
  902. {
  903. u32 r0;
  904. /* MCR p14,0,R0,c0,c5,0 */
  905. arm11_run_instr_data_from_core(arm11, 0xEE000E15, &r0, 1);
  906. if (address + size * count != r0)
  907. {
  908. LOG_ERROR("Data transfer failed. (%d)", (r0 - address) - size * count);
  909. if (arm11_config_memwrite_burst)
  910. LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
  911. if (arm11_config_memwrite_error_fatal)
  912. exit(-1);
  913. }
  914. }
  915. #endif
  916. arm11_run_instr_data_finish(arm11);
  917. return ERROR_OK;
  918. }
  919. /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
  920. int arm11_bulk_write_memory(struct target_s *target, u32 address, u32 count, u8 *buffer)
  921. {
  922. FNC_INFO;
  923. if (target->state != TARGET_HALTED)
  924. {
  925. LOG_WARNING("target was not halted");
  926. return ERROR_TARGET_NOT_HALTED;
  927. }
  928. return arm11_write_memory(target, address, 4, count, buffer);
  929. }
  930. int arm11_checksum_memory(struct target_s *target, u32 address, u32 count, u32* checksum)
  931. {
  932. FNC_INFO_NOTIMPLEMENTED;
  933. return ERROR_OK;
  934. }
  935. /* target break-/watchpoint control
  936. * rw: 0 = write, 1 = read, 2 = access
  937. */
  938. int arm11_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
  939. {
  940. FNC_INFO;
  941. arm11_common_t * arm11 = target->arch_info;
  942. #if 0
  943. if (breakpoint->type == BKPT_SOFT)
  944. {
  945. LOG_INFO("sw breakpoint requested, but software breakpoints not enabled");
  946. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  947. }
  948. #endif
  949. if (!arm11->free_brps)
  950. {
  951. LOG_INFO("no breakpoint unit available for hardware breakpoint");
  952. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  953. }
  954. if (breakpoint->length != 4)
  955. {
  956. LOG_INFO("only breakpoints of four bytes length supported");
  957. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  958. }
  959. arm11->free_brps--;
  960. return ERROR_OK;
  961. }
  962. int arm11_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
  963. {
  964. FNC_INFO;
  965. arm11_common_t * arm11 = target->arch_info;
  966. arm11->free_brps++;
  967. return ERROR_OK;
  968. }
  969. int arm11_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
  970. {
  971. FNC_INFO_NOTIMPLEMENTED;
  972. return ERROR_OK;
  973. }
  974. int arm11_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
  975. {
  976. FNC_INFO_NOTIMPLEMENTED;
  977. return ERROR_OK;
  978. }
  979. /* target algorithm support */
  980. int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info)
  981. {
  982. FNC_INFO_NOTIMPLEMENTED;
  983. return ERROR_OK;
  984. }
  985. int arm11_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
  986. {
  987. FNC_INFO;
  988. if (argc < 4)
  989. {
  990. LOG_ERROR("'target arm11' 4th argument <jtag chain pos>");
  991. exit(-1);
  992. }
  993. int chain_pos = strtoul(args[3], NULL, 0);
  994. NEW(arm11_common_t, arm11, 1);
  995. arm11->target = target;
  996. /* prepare JTAG information for the new target */
  997. arm11->jtag_info.chain_pos = chain_pos;
  998. arm11->jtag_info.scann_size = 5;
  999. arm_jtag_setup_connection(&arm11->jtag_info);
  1000. jtag_device_t *device = jtag_get_device(chain_pos);
  1001. if (device->ir_length != 5)
  1002. {
  1003. LOG_ERROR("'target arm11' expects 'jtag_device 5 0x01 0x1F 0x1E'");
  1004. exit(-1);
  1005. }
  1006. target->arch_info = arm11;
  1007. return ERROR_OK;
  1008. }
  1009. int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
  1010. {
  1011. /* Initialize anything we can set up without talking to the target */
  1012. return ERROR_OK;
  1013. }
  1014. /* talk to the target and set things up */
  1015. int arm11_examine(struct target_s *target)
  1016. {
  1017. FNC_INFO;
  1018. arm11_common_t * arm11 = target->arch_info;
  1019. /* check IDCODE */
  1020. arm11_add_IR(arm11, ARM11_IDCODE, -1);
  1021. scan_field_t idcode_field;
  1022. arm11_setup_field(arm11, 32, NULL, &arm11->device_id, &idcode_field);
  1023. arm11_add_dr_scan_vc(1, &idcode_field, TAP_PD);
  1024. /* check DIDR */
  1025. arm11_add_debug_SCAN_N(arm11, 0x00, -1);
  1026. arm11_add_IR(arm11, ARM11_INTEST, -1);
  1027. scan_field_t chain0_fields[2];
  1028. arm11_setup_field(arm11, 32, NULL, &arm11->didr, chain0_fields + 0);
  1029. arm11_setup_field(arm11, 8, NULL, &arm11->implementor, chain0_fields + 1);
  1030. arm11_add_dr_scan_vc(asizeof(chain0_fields), chain0_fields, TAP_RTI);
  1031. jtag_execute_queue();
  1032. switch (arm11->device_id & 0x0FFFF000)
  1033. {
  1034. case 0x07B36000: LOG_INFO("found ARM1136"); break;
  1035. case 0x07B56000: LOG_INFO("found ARM1156"); break;
  1036. case 0x07B76000: LOG_INFO("found ARM1176"); break;
  1037. default:
  1038. {
  1039. LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
  1040. exit(-1);
  1041. }
  1042. }
  1043. arm11->debug_version = (arm11->didr >> 16) & 0x0F;
  1044. if (arm11->debug_version != ARM11_DEBUG_V6 &&
  1045. arm11->debug_version != ARM11_DEBUG_V61)
  1046. {
  1047. LOG_ERROR("Only ARMv6 v6 and v6.1 architectures supported.");
  1048. exit(-1);
  1049. }
  1050. arm11->brp = ((arm11->didr >> 24) & 0x0F) + 1;
  1051. arm11->wrp = ((arm11->didr >> 28) & 0x0F) + 1;
  1052. /** \todo TODO: reserve one brp slot if we allow breakpoints during step */
  1053. arm11->free_brps = arm11->brp;
  1054. arm11->free_wrps = arm11->wrp;
  1055. LOG_DEBUG("IDCODE %08x IMPLEMENTOR %02x DIDR %08x",
  1056. arm11->device_id,
  1057. arm11->implementor,
  1058. arm11->didr);
  1059. arm11_build_reg_cache(target);
  1060. /* as a side-effect this reads DSCR and thus
  1061. * clears the ARM11_DSCR_STICKY_PRECISE_DATA_ABORT / Sticky Precise Data Abort Flag
  1062. * as suggested by the spec.
  1063. */
  1064. arm11_check_init(arm11, NULL);
  1065. return ERROR_OK;
  1066. }
  1067. int arm11_quit(void)
  1068. {
  1069. FNC_INFO_NOTIMPLEMENTED;
  1070. return ERROR_OK;
  1071. }
  1072. /** Load a register that is marked !valid in the register cache */
  1073. int arm11_get_reg(reg_t *reg)
  1074. {
  1075. FNC_INFO;
  1076. target_t * target = ((arm11_reg_state_t *)reg->arch_info)->target;
  1077. if (target->state != TARGET_HALTED)
  1078. {
  1079. LOG_WARNING("target was not halted");
  1080. return ERROR_TARGET_NOT_HALTED;
  1081. }
  1082. /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
  1083. #if 0
  1084. arm11_common_t *arm11 = target->arch_info;
  1085. const arm11_reg_defs_t * arm11_reg_info = arm11_reg_defs + ((arm11_reg_state_t *)reg->arch_info)->def_index;
  1086. #endif
  1087. return ERROR_OK;
  1088. }
  1089. /** Change a value in the register cache */
  1090. int arm11_set_reg(reg_t *reg, u8 *buf)
  1091. {
  1092. FNC_INFO;
  1093. target_t * target = ((arm11_reg_state_t *)reg->arch_info)->target;
  1094. arm11_common_t *arm11 = target->arch_info;
  1095. // const arm11_reg_defs_t * arm11_reg_info = arm11_reg_defs + ((arm11_reg_state_t *)reg->arch_info)->def_index;
  1096. arm11->reg_values[((arm11_reg_state_t *)reg->arch_info)->def_index] = buf_get_u32(buf, 0, 32);
  1097. reg->valid = 1;
  1098. reg->dirty = 1;
  1099. return ERROR_OK;
  1100. }
  1101. void arm11_build_reg_cache(target_t *target)
  1102. {
  1103. arm11_common_t *arm11 = target->arch_info;
  1104. NEW(reg_cache_t, cache, 1);
  1105. NEW(reg_t, reg_list, ARM11_REGCACHE_COUNT);
  1106. NEW(arm11_reg_state_t, arm11_reg_states, ARM11_REGCACHE_COUNT);
  1107. if (arm11_regs_arch_type == -1)
  1108. arm11_regs_arch_type = register_reg_arch_type(arm11_get_reg, arm11_set_reg);
  1109. arm11->reg_list = reg_list;
  1110. /* Build the process context cache */
  1111. cache->name = "arm11 registers";
  1112. cache->next = NULL;
  1113. cache->reg_list = reg_list;
  1114. cache->num_regs = ARM11_REGCACHE_COUNT;
  1115. reg_cache_t **cache_p = register_get_last_cache_p(&target->reg_cache);
  1116. (*cache_p) = cache;
  1117. // armv7m->core_cache = cache;
  1118. // armv7m->process_context = cache;
  1119. size_t i;
  1120. /* Not very elegant assertion */
  1121. if (ARM11_REGCACHE_COUNT != asizeof(arm11->reg_values) ||
  1122. ARM11_REGCACHE_COUNT != asizeof(arm11_reg_defs) ||
  1123. ARM11_REGCACHE_COUNT != ARM11_RC_MAX)
  1124. {
  1125. LOG_ERROR("arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
  1126. exit(-1);
  1127. }
  1128. for (i = 0; i < ARM11_REGCACHE_COUNT; i++)
  1129. {
  1130. reg_t * r = reg_list + i;
  1131. const arm11_reg_defs_t * rd = arm11_reg_defs + i;
  1132. arm11_reg_state_t * rs = arm11_reg_states + i;
  1133. r->name = rd->name;
  1134. r->size = 32;
  1135. r->value = (u8 *)(arm11->reg_values + i);
  1136. r->dirty = 0;
  1137. r->valid = 0;
  1138. r->bitfield_desc = NULL;
  1139. r->num_bitfields = 0;
  1140. r->arch_type = arm11_regs_arch_type;
  1141. r->arch_info = rs;
  1142. rs->def_index = i;
  1143. rs->target = target;
  1144. }
  1145. }
  1146. int arm11_handle_bool(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, bool * var, char * name)
  1147. {
  1148. if (argc == 0)
  1149. {
  1150. LOG_INFO("%s is %s.", name, *var ? "enabled" : "disabled");
  1151. return ERROR_OK;
  1152. }
  1153. if (argc != 1)
  1154. return ERROR_COMMAND_SYNTAX_ERROR;
  1155. switch (args[0][0])
  1156. {
  1157. case '0': /* 0 */
  1158. case 'f': /* false */
  1159. case 'F':
  1160. case 'd': /* disable */
  1161. case 'D':
  1162. *var = false;
  1163. break;
  1164. case '1': /* 1 */
  1165. case 't': /* true */
  1166. case 'T':
  1167. case 'e': /* enable */
  1168. case 'E':
  1169. *var = true;
  1170. break;
  1171. }
  1172. LOG_INFO("%s %s.", *var ? "Enabled" : "Disabled", name);
  1173. return ERROR_OK;
  1174. }
  1175. #define BOOL_WRAPPER(name, print_name) \
  1176. int arm11_handle_bool_##name(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) \
  1177. { \
  1178. return arm11_handle_bool(cmd_ctx, cmd, args, argc, &arm11_config_##name, print_name); \
  1179. }
  1180. #define RC_TOP(name, descr, more) \
  1181. { \
  1182. command_t * new_cmd = register_command(cmd_ctx, top_cmd, name, NULL, COMMAND_ANY, descr); \
  1183. command_t * top_cmd = new_cmd; \
  1184. more \
  1185. }
  1186. #define RC_FINAL(name, descr, handler) \
  1187. register_command(cmd_ctx, top_cmd, name, handler, COMMAND_ANY, descr);
  1188. #define RC_FINAL_BOOL(name, descr, var) \
  1189. register_command(cmd_ctx, top_cmd, name, arm11_handle_bool_##var, COMMAND_ANY, descr);
  1190. BOOL_WRAPPER(memwrite_burst, "memory write burst mode")
  1191. BOOL_WRAPPER(memwrite_error_fatal, "fatal error mode for memory writes")
  1192. int arm11_handle_vcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1193. {
  1194. if (argc == 1)
  1195. {
  1196. arm11_vcr = strtoul(args[0], NULL, 0);
  1197. }
  1198. else if (argc != 0)
  1199. {
  1200. return ERROR_COMMAND_SYNTAX_ERROR;
  1201. }
  1202. LOG_INFO("VCR 0x%08X", arm11_vcr);
  1203. return ERROR_OK;
  1204. }
  1205. const u32 arm11_coproc_instruction_limits[] =
  1206. {
  1207. 15, /* coprocessor */
  1208. 7, /* opcode 1 */
  1209. 15, /* CRn */
  1210. 15, /* CRm */
  1211. 7, /* opcode 2 */
  1212. 0xFFFFFFFF, /* value */
  1213. };
  1214. const char arm11_mrc_syntax[] = "Syntax: mrc <jtag_target> <coprocessor> <opcode 1> <CRn> <CRm> <opcode 2>. All parameters are numbers only.";
  1215. const char arm11_mcr_syntax[] = "Syntax: mcr <jtag_target> <coprocessor> <opcode 1> <CRn> <CRm> <opcode 2> <32bit value to write>. All parameters are numbers only.";
  1216. arm11_common_t * arm11_find_target(const char * arg)
  1217. {
  1218. size_t jtag_target = strtoul(arg, NULL, 0);
  1219. {target_t * t;
  1220. for (t = targets; t; t = t->next)
  1221. {
  1222. if (t->type != &arm11_target)
  1223. continue;
  1224. arm11_common_t * arm11 = t->arch_info;
  1225. if (arm11->jtag_info.chain_pos != jtag_target)
  1226. continue;
  1227. return arm11;
  1228. }}
  1229. return 0;
  1230. }
  1231. int arm11_handle_mrc_mcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, bool read)
  1232. {
  1233. if (argc != (read ? 6 : 7))
  1234. {
  1235. LOG_ERROR("Invalid number of arguments. %s", read ? arm11_mrc_syntax : arm11_mcr_syntax);
  1236. return -1;
  1237. }
  1238. arm11_common_t * arm11 = arm11_find_target(args[0]);
  1239. if (!arm11)
  1240. {
  1241. LOG_ERROR("Parameter 1 is not a the JTAG chain position of an ARM11 device. %s",
  1242. read ? arm11_mrc_syntax : arm11_mcr_syntax);
  1243. return -1;
  1244. }
  1245. if (arm11->target->state != TARGET_HALTED)
  1246. {
  1247. LOG_WARNING("target was not halted");
  1248. return ERROR_TARGET_NOT_HALTED;
  1249. }
  1250. u32 values[6];
  1251. {size_t i;
  1252. for (i = 0; i < (read ? 5 : 6); i++)
  1253. {
  1254. values[i] = strtoul(args[i + 1], NULL, 0);
  1255. if (values[i] > arm11_coproc_instruction_limits[i])
  1256. {
  1257. LOG_ERROR("Parameter %ld out of bounds (%d max). %s",
  1258. (long)(i + 2), arm11_coproc_instruction_limits[i],
  1259. read ? arm11_mrc_syntax : arm11_mcr_syntax);
  1260. return -1;
  1261. }
  1262. }}
  1263. u32 instr = 0xEE000010 |
  1264. (values[0] << 8) |
  1265. (values[1] << 21) |
  1266. (values[2] << 16) |
  1267. (values[3] << 0) |
  1268. (values[4] << 5);
  1269. if (read)
  1270. instr |= 0x00100000;
  1271. arm11_run_instr_data_prepare(arm11);
  1272. if (read)
  1273. {
  1274. u32 result;
  1275. arm11_run_instr_data_from_core_via_r0(arm11, instr, &result);
  1276. LOG_INFO("MRC p%d, %d, R0, c%d, c%d, %d = 0x%08x (%d)",
  1277. values[0], values[1], values[2], values[3], values[4], result, result);
  1278. }
  1279. else
  1280. {
  1281. arm11_run_instr_data_to_core_via_r0(arm11, instr, values[5]);
  1282. LOG_INFO("MRC p%d, %d, R0 (#0x%08x), c%d, c%d, %d",
  1283. values[0], values[1],
  1284. values[5],
  1285. values[2], values[3], values[4]);
  1286. }
  1287. arm11_run_instr_data_finish(arm11);
  1288. return ERROR_OK;
  1289. }
  1290. int arm11_handle_mrc(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1291. {
  1292. return arm11_handle_mrc_mcr(cmd_ctx, cmd, args, argc, true);
  1293. }
  1294. int arm11_handle_mcr(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1295. {
  1296. return arm11_handle_mrc_mcr(cmd_ctx, cmd, args, argc, false);
  1297. }
  1298. int arm11_register_commands(struct command_context_s *cmd_ctx)
  1299. {
  1300. FNC_INFO;
  1301. command_t * top_cmd = NULL;
  1302. RC_TOP( "arm11", "arm11 specific commands",
  1303. RC_TOP( "memwrite", "Control memory write transfer mode",
  1304. RC_FINAL_BOOL( "burst", "Enable/Disable non-standard but fast burst mode (default: enabled)",
  1305. memwrite_burst)
  1306. RC_FINAL_BOOL( "error_fatal",
  1307. "Terminate program if transfer error was found (default: enabled)",
  1308. memwrite_error_fatal)
  1309. )
  1310. RC_FINAL( "vcr", "Control (Interrupt) Vector Catch Register",
  1311. arm11_handle_vcr)
  1312. RC_FINAL( "mrc", "Read Coprocessor register",
  1313. arm11_handle_mrc)
  1314. RC_FINAL( "mcr", "Write Coprocessor register",
  1315. arm11_handle_mcr)
  1316. )
  1317. return ERROR_OK;
  1318. }