summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-01-19 07:08:28 +0000
committerkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-01-19 07:08:28 +0000
commit2aed5dd40b42f8381d62658522a7ada453e22022 (patch)
tree4a4b77a61c682e7ee2187407b1b5a214a0eceb66 /src
parentded2e16b350776d5435d047b128cd334860da205 (diff)
downloadopenocd+libswd-2aed5dd40b42f8381d62658522a7ada453e22022.tar.gz
openocd+libswd-2aed5dd40b42f8381d62658522a7ada453e22022.tar.bz2
openocd+libswd-2aed5dd40b42f8381d62658522a7ada453e22022.tar.xz
openocd+libswd-2aed5dd40b42f8381d62658522a7ada453e22022.zip
Fix handling of thumb disassembly in armv4_5 disassemble. Courtesy of Adam Dybkowski <adybkows@wp.pl>
git-svn-id: svn://svn.berlios.de/openocd/trunk@1338 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r--src/target/armv4_5.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/target/armv4_5.c b/src/target/armv4_5.c
index 32daa792..cf0632f1 100644
--- a/src/target/armv4_5.c
+++ b/src/target/armv4_5.c
@@ -404,6 +404,7 @@ int handle_armv4_5_disassemble_command(struct command_context_s *cmd_ctx, char *
int i;
arm_instruction_t cur_instruction;
u32 opcode;
+ u16 thumb_opcode;
int thumb = 0;
if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC)
@@ -427,13 +428,26 @@ int handle_armv4_5_disassemble_command(struct command_context_s *cmd_ctx, char *
for (i = 0; i < count; i++)
{
- if((retval = target_read_u32(target, address, &opcode)) != ERROR_OK)
+ if(thumb)
{
- return retval;
+ if((retval = target_read_u16(target, address, &thumb_opcode)) != ERROR_OK)
+ {
+ return retval;
+ }
+ if((retval = thumb_evaluate_opcode(thumb_opcode, address, &cur_instruction)) != ERROR_OK)
+ {
+ return retval;
+ }
}
- if((retval = arm_evaluate_opcode(opcode, address, &cur_instruction)) != ERROR_OK)
- {
- return retval;
+ else {
+ if((retval = target_read_u32(target, address, &opcode)) != ERROR_OK)
+ {
+ return retval;
+ }
+ if((retval = arm_evaluate_opcode(opcode, address, &cur_instruction)) != ERROR_OK)
+ {
+ return retval;
+ }
}
command_print(cmd_ctx, "%s", cur_instruction.text);
address += (thumb) ? 2 : 4;