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.
 
 
 
 
 
 

627 lines
19 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License *
  16. * along with this program; if not, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  19. ***************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include "arm720t.h"
  24. #include "jtag.h"
  25. #include "log.h"
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #if 0
  29. #define _DEBUG_INSTRUCTION_EXECUTION_
  30. #endif
  31. /* cli handling */
  32. int arm720t_register_commands(struct command_context_s *cmd_ctx);
  33. int arm720t_handle_cp15_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  34. int arm720t_handle_virt2phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  35. int arm720t_handle_md_phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  36. int arm720t_handle_mw_phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  37. /* forward declarations */
  38. int arm720t_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
  39. int arm720t_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
  40. int arm720t_quit();
  41. int arm720t_arch_state(struct target_s *target, char *buf, int buf_size);
  42. int arm720t_read_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
  43. int arm720t_write_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
  44. int arm720t_soft_reset_halt(struct target_s *target);
  45. target_type_t arm720t_target =
  46. {
  47. .name = "arm720t",
  48. .poll = arm7_9_poll,
  49. .arch_state = arm720t_arch_state,
  50. .halt = arm7_9_halt,
  51. .resume = arm7_9_resume,
  52. .step = arm7_9_step,
  53. .assert_reset = arm7_9_assert_reset,
  54. .deassert_reset = arm7_9_deassert_reset,
  55. .soft_reset_halt = arm720t_soft_reset_halt,
  56. .prepare_reset_halt = arm7_9_prepare_reset_halt,
  57. .get_gdb_reg_list = armv4_5_get_gdb_reg_list,
  58. .read_memory = arm720t_read_memory,
  59. .write_memory = arm720t_write_memory,
  60. .bulk_write_memory = arm7_9_bulk_write_memory,
  61. .run_algorithm = armv4_5_run_algorithm,
  62. .add_breakpoint = arm7_9_add_breakpoint,
  63. .remove_breakpoint = arm7_9_remove_breakpoint,
  64. .add_watchpoint = arm7_9_add_watchpoint,
  65. .remove_watchpoint = arm7_9_remove_watchpoint,
  66. .register_commands = arm720t_register_commands,
  67. .target_command = arm720t_target_command,
  68. .init_target = arm720t_init_target,
  69. .quit = arm720t_quit
  70. };
  71. int arm720t_scan_cp15(target_t *target, u32 out, u32 *in, int instruction, int clock)
  72. {
  73. armv4_5_common_t *armv4_5 = target->arch_info;
  74. arm7_9_common_t *arm7_9 = armv4_5->arch_info;
  75. arm_jtag_t *jtag_info = &arm7_9->jtag_info;
  76. scan_field_t fields[2];
  77. u8 out_buf[4];
  78. u8 instruction_buf = instruction;
  79. buf_set_u32(out_buf, 0, 32, flip_u32(out, 32));
  80. jtag_add_end_state(TAP_PD);
  81. arm_jtag_scann(jtag_info, 0xf);
  82. arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL);
  83. fields[0].device = jtag_info->chain_pos;
  84. fields[0].num_bits = 1;
  85. fields[0].out_value = &instruction_buf;
  86. fields[0].out_mask = NULL;
  87. fields[0].in_value = NULL;
  88. fields[0].in_check_value = NULL;
  89. fields[0].in_check_mask = NULL;
  90. fields[0].in_handler = NULL;
  91. fields[0].in_handler_priv = NULL;
  92. fields[1].device = jtag_info->chain_pos;
  93. fields[1].num_bits = 32;
  94. fields[1].out_value = out_buf;
  95. fields[1].out_mask = NULL;
  96. fields[1].in_value = NULL;
  97. if (in)
  98. {
  99. fields[1].in_handler = arm_jtag_buf_to_u32_flip;
  100. fields[1].in_handler_priv = in;
  101. } else
  102. {
  103. fields[1].in_handler = NULL;
  104. fields[1].in_handler_priv = NULL;
  105. }
  106. fields[1].in_check_value = NULL;
  107. fields[1].in_check_mask = NULL;
  108. jtag_add_dr_scan(2, fields, -1, NULL);
  109. if (clock)
  110. jtag_add_runtest(0, -1);
  111. #ifdef _DEBUG_INSTRUCTION_EXECUTION_
  112. jtag_execute_queue();
  113. if (in)
  114. DEBUG("out: %8.8x, in: %8.8x, instruction: %i, clock: %i", out, *in, instruction, clock);
  115. else
  116. DEBUG("out: %8.8x, instruction: %i, clock: %i", out, instruction, clock);
  117. #else
  118. DEBUG("out: %8.8x, instruction: %i, clock: %i", out, instruction, clock);
  119. #endif
  120. return ERROR_OK;
  121. }
  122. int arm720t_read_cp15(target_t *target, u32 opcode, u32 *value)
  123. {
  124. /* fetch CP15 opcode */
  125. arm720t_scan_cp15(target, opcode, NULL, 1, 1);
  126. /* "DECODE" stage */
  127. arm720t_scan_cp15(target, ARMV4_5_NOP, NULL, 1, 1);
  128. /* "EXECUTE" stage (1) */
  129. arm720t_scan_cp15(target, ARMV4_5_NOP, NULL, 1, 0);
  130. arm720t_scan_cp15(target, 0x0, NULL, 0, 1);
  131. /* "EXECUTE" stage (2) */
  132. arm720t_scan_cp15(target, 0x0, NULL, 0, 1);
  133. /* "EXECUTE" stage (3), CDATA is read */
  134. arm720t_scan_cp15(target, ARMV4_5_NOP, value, 1, 1);
  135. return ERROR_OK;
  136. }
  137. int arm720t_write_cp15(target_t *target, u32 opcode, u32 value)
  138. {
  139. /* fetch CP15 opcode */
  140. arm720t_scan_cp15(target, opcode, NULL, 1, 1);
  141. /* "DECODE" stage */
  142. arm720t_scan_cp15(target, ARMV4_5_NOP, NULL, 1, 1);
  143. /* "EXECUTE" stage (1) */
  144. arm720t_scan_cp15(target, ARMV4_5_NOP, NULL, 1, 0);
  145. arm720t_scan_cp15(target, 0x0, NULL, 0, 1);
  146. /* "EXECUTE" stage (2) */
  147. arm720t_scan_cp15(target, value, NULL, 0, 1);
  148. arm720t_scan_cp15(target, ARMV4_5_NOP, NULL, 1, 1);
  149. return ERROR_OK;
  150. }
  151. u32 arm720t_get_ttb(target_t *target)
  152. {
  153. u32 ttb = 0x0;
  154. arm720t_read_cp15(target, 0xee120f10, &ttb);
  155. jtag_execute_queue();
  156. ttb &= 0xffffc000;
  157. return ttb;
  158. }
  159. void arm720t_disable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_cache)
  160. {
  161. u32 cp15_control;
  162. /* read cp15 control register */
  163. arm720t_read_cp15(target, 0xee110f10, &cp15_control);
  164. jtag_execute_queue();
  165. if (mmu)
  166. cp15_control &= ~0x1U;
  167. if (d_u_cache || i_cache)
  168. cp15_control &= ~0x4U;
  169. arm720t_write_cp15(target, 0xee010f10, cp15_control);
  170. }
  171. void arm720t_enable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_cache)
  172. {
  173. u32 cp15_control;
  174. /* read cp15 control register */
  175. arm720t_read_cp15(target, 0xee110f10, &cp15_control);
  176. jtag_execute_queue();
  177. if (mmu)
  178. cp15_control |= 0x1U;
  179. if (d_u_cache || i_cache)
  180. cp15_control |= 0x4U;
  181. arm720t_write_cp15(target, 0xee010f10, cp15_control);
  182. }
  183. void arm720t_post_debug_entry(target_t *target)
  184. {
  185. armv4_5_common_t *armv4_5 = target->arch_info;
  186. arm7_9_common_t *arm7_9 = armv4_5->arch_info;
  187. arm7tdmi_common_t *arm7tdmi = arm7_9->arch_info;
  188. arm720t_common_t *arm720t = arm7tdmi->arch_info;
  189. /* examine cp15 control reg */
  190. arm720t_read_cp15(target, 0xee110f10, &arm720t->cp15_control_reg);
  191. jtag_execute_queue();
  192. DEBUG("cp15_control_reg: %8.8x", arm720t->cp15_control_reg);
  193. arm720t->armv4_5_mmu.mmu_enabled = (arm720t->cp15_control_reg & 0x1U) ? 1 : 0;
  194. arm720t->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled = (arm720t->cp15_control_reg & 0x4U) ? 1 : 0;
  195. arm720t->armv4_5_mmu.armv4_5_cache.i_cache_enabled = 0;
  196. /* save i/d fault status and address register */
  197. arm720t_read_cp15(target, 0xee150f10, &arm720t->fsr_reg);
  198. arm720t_read_cp15(target, 0xee160f10, &arm720t->far_reg);
  199. jtag_execute_queue();
  200. }
  201. void arm720t_pre_restore_context(target_t *target)
  202. {
  203. armv4_5_common_t *armv4_5 = target->arch_info;
  204. arm7_9_common_t *arm7_9 = armv4_5->arch_info;
  205. arm7tdmi_common_t *arm7tdmi = arm7_9->arch_info;
  206. arm720t_common_t *arm720t = arm7tdmi->arch_info;
  207. /* restore i/d fault status and address register */
  208. arm720t_write_cp15(target, 0xee050f10, arm720t->fsr_reg);
  209. arm720t_write_cp15(target, 0xee060f10, arm720t->far_reg);
  210. }
  211. int arm720t_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, arm7_9_common_t **arm7_9_p, arm7tdmi_common_t **arm7tdmi_p, arm720t_common_t **arm720t_p)
  212. {
  213. armv4_5_common_t *armv4_5 = target->arch_info;
  214. arm7_9_common_t *arm7_9;
  215. arm7tdmi_common_t *arm7tdmi;
  216. arm720t_common_t *arm720t;
  217. if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC)
  218. {
  219. return -1;
  220. }
  221. arm7_9 = armv4_5->arch_info;
  222. if (arm7_9->common_magic != ARM7_9_COMMON_MAGIC)
  223. {
  224. return -1;
  225. }
  226. arm7tdmi = arm7_9->arch_info;
  227. if (arm7tdmi->common_magic != ARM7TDMI_COMMON_MAGIC)
  228. {
  229. return -1;
  230. }
  231. arm720t = arm7tdmi->arch_info;
  232. if (arm720t->common_magic != ARM720T_COMMON_MAGIC)
  233. {
  234. return -1;
  235. }
  236. *armv4_5_p = armv4_5;
  237. *arm7_9_p = arm7_9;
  238. *arm7tdmi_p = arm7tdmi;
  239. *arm720t_p = arm720t;
  240. return ERROR_OK;
  241. }
  242. int arm720t_arch_state(struct target_s *target, char *buf, int buf_size)
  243. {
  244. armv4_5_common_t *armv4_5 = target->arch_info;
  245. arm7_9_common_t *arm7_9 = armv4_5->arch_info;
  246. arm7tdmi_common_t *arm7tdmi = arm7_9->arch_info;
  247. arm720t_common_t *arm720t = arm7tdmi->arch_info;
  248. char *state[] =
  249. {
  250. "disabled", "enabled"
  251. };
  252. if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC)
  253. {
  254. ERROR("BUG: called for a non-ARMv4/5 target");
  255. exit(-1);
  256. }
  257. snprintf(buf, buf_size,
  258. "target halted in %s state due to %s, current mode: %s\n"
  259. "cpsr: 0x%8.8x pc: 0x%8.8x\n"
  260. "MMU: %s, Cache: %s",
  261. armv4_5_state_strings[armv4_5->core_state],
  262. target_debug_reason_strings[target->debug_reason],
  263. armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)],
  264. buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32),
  265. buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32),
  266. state[arm720t->armv4_5_mmu.mmu_enabled],
  267. state[arm720t->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled]);
  268. return ERROR_OK;
  269. }
  270. int arm720t_read_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
  271. {
  272. int retval;
  273. armv4_5_common_t *armv4_5 = target->arch_info;
  274. arm7_9_common_t *arm7_9 = armv4_5->arch_info;
  275. arm7tdmi_common_t *arm7tdmi = arm7_9->arch_info;
  276. arm720t_common_t *arm720t = arm7tdmi->arch_info;
  277. /* disable cache, but leave MMU enabled */
  278. if (arm720t->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled)
  279. arm720t_disable_mmu_caches(target, 0, 1, 0);
  280. retval = arm7_9_read_memory(target, address, size, count, buffer);
  281. if (arm720t->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled)
  282. arm720t_enable_mmu_caches(target, 0, 1, 0);
  283. return retval;
  284. }
  285. int arm720t_write_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
  286. {
  287. int retval;
  288. if ((retval = arm7_9_write_memory(target, address, size, count, buffer)) != ERROR_OK)
  289. return retval;
  290. return retval;
  291. }
  292. int arm720t_soft_reset_halt(struct target_s *target)
  293. {
  294. armv4_5_common_t *armv4_5 = target->arch_info;
  295. arm7_9_common_t *arm7_9 = armv4_5->arch_info;
  296. arm7tdmi_common_t *arm7tdmi = arm7_9->arch_info;
  297. arm720t_common_t *arm720t = arm7tdmi->arch_info;
  298. reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
  299. if (target->state == TARGET_RUNNING)
  300. {
  301. target->type->halt(target);
  302. }
  303. while (buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_DBGACK, 1) == 0)
  304. {
  305. embeddedice_read_reg(dbg_stat);
  306. jtag_execute_queue();
  307. }
  308. target->state = TARGET_HALTED;
  309. /* SVC, ARM state, IRQ and FIQ disabled */
  310. buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8, 0xd3);
  311. armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 1;
  312. armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
  313. /* start fetching from 0x0 */
  314. buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, 0x0);
  315. armv4_5->core_cache->reg_list[15].dirty = 1;
  316. armv4_5->core_cache->reg_list[15].valid = 1;
  317. armv4_5->core_mode = ARMV4_5_MODE_SVC;
  318. armv4_5->core_state = ARMV4_5_STATE_ARM;
  319. arm720t_disable_mmu_caches(target, 1, 1, 1);
  320. arm720t->armv4_5_mmu.mmu_enabled = 0;
  321. arm720t->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled = 0;
  322. arm720t->armv4_5_mmu.armv4_5_cache.i_cache_enabled = 0;
  323. target_call_event_callbacks(target, TARGET_EVENT_HALTED);
  324. return ERROR_OK;
  325. }
  326. int arm720t_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
  327. {
  328. arm7tdmi_init_target(cmd_ctx, target);
  329. return ERROR_OK;
  330. }
  331. int arm720t_quit()
  332. {
  333. return ERROR_OK;
  334. }
  335. int arm720t_init_arch_info(target_t *target, arm720t_common_t *arm720t, int chain_pos, char *variant)
  336. {
  337. arm7tdmi_common_t *arm7tdmi = &arm720t->arm7tdmi_common;
  338. arm7_9_common_t *arm7_9 = &arm7tdmi->arm7_9_common;
  339. arm7tdmi_init_arch_info(target, arm7tdmi, chain_pos, variant);
  340. arm7tdmi->arch_info = arm720t;
  341. arm720t->common_magic = ARM720T_COMMON_MAGIC;
  342. arm7_9->post_debug_entry = arm720t_post_debug_entry;
  343. arm7_9->pre_restore_context = arm720t_pre_restore_context;
  344. arm720t->armv4_5_mmu.armv4_5_cache.ctype = -1;
  345. arm720t->armv4_5_mmu.get_ttb = arm720t_get_ttb;
  346. arm720t->armv4_5_mmu.read_memory = arm7_9_read_memory;
  347. arm720t->armv4_5_mmu.write_memory = arm7_9_write_memory;
  348. arm720t->armv4_5_mmu.disable_mmu_caches = arm720t_disable_mmu_caches;
  349. arm720t->armv4_5_mmu.enable_mmu_caches = arm720t_enable_mmu_caches;
  350. arm720t->armv4_5_mmu.has_tiny_pages = 0;
  351. arm720t->armv4_5_mmu.mmu_enabled = 0;
  352. return ERROR_OK;
  353. }
  354. int arm720t_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
  355. {
  356. int chain_pos;
  357. char *variant = NULL;
  358. arm720t_common_t *arm720t = malloc(sizeof(arm720t_common_t));
  359. if (argc < 4)
  360. {
  361. ERROR("'target arm720t' requires at least one additional argument");
  362. exit(-1);
  363. }
  364. chain_pos = strtoul(args[3], NULL, 0);
  365. if (argc >= 5)
  366. variant = args[4];
  367. DEBUG("chain_pos: %i, variant: %s", chain_pos, variant);
  368. arm720t_init_arch_info(target, arm720t, chain_pos, variant);
  369. return ERROR_OK;
  370. }
  371. int arm720t_register_commands(struct command_context_s *cmd_ctx)
  372. {
  373. int retval;
  374. command_t *arm720t_cmd;
  375. retval = arm7tdmi_register_commands(cmd_ctx);
  376. arm720t_cmd = register_command(cmd_ctx, NULL, "arm720t", NULL, COMMAND_ANY, "arm720t specific commands");
  377. register_command(cmd_ctx, arm720t_cmd, "cp15", arm720t_handle_cp15_command, COMMAND_EXEC, "display/modify cp15 register <opcode> [value]");
  378. register_command(cmd_ctx, arm720t_cmd, "virt2phys", arm720t_handle_virt2phys_command, COMMAND_EXEC, "translate va to pa <va>");
  379. register_command(cmd_ctx, arm720t_cmd, "mdw_phys", arm720t_handle_md_phys_command, COMMAND_EXEC, "display memory words <physical addr> [count]");
  380. register_command(cmd_ctx, arm720t_cmd, "mdh_phys", arm720t_handle_md_phys_command, COMMAND_EXEC, "display memory half-words <physical addr> [count]");
  381. register_command(cmd_ctx, arm720t_cmd, "mdb_phys", arm720t_handle_md_phys_command, COMMAND_EXEC, "display memory bytes <physical addr> [count]");
  382. register_command(cmd_ctx, arm720t_cmd, "mww_phys", arm720t_handle_mw_phys_command, COMMAND_EXEC, "write memory word <physical addr> <value>");
  383. register_command(cmd_ctx, arm720t_cmd, "mwh_phys", arm720t_handle_mw_phys_command, COMMAND_EXEC, "write memory half-word <physical addr> <value>");
  384. register_command(cmd_ctx, arm720t_cmd, "mwb_phys", arm720t_handle_mw_phys_command, COMMAND_EXEC, "write memory byte <physical addr> <value>");
  385. return ERROR_OK;
  386. }
  387. int arm720t_handle_cp15_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  388. {
  389. int retval;
  390. target_t *target = get_current_target(cmd_ctx);
  391. armv4_5_common_t *armv4_5;
  392. arm7_9_common_t *arm7_9;
  393. arm7tdmi_common_t *arm7tdmi;
  394. arm720t_common_t *arm720t;
  395. arm_jtag_t *jtag_info;
  396. if (arm720t_get_arch_pointers(target, &armv4_5, &arm7_9, &arm7tdmi, &arm720t) != ERROR_OK)
  397. {
  398. command_print(cmd_ctx, "current target isn't an ARM720t target");
  399. return ERROR_OK;
  400. }
  401. jtag_info = &arm7_9->jtag_info;
  402. if (target->state != TARGET_HALTED)
  403. {
  404. command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
  405. return ERROR_OK;
  406. }
  407. /* one or more argument, access a single register (write if second argument is given */
  408. if (argc >= 1)
  409. {
  410. u32 opcode = strtoul(args[0], NULL, 0);
  411. if (argc == 1)
  412. {
  413. u32 value;
  414. if ((retval = arm720t_read_cp15(target, opcode, &value)) != ERROR_OK)
  415. {
  416. command_print(cmd_ctx, "couldn't access cp15 with opcode 0x%8.8x", opcode);
  417. return ERROR_OK;
  418. }
  419. jtag_execute_queue();
  420. command_print(cmd_ctx, "0x%8.8x: 0x%8.8x", opcode, value);
  421. }
  422. else if (argc == 2)
  423. {
  424. u32 value = strtoul(args[1], NULL, 0);
  425. if ((retval = arm720t_write_cp15(target, opcode, value)) != ERROR_OK)
  426. {
  427. command_print(cmd_ctx, "couldn't access cp15 with opcode 0x%8.8x", opcode);
  428. return ERROR_OK;
  429. }
  430. command_print(cmd_ctx, "0x%8.8x: 0x%8.8x", opcode, value);
  431. }
  432. }
  433. return ERROR_OK;
  434. }
  435. int arm720t_handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
  436. {
  437. target_t *target = get_current_target(cmd_ctx);
  438. armv4_5_common_t *armv4_5;
  439. arm7_9_common_t *arm7_9;
  440. arm7tdmi_common_t *arm7tdmi;
  441. arm720t_common_t *arm720t;
  442. arm_jtag_t *jtag_info;
  443. if (arm720t_get_arch_pointers(target, &armv4_5, &arm7_9, &arm7tdmi, &arm720t) != ERROR_OK)
  444. {
  445. command_print(cmd_ctx, "current target isn't an ARM720t target");
  446. return ERROR_OK;
  447. }
  448. jtag_info = &arm7_9->jtag_info;
  449. if (target->state != TARGET_HALTED)
  450. {
  451. command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
  452. return ERROR_OK;
  453. }
  454. return armv4_5_mmu_handle_virt2phys_command(cmd_ctx, cmd, args, argc, target, &arm720t->armv4_5_mmu);
  455. }
  456. int arm720t_handle_md_phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
  457. {
  458. target_t *target = get_current_target(cmd_ctx);
  459. armv4_5_common_t *armv4_5;
  460. arm7_9_common_t *arm7_9;
  461. arm7tdmi_common_t *arm7tdmi;
  462. arm720t_common_t *arm720t;
  463. arm_jtag_t *jtag_info;
  464. if (arm720t_get_arch_pointers(target, &armv4_5, &arm7_9, &arm7tdmi, &arm720t) != ERROR_OK)
  465. {
  466. command_print(cmd_ctx, "current target isn't an ARM720t target");
  467. return ERROR_OK;
  468. }
  469. jtag_info = &arm7_9->jtag_info;
  470. if (target->state != TARGET_HALTED)
  471. {
  472. command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
  473. return ERROR_OK;
  474. }
  475. return armv4_5_mmu_handle_md_phys_command(cmd_ctx, cmd, args, argc, target, &arm720t->armv4_5_mmu);
  476. }
  477. int arm720t_handle_mw_phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
  478. {
  479. target_t *target = get_current_target(cmd_ctx);
  480. armv4_5_common_t *armv4_5;
  481. arm7_9_common_t *arm7_9;
  482. arm7tdmi_common_t *arm7tdmi;
  483. arm720t_common_t *arm720t;
  484. arm_jtag_t *jtag_info;
  485. if (arm720t_get_arch_pointers(target, &armv4_5, &arm7_9, &arm7tdmi, &arm720t) != ERROR_OK)
  486. {
  487. command_print(cmd_ctx, "current target isn't an ARM720t target");
  488. return ERROR_OK;
  489. }
  490. jtag_info = &arm7_9->jtag_info;
  491. if (target->state != TARGET_HALTED)
  492. {
  493. command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
  494. return ERROR_OK;
  495. }
  496. return armv4_5_mmu_handle_mw_phys_command(cmd_ctx, cmd, args, argc, target, &arm720t->armv4_5_mmu);
  497. }