Fix thumb2 Branch instruction in disassembler
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 2 Feb 2010 18:59:41 +0000 (18:59 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 2 Feb 2010 18:59:41 +0000 (18:59 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9913 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Library/ArmDisassemblerLib/ThumbDisassembler.c

index 02958c85c209cb99b8c5602284d7daa6389ad444..f06a6bc2c5ab7a24461a621f454c091a993c587d 100644 (file)
@@ -157,7 +157,7 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
   { "B",    0xf0009000, 0xf800d000, B_T4  },\r
   { "BL",   0xf000d000, 0xf800d000, B_T4  },\r
   { "BLX",  0xf000c000, 0xf800d000, BL_T2 }\r
-  \r
+  // ADD POP PUSH STR(B)(D) LDR(B)(D) EOR MOV ADDS SUBS STM\r
 #if 0  \r
   \r
   // 32-bit Thumb instructions  op1 01\r
@@ -444,9 +444,9 @@ DisassembleThumbInstruction (
   for (Index = 0; Index < sizeof (gOpThumb2)/sizeof (THUMB_INSTRUCTIONS); Index++) {\r
     if ((OpCode32 & gOpThumb2[Index].Mask) == gOpThumb2[Index].OpCode) {\r
       if (Extended) {\r
-        Offset = AsciiSPrint (Buf, Size, "0x%04x       %-6a", OpCode32, gOpThumb2[Index].Start);   \r
+        Offset = AsciiSPrint (Buf, Size, "0x%04x   %-6a", OpCode32, gOpThumb2[Index].Start);   \r
       } else {\r
-        Offset = AsciiSPrint (Buf, Size, "       %-6a", gOpThumb2[Index].Start);   \r
+        Offset = AsciiSPrint (Buf, Size, "   %-6a", gOpThumb2[Index].Start);   \r
       }\r
       switch (gOpThumb2[Index].AddressMode) {\r
       case B_T3:\r
@@ -455,36 +455,36 @@ DisassembleThumbInstruction (
         Buf[Offset-4] = *Cond;\r
         // S:J2:J1:imm6:imm11:0\r
         Target = ((OpCode32 << 1) & 0xffe) + ((OpCode32 >> 4) & 0x3f000);\r
-        Target |= (OpCode & BIT11) ? BIT18 : 0;  // J2\r
-        Target |= (OpCode & BIT13) ? BIT17 : 0;  // J1\r
-        Target |= (OpCode & BIT26) ? BIT19 : 0;  // S\r
-        Target = SignExtend32 (Target, BIT19);\r
-        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", Target);   \r
+        Target |= ((OpCode32 & BIT11) == BIT11)? BIT19 : 0;  // J2\r
+        Target |= ((OpCode32 & BIT13) == BIT13)? BIT18 : 0;  // J1\r
+        Target |= ((OpCode32 & BIT26) == BIT26)? BIT20 : 0;  // S\r
+        Target = SignExtend32 (Target, BIT20);\r
+        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", PC + 4 + Target);   \r
         return;\r
       case B_T4:\r
         // S:I1:I2:imm10:imm11:0\r
         Target = ((OpCode32 << 1) & 0xffe) + ((OpCode32 >> 4) & 0x3ff000);\r
-        S  = (OpCode & BIT26);\r
-        J1 = (OpCode & BIT13);\r
-        J2 = (OpCode & BIT11);\r
-        Target |= !(J2 ^ S) ? BIT21 : 0;  // I2\r
-        Target |= !(J1 ^ S) ? BIT22 : 0;  // I1\r
-        Target |= (OpCode & BIT26) ? BIT23 : 0;  // S\r
-        Target = SignExtend32 (Target, BIT23);\r
-        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", Target);   \r
+        S  = (OpCode32 & BIT26) == BIT26;\r
+        J1 = (OpCode32 & BIT13) == BIT13;\r
+        J2 = (OpCode32 & BIT11) == BIT11;\r
+        Target |= (!(J2 ^ S) ? BIT22 : 0);  // I2\r
+        Target |= (!(J1 ^ S) ? BIT23 : 0);  // I1\r
+        Target |= (S ? BIT24 : 0);  // S\r
+        Target = SignExtend32 (Target, BIT24);\r
+        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", PC + 4 + Target);   \r
         return;\r
 \r
       case BL_T2:\r
-        // S:I1:I2:imm10:imm11:0\r
+        // S:I1:I2:imm10:imm11:00\r
         Target = ((OpCode32 << 2) & 0x1ffc) + ((OpCode32 >> 3) & 0x7fe000);\r
-        S  = (OpCode & BIT26);\r
-        J1 = (OpCode & BIT13);\r
-        J2 = (OpCode & BIT11);\r
-        Target |= !(J2 ^ S) ? BIT22 : 0;  // I2\r
-        Target |= !(J1 ^ S) ? BIT23 : 0;  // I1\r
-        Target |= (OpCode & BIT26) ? BIT24 : 0;  // S\r
-        Target = SignExtend32 (Target, BIT24);\r
-        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", Target);   \r
+        S  = (OpCode32 & BIT26) == BIT26;\r
+        J1 = (OpCode32 & BIT13) == BIT13;\r
+        J2 = (OpCode32 & BIT11) == BIT11;\r
+        Target |= (!(J2 ^ S) ? BIT23 : 0);  // I2\r
+        Target |= (!(J1 ^ S) ? BIT24 : 0);  // I1\r
+        Target |= (S ? BIT25 : 0);  // S\r
+        Target = SignExtend32 (Target, BIT25);\r
+        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", PC + 4 + Target);   \r
         return;\r
       }\r
     }\r