Fix handling of thumb disassembly in armv4_5 disassemble. Courtesy of Adam Dybkowski...
authorkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 19 Jan 2009 07:08:28 +0000 (07:08 +0000)
committerkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 19 Jan 2009 07:08:28 +0000 (07:08 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1338 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/armv4_5.c

index 32daa792203529e8c090afecab51b2d9ac2aae56..cf0632f1ac6fc530372b9bfe81d8fb3e9eb3c47e 100644 (file)
@@ -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;