30
33
#define _DEBUG_INSTRUCTION_EXECUTION_
34
int arm926ejs_handle_cp15_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
35
int arm926ejs_handle_cp15i_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
36
int arm926ejs_handle_virt2phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
37
int arm926ejs_handle_cache_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
38
int arm926ejs_handle_md_phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
39
int arm926ejs_handle_mw_phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
41
int arm926ejs_handle_read_cache_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
42
int arm926ejs_handle_read_mmu_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
44
/* forward declarations */
45
int arm926ejs_target_create(struct target_s *target, Jim_Interp *interp);
46
int arm926ejs_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
47
int arm926ejs_quit(void);
48
int arm926ejs_read_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
50
static int arm926ejs_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical);
51
static int arm926ejs_mmu(struct target_s *target, int *enabled);
53
target_type_t arm926ejs_target =
58
.arch_state = arm926ejs_arch_state,
60
.target_request_data = arm7_9_target_request_data,
63
.resume = arm7_9_resume,
66
.assert_reset = arm7_9_assert_reset,
67
.deassert_reset = arm7_9_deassert_reset,
68
.soft_reset_halt = arm926ejs_soft_reset_halt,
70
.get_gdb_reg_list = armv4_5_get_gdb_reg_list,
72
.read_memory = arm7_9_read_memory,
73
.write_memory = arm926ejs_write_memory,
74
.bulk_write_memory = arm7_9_bulk_write_memory,
75
.checksum_memory = arm7_9_checksum_memory,
76
.blank_check_memory = arm7_9_blank_check_memory,
78
.run_algorithm = armv4_5_run_algorithm,
80
.add_breakpoint = arm7_9_add_breakpoint,
81
.remove_breakpoint = arm7_9_remove_breakpoint,
82
.add_watchpoint = arm7_9_add_watchpoint,
83
.remove_watchpoint = arm7_9_remove_watchpoint,
85
.register_commands = arm926ejs_register_commands,
86
.target_create = arm926ejs_target_create,
87
.init_target = arm926ejs_init_target,
88
.examine = arm9tdmi_examine,
89
.quit = arm926ejs_quit,
90
.virt2phys = arm926ejs_virt2phys,
94
int arm926ejs_catch_broken_irscan(uint8_t *captured, void *priv, scan_field_t *field)
36
static int arm926ejs_catch_broken_irscan(uint8_t *captured, void *priv,
96
39
/* FIX!!!! this code should be reenabled. For now it does not check
116
59
#define ARM926EJS_CP15_ADDR(opcode_1, opcode_2, CRn, CRm) ((opcode_1 << 11) | (opcode_2 << 8) | (CRn << 4) | (CRm << 0))
118
int arm926ejs_cp15_read(target_t *target, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
61
static int arm926ejs_cp15_read(target_t *target, uint32_t op1, uint32_t op2,
62
uint32_t CRn, uint32_t CRm, uint32_t *value)
120
64
int retval = ERROR_OK;
121
65
armv4_5_common_t *armv4_5 = target->arch_info;
200
int arm926ejs_cp15_write(target_t *target, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
144
static int arm926ejs_mrc(target_t *target, int cpnum, uint32_t op1,
145
uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
148
LOG_ERROR("Only cp15 is supported");
151
return arm926ejs_cp15_read(target, op1, op2, CRn, CRm, value);
154
static int arm926ejs_cp15_write(target_t *target, uint32_t op1, uint32_t op2,
155
uint32_t CRn, uint32_t CRm, uint32_t value)
202
157
int retval = ERROR_OK;
203
158
armv4_5_common_t *armv4_5 = target->arch_info;
280
int arm926ejs_examine_debug_reason(target_t *target)
235
static int arm926ejs_mcr(target_t *target, int cpnum, uint32_t op1,
236
uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
239
LOG_ERROR("Only cp15 is supported");
242
return arm926ejs_cp15_write(target, op1, op2, CRn, CRm, value);
245
static int arm926ejs_examine_debug_reason(target_t *target)
282
247
armv4_5_common_t *armv4_5 = target->arch_info;
283
248
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
443
413
arm926ejs->write_cp15(target, 0, 0, 1, 0, cp15_control);
446
void arm926ejs_enable_mmu_caches(target_t *target, int mmu, int d_u_cache, int i_cache)
416
static void arm926ejs_enable_mmu_caches(target_t *target, int mmu,
417
int d_u_cache, int i_cache)
448
419
armv4_5_common_t *armv4_5 = target->arch_info;
449
420
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
530
501
arm926ejs->write_cp15(target, 7, 0, 15, 0, cache_dbg_ctrl);
533
int arm926ejs_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, arm7_9_common_t **arm7_9_p, arm9tdmi_common_t **arm9tdmi_p, arm926ejs_common_t **arm926ejs_p)
504
static int arm926ejs_get_arch_pointers(target_t *target,
505
armv4_5_common_t **armv4_5_p,
506
arm7_9_common_t **arm7_9_p,
507
arm9tdmi_common_t **arm9tdmi_p,
508
arm926ejs_common_t **arm926ejs_p)
535
510
armv4_5_common_t *armv4_5 = target->arch_info;
536
511
arm7_9_common_t *arm7_9;
677
653
arm9tdmi_common_t *arm9tdmi = arm7_9->arch_info;
678
654
arm926ejs_common_t *arm926ejs = arm9tdmi->arch_info;
680
if ((retval = arm7_9_write_memory(target, address, size, count, buffer)) != ERROR_OK)
656
/* FIX!!!! this should be cleaned up and made much more general. The
657
* plan is to write up and test on arm926ejs specifically and
658
* then generalize and clean up afterwards. */
659
if (arm926ejs->armv4_5_mmu.mmu_enabled && (count == 1) && ((size==2) || (size==4)))
661
/* special case the handling of single word writes to bypass MMU
662
* to allow implementation of breakpoints in memory marked read only
664
if (arm926ejs->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled)
666
/* flush and invalidate data cache
668
* MCR p15,0,p,c7,c10,1 - clean cache line using virtual address
671
retval = arm926ejs->write_cp15(target, 0, 1, 7, 10, address&~0x3);
672
if (retval != ERROR_OK)
677
retval = target->type->virt2phys(target, address, &pa);
678
if (retval != ERROR_OK)
681
/* write directly to physical memory bypassing any read only MMU bits, etc. */
682
retval = armv4_5_mmu_write_physical(target, &arm926ejs->armv4_5_mmu, pa, size, count, buffer);
683
if (retval != ERROR_OK)
687
if ((retval = arm7_9_write_memory(target, address, size, count, buffer)) != ERROR_OK)
683
691
/* If ICache is enabled, we have to invalidate affected ICache lines
684
692
* the DCache is forced to write-through, so we don't have to clean it here
703
int arm926ejs_init_target(struct command_context_s *cmd_ctx, struct target_s *target)
711
static int arm926ejs_write_phys_memory(struct target_s *target,
712
uint32_t address, uint32_t size,
713
uint32_t count, uint8_t *buffer)
715
armv4_5_common_t *armv4_5 = target->arch_info;
716
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
717
arm9tdmi_common_t *arm9tdmi = arm7_9->arch_info;
718
arm926ejs_common_t *arm926ejs = arm9tdmi->arch_info;
720
return armv4_5_mmu_write_physical(target, &arm926ejs->armv4_5_mmu, address, size, count, buffer);
723
static int arm926ejs_read_phys_memory(struct target_s *target,
724
uint32_t address, uint32_t size,
725
uint32_t count, uint8_t *buffer)
727
armv4_5_common_t *armv4_5 = target->arch_info;
728
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
729
arm9tdmi_common_t *arm9tdmi = arm7_9->arch_info;
730
arm926ejs_common_t *arm926ejs = arm9tdmi->arch_info;
732
return armv4_5_mmu_read_physical(target, &arm926ejs->armv4_5_mmu, address, size, count, buffer);
735
static int arm926ejs_init_target(struct command_context_s *cmd_ctx,
736
struct target_s *target)
705
738
arm9tdmi_init_target(cmd_ctx, target);
710
int arm926ejs_quit(void)
743
static int arm926ejs_quit(void)
715
int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, jtag_tap_t *tap)
748
int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs,
717
751
arm9tdmi_common_t *arm9tdmi = &arm926ejs->arm9tdmi_common;
718
752
arm7_9_common_t *arm7_9 = &arm9tdmi->arm7_9_common;
761
int arm926ejs_register_commands(struct command_context_s *cmd_ctx)
764
command_t *arm926ejs_cmd;
767
retval = arm9tdmi_register_commands(cmd_ctx);
769
arm926ejs_cmd = register_command(cmd_ctx, NULL, "arm926ejs", NULL, COMMAND_ANY, "arm926ejs specific commands");
771
register_command(cmd_ctx, arm926ejs_cmd, "cp15", arm926ejs_handle_cp15_command, COMMAND_EXEC, "display/modify cp15 register <opcode_1> <opcode_2> <CRn> <CRm> [value]");
773
register_command(cmd_ctx, arm926ejs_cmd, "cache_info", arm926ejs_handle_cache_info_command, COMMAND_EXEC, "display information about target caches");
774
register_command(cmd_ctx, arm926ejs_cmd, "virt2phys", arm926ejs_handle_virt2phys_command, COMMAND_EXEC, "translate va to pa <va>");
776
register_command(cmd_ctx, arm926ejs_cmd, "mdw_phys", arm926ejs_handle_md_phys_command, COMMAND_EXEC, "display memory words <physical addr> [count]");
777
register_command(cmd_ctx, arm926ejs_cmd, "mdh_phys", arm926ejs_handle_md_phys_command, COMMAND_EXEC, "display memory half-words <physical addr> [count]");
778
register_command(cmd_ctx, arm926ejs_cmd, "mdb_phys", arm926ejs_handle_md_phys_command, COMMAND_EXEC, "display memory bytes <physical addr> [count]");
780
register_command(cmd_ctx, arm926ejs_cmd, "mww_phys", arm926ejs_handle_mw_phys_command, COMMAND_EXEC, "write memory word <physical addr> <value>");
781
register_command(cmd_ctx, arm926ejs_cmd, "mwh_phys", arm926ejs_handle_mw_phys_command, COMMAND_EXEC, "write memory half-word <physical addr> <value>");
782
register_command(cmd_ctx, arm926ejs_cmd, "mwb_phys", arm926ejs_handle_mw_phys_command, COMMAND_EXEC, "write memory byte <physical addr> <value>");
787
int arm926ejs_handle_cp15_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
795
static int arm926ejs_handle_cp15_command(struct command_context_s *cmd_ctx,
796
char *cmd, char **args, int argc)
790
799
target_t *target = get_current_target(cmd_ctx);
866
877
return armv4_5_handle_cache_info_command(cmd_ctx, &arm926ejs->armv4_5_mmu.armv4_5_cache);
869
int arm926ejs_handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
871
target_t *target = get_current_target(cmd_ctx);
872
armv4_5_common_t *armv4_5;
873
arm7_9_common_t *arm7_9;
874
arm9tdmi_common_t *arm9tdmi;
875
arm926ejs_common_t *arm926ejs;
876
arm_jtag_t *jtag_info;
878
if (arm926ejs_get_arch_pointers(target, &armv4_5, &arm7_9, &arm9tdmi, &arm926ejs) != ERROR_OK)
880
command_print(cmd_ctx, "current target isn't an ARM926EJ-S target");
884
jtag_info = &arm7_9->jtag_info;
886
if (target->state != TARGET_HALTED)
888
command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
892
return armv4_5_mmu_handle_virt2phys_command(cmd_ctx, cmd, args, argc, target, &arm926ejs->armv4_5_mmu);
895
int arm926ejs_handle_md_phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
897
target_t *target = get_current_target(cmd_ctx);
898
armv4_5_common_t *armv4_5;
899
arm7_9_common_t *arm7_9;
900
arm9tdmi_common_t *arm9tdmi;
901
arm926ejs_common_t *arm926ejs;
902
arm_jtag_t *jtag_info;
904
if (arm926ejs_get_arch_pointers(target, &armv4_5, &arm7_9, &arm9tdmi, &arm926ejs) != ERROR_OK)
906
command_print(cmd_ctx, "current target isn't an ARM926EJ-S target");
910
jtag_info = &arm7_9->jtag_info;
912
if (target->state != TARGET_HALTED)
914
command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
918
return armv4_5_mmu_handle_md_phys_command(cmd_ctx, cmd, args, argc, target, &arm926ejs->armv4_5_mmu);
921
int arm926ejs_handle_mw_phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
923
target_t *target = get_current_target(cmd_ctx);
924
armv4_5_common_t *armv4_5;
925
arm7_9_common_t *arm7_9;
926
arm9tdmi_common_t *arm9tdmi;
927
arm926ejs_common_t *arm926ejs;
928
arm_jtag_t *jtag_info;
930
if (arm926ejs_get_arch_pointers(target, &armv4_5, &arm7_9, &arm9tdmi, &arm926ejs) != ERROR_OK)
932
command_print(cmd_ctx, "current target isn't an ARM926EJ-S target");
936
jtag_info = &arm7_9->jtag_info;
938
if (target->state != TARGET_HALTED)
940
command_print(cmd_ctx, "target must be stopped for \"%s\" command", cmd);
944
return armv4_5_mmu_handle_mw_phys_command(cmd_ctx, cmd, args, argc, target, &arm926ejs->armv4_5_mmu);
947
880
static int arm926ejs_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical)
983
918
*enabled = arm926ejs->armv4_5_mmu.mmu_enabled;
922
int arm926ejs_register_commands(struct command_context_s *cmd_ctx)
925
command_t *arm926ejs_cmd;
927
retval = arm9tdmi_register_commands(cmd_ctx);
929
arm926ejs_cmd = register_command(cmd_ctx, NULL, "arm926ejs",
931
"arm926ejs specific commands");
933
register_command(cmd_ctx, arm926ejs_cmd, "cp15",
934
arm926ejs_handle_cp15_command, COMMAND_EXEC,
935
"display/modify cp15 register "
936
"<opcode_1> <opcode_2> <CRn> <CRm> [value]");
938
register_command(cmd_ctx, arm926ejs_cmd, "cache_info",
939
arm926ejs_handle_cache_info_command, COMMAND_EXEC,
940
"display information about target caches");
945
target_type_t arm926ejs_target =
950
.arch_state = arm926ejs_arch_state,
952
.target_request_data = arm7_9_target_request_data,
955
.resume = arm7_9_resume,
958
.assert_reset = arm7_9_assert_reset,
959
.deassert_reset = arm7_9_deassert_reset,
960
.soft_reset_halt = arm926ejs_soft_reset_halt,
962
.get_gdb_reg_list = armv4_5_get_gdb_reg_list,
964
.read_memory = arm7_9_read_memory,
965
.write_memory = arm926ejs_write_memory,
966
.bulk_write_memory = arm7_9_bulk_write_memory,
967
.checksum_memory = arm7_9_checksum_memory,
968
.blank_check_memory = arm7_9_blank_check_memory,
970
.run_algorithm = armv4_5_run_algorithm,
972
.add_breakpoint = arm7_9_add_breakpoint,
973
.remove_breakpoint = arm7_9_remove_breakpoint,
974
.add_watchpoint = arm7_9_add_watchpoint,
975
.remove_watchpoint = arm7_9_remove_watchpoint,
977
.register_commands = arm926ejs_register_commands,
978
.target_create = arm926ejs_target_create,
979
.init_target = arm926ejs_init_target,
980
.examine = arm9tdmi_examine,
981
.quit = arm926ejs_quit,
982
.virt2phys = arm926ejs_virt2phys,
983
.mmu = arm926ejs_mmu,
985
.read_phys_memory = arm926ejs_read_phys_memory,
986
.write_phys_memory = arm926ejs_write_phys_memory,
987
.mrc = arm926ejs_mrc,
988
.mcr = arm926ejs_mcr,