summaryrefslogtreecommitdiff
path: root/src/target/armv4_5.c
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-08-25 20:02:19 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-08-25 20:02:19 +0000
commitbc075606b7de9f85bff50e8afc0dbdcba3a99765 (patch)
tree56bb23600c16113d7cefdb36265e9b482222370b /src/target/armv4_5.c
parent24f011ebb49dea93110c0fbafc882990f9f05cc7 (diff)
downloadopenocd_libswd-bc075606b7de9f85bff50e8afc0dbdcba3a99765.tar.gz
openocd_libswd-bc075606b7de9f85bff50e8afc0dbdcba3a99765.tar.bz2
openocd_libswd-bc075606b7de9f85bff50e8afc0dbdcba3a99765.tar.xz
openocd_libswd-bc075606b7de9f85bff50e8afc0dbdcba3a99765.zip
David Brownell <david-b@pacbell.net> Tweak disassembly commands:
For ARMv4/ARMv5: - better command parameter error checking - don't require an instruction count; default to one - recognize thumb function addresses - make function static - shorten some too-long lines For Cortex-M3: - don't require an instruction count; default to one With the relevant doc updates. --- Nyet done: invoke the thumb2 disassembler on v4/v5, to better handle branch instructions. git-svn-id: svn://svn.berlios.de/openocd/trunk@2624 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target/armv4_5.c')
-rw-r--r--src/target/armv4_5.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/src/target/armv4_5.c b/src/target/armv4_5.c
index 9861843e..9f9aa2f5 100644
--- a/src/target/armv4_5.c
+++ b/src/target/armv4_5.c
@@ -387,13 +387,15 @@ int handle_armv4_5_core_state_command(struct command_context_s *cmd_ctx, char *c
return ERROR_OK;
}
-int handle_armv4_5_disassemble_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int
+handle_armv4_5_disassemble_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
{
int retval = ERROR_OK;
target_t *target = get_current_target(cmd_ctx);
armv4_5_common_t *armv4_5 = target->arch_info;
uint32_t address;
- int count;
+ int count = 1;
int i;
arm_instruction_t cur_instruction;
uint32_t opcode;
@@ -406,19 +408,32 @@ int handle_armv4_5_disassemble_command(struct command_context_s *cmd_ctx, char *
return ERROR_OK;
}
- if (argc < 2)
- {
- command_print(cmd_ctx, "usage: armv4_5 disassemble <address> <count> ['thumb']");
+ switch (argc) {
+ case 3:
+ if (strcmp(args[2], "thumb") != 0)
+ goto usage;
+ thumb = 1;
+ /* FALL THROUGH */
+ case 2:
+ count = strtoul(args[1], NULL, 0);
+ /* FALL THROUGH */
+ case 1:
+ address = strtoul(args[0], NULL, 0);
+ if (address & 0x01) {
+ if (!thumb) {
+ command_print(cmd_ctx, "Disassemble as Thumb");
+ thumb = 1;
+ }
+ address &= ~1;
+ }
+ break;
+ default:
+usage:
+ command_print(cmd_ctx,
+ "usage: armv4_5 disassemble <address> [<count> ['thumb']]");
return ERROR_OK;
}
- address = strtoul(args[0], NULL, 0);
- count = strtoul(args[1], NULL, 0);
-
- if (argc >= 3)
- if (strcmp(args[2], "thumb") == 0)
- thumb = 1;
-
for (i = 0; i < count; i++)
{
if (thumb)
@@ -453,12 +468,20 @@ int armv4_5_register_commands(struct command_context_s *cmd_ctx)
{
command_t *armv4_5_cmd;
- armv4_5_cmd = register_command(cmd_ctx, NULL, "armv4_5", NULL, COMMAND_ANY, "armv4/5 specific commands");
+ armv4_5_cmd = register_command(cmd_ctx, NULL, "armv4_5",
+ NULL, COMMAND_ANY,
+ "armv4/5 specific commands");
- register_command(cmd_ctx, armv4_5_cmd, "reg", handle_armv4_5_reg_command, COMMAND_EXEC, "display ARM core registers");
- register_command(cmd_ctx, armv4_5_cmd, "core_state", handle_armv4_5_core_state_command, COMMAND_EXEC, "display/change ARM core state <arm | thumb>");
+ register_command(cmd_ctx, armv4_5_cmd, "reg",
+ handle_armv4_5_reg_command, COMMAND_EXEC,
+ "display ARM core registers");
+ register_command(cmd_ctx, armv4_5_cmd, "core_state",
+ handle_armv4_5_core_state_command, COMMAND_EXEC,
+ "display/change ARM core state <arm | thumb>");
+ register_command(cmd_ctx, armv4_5_cmd, "disassemble",
+ handle_armv4_5_disassemble_command, COMMAND_EXEC,
+ "disassemble instructions <address> [<count> ['thumb']]");
- register_command(cmd_ctx, armv4_5_cmd, "disassemble", handle_armv4_5_disassemble_command, COMMAND_EXEC, "disassemble instructions <address> <count> ['thumb']");
return ERROR_OK;
}