]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Move ARM disassembler into a library and out of the exception handler. Add a hook...
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Feb 2010 18:59:27 +0000 (18:59 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Feb 2010 18:59:27 +0000 (18:59 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9903 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Include/Library/ArmDisassemblerLib.h
ArmPkg/Library/ArmDisassemblerLib/ArmDisassembler.c
ArmPkg/Library/ArmDisassemblerLib/ThumbDisassembler.c
ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandler.c
BeagleBoardPkg/Library/EblCmdLib/EblCmdLib.c
BeagleBoardPkg/Library/EblCmdLib/EblCmdLib.inf

index 6ba270fea3df3b0b1854746413b9f8a468ae57af..4a3c68c2e3477b26ff192a1a08b83e70a6bd8ae6 100644 (file)
@@ -24,6 +24,7 @@
    
   @param  OpCodePtrPtr  Pointer to pointer of ARM Thumb instruction to disassemble.  
   @param  Thumb         TRUE for Thumb(2), FALSE for ARM instruction stream
    
   @param  OpCodePtrPtr  Pointer to pointer of ARM Thumb instruction to disassemble.  
   @param  Thumb         TRUE for Thumb(2), FALSE for ARM instruction stream
+  @param  Extended      TRUE dump hex for instruction too.
   @param  Buf           Buffer to sprintf disassembly into.
   @param  Size          Size of Buf in bytes. 
   
   @param  Buf           Buffer to sprintf disassembly into.
   @param  Size          Size of Buf in bytes. 
   
@@ -32,6 +33,7 @@ VOID
 DisassembleInstruction (
   IN  UINT8     **OpCodePtr,
   IN  BOOLEAN   Thumb,
 DisassembleInstruction (
   IN  UINT8     **OpCodePtr,
   IN  BOOLEAN   Thumb,
+  IN  BOOLEAN   Extended,
   OUT CHAR8     *Buf,
   OUT UINTN     Size
   );
   OUT CHAR8     *Buf,
   OUT UINTN     Size
   );
index 5b43f5542e83d2b819ba9064a2b31d75aba90645..c3eecbcbcb90b000020af0d3af161263c9c96442 100644 (file)
@@ -154,13 +154,15 @@ RotateRight (
   @param  OpCodePtr   Pointer to pointer of ARM instruction to disassemble.  \r
   @param  Buf         Buffer to sprintf disassembly into.\r
   @param  Size        Size of Buf in bytes. \r
   @param  OpCodePtr   Pointer to pointer of ARM instruction to disassemble.  \r
   @param  Buf         Buffer to sprintf disassembly into.\r
   @param  Size        Size of Buf in bytes. \r
+  @param  Extended    TRUE dump hex for instruction too.\r
   \r
 **/\r
 VOID\r
 DisassembleArmInstruction (\r
   IN  UINT32    **OpCodePtr,\r
   OUT CHAR8     *Buf,\r
   \r
 **/\r
 VOID\r
 DisassembleArmInstruction (\r
   IN  UINT32    **OpCodePtr,\r
   OUT CHAR8     *Buf,\r
-  OUT UINTN     Size\r
+  OUT UINTN     Size,\r
+  IN  BOOLEAN   Extended\r
   )\r
 {\r
   UINT32    OpCode = **OpCodePtr;\r
   )\r
 {\r
   UINT32    OpCode = **OpCodePtr;\r
@@ -183,6 +185,13 @@ DisassembleArmInstruction (
   Rd = (OpCode >> 12) & 0xf;\r
   Rm = (OpCode & 0xf);\r
 \r
   Rd = (OpCode >> 12) & 0xf;\r
   Rm = (OpCode & 0xf);\r
 \r
+\r
+  if (Extended) {\r
+    Index = AsciiSPrint (Buf, Size, "0x%08x   ", OpCode);\r
+    Buf += Index;\r
+    Size -= Index;\r
+  }\r
+\r
   // LDREX, STREX\r
   if ((OpCode  & 0x0fe000f0) == 0x01800090) {\r
     if (L) {\r
   // LDREX, STREX\r
   if ((OpCode  & 0x0fe000f0) == 0x01800090) {\r
     if (L) {\r
index d59d1030fc77f7d417eb82b5eadc9bf63331f1c9..25cb8ae4708f2916cf71894ce12752cdb831dbec 100644 (file)
@@ -263,13 +263,15 @@ SignExtend (
   @param  OpCodePtrPtr  Pointer to pointer of ARM Thumb instruction to disassemble.  \r
   @param  Buf           Buffer to sprintf disassembly into.\r
   @param  Size          Size of Buf in bytes. \r
   @param  OpCodePtrPtr  Pointer to pointer of ARM Thumb instruction to disassemble.  \r
   @param  Buf           Buffer to sprintf disassembly into.\r
   @param  Size          Size of Buf in bytes. \r
+  @param  Extended    TRUE dump hex for instruction too.\r
   \r
 **/\r
 VOID\r
 DisassembleThumbInstruction (\r
   IN  UINT16    **OpCodePtrPtr,\r
   OUT CHAR8     *Buf,\r
   \r
 **/\r
 VOID\r
 DisassembleThumbInstruction (\r
   IN  UINT16    **OpCodePtrPtr,\r
   OUT CHAR8     *Buf,\r
-  OUT UINTN     Size\r
+  OUT UINTN     Size,\r
+  IN  BOOLEAN   Extended\r
   )\r
 {\r
   UINT16  *OpCodePtr;\r
   )\r
 {\r
   UINT16  *OpCodePtr;\r
@@ -302,7 +304,11 @@ DisassembleThumbInstruction (
   \r
   for (Index = 0; Index < sizeof (gOpThumb)/sizeof (THUMB_INSTRUCTIONS); Index++) {\r
     if ((OpCode & gOpThumb[Index].Mask) == gOpThumb[Index].OpCode) {\r
   \r
   for (Index = 0; Index < sizeof (gOpThumb)/sizeof (THUMB_INSTRUCTIONS); Index++) {\r
     if ((OpCode & gOpThumb[Index].Mask) == gOpThumb[Index].OpCode) {\r
-      Offset = AsciiSPrint (Buf, Size, "%a", gOpThumb[Index].Start);   \r
+      if (Extended) {\r
+        Offset = AsciiSPrint (Buf, Size, "0x%04x       %a", OpCode, gOpThumb[Index].Start);   \r
+      } else {\r
+        Offset = AsciiSPrint (Buf, Size, "%a", gOpThumb[Index].Start);   \r
+      }\r
       switch (gOpThumb[Index].AddressMode) {\r
       case LOAD_STORE_FORMAT1:\r
         // A6.5.1  <Rd>, [<Rn>, #<5_bit_offset>]\r
       switch (gOpThumb[Index].AddressMode) {\r
       case LOAD_STORE_FORMAT1:\r
         // A6.5.1  <Rd>, [<Rn>, #<5_bit_offset>]\r
@@ -414,12 +420,21 @@ DisassembleThumbInstruction (
   *OpCodePtrPtr += 1;\r
   for (Index = 0; Index < sizeof (gOpThumb2)/sizeof (THUMB_INSTRUCTIONS); Index++) {\r
     if ((OpCode32 & gOpThumb2[Index].Mask) == gOpThumb2[Index].OpCode) {\r
   *OpCodePtrPtr += 1;\r
   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   %a", OpCode32, gOpThumb2[Index].Start);   \r
+      } else {\r
+        Offset = AsciiSPrint (Buf, Size, "%a", gOpThumb2[Index].Start);   \r
+      }\r
+      switch (gOpThumb2[Index].AddressMode) {\r
+      }\r
     }\r
   }\r
 #endif\r
   // Unknown instruction is 16-bits\r
   *OpCodePtrPtr -= 1;\r
     }\r
   }\r
 #endif\r
   // Unknown instruction is 16-bits\r
   *OpCodePtrPtr -= 1;\r
-  AsciiSPrint (Buf, Size, "0x%04x", OpCode);\r
+  if (!Extended) {\r
+    AsciiSPrint (Buf, Size, "0x%04x", OpCode);\r
+  }\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -428,7 +443,8 @@ VOID
 DisassembleArmInstruction (\r
   IN  UINT32    **OpCodePtr,\r
   OUT CHAR8     *Buf,\r
 DisassembleArmInstruction (\r
   IN  UINT32    **OpCodePtr,\r
   OUT CHAR8     *Buf,\r
-  OUT UINTN     Size\r
+  OUT UINTN     Size,\r
+  IN  BOOLEAN   Extended\r
   );\r
 \r
 \r
   );\r
 \r
 \r
@@ -441,6 +457,7 @@ DisassembleArmInstruction (
    \r
   @param  OpCodePtrPtr  Pointer to pointer of ARM Thumb instruction to disassemble.  \r
   @param  Thumb         TRUE for Thumb(2), FALSE for ARM instruction stream\r
    \r
   @param  OpCodePtrPtr  Pointer to pointer of ARM Thumb instruction to disassemble.  \r
   @param  Thumb         TRUE for Thumb(2), FALSE for ARM instruction stream\r
+  @param  Extended      TRUE dump hex for instruction too.\r
   @param  Buf           Buffer to sprintf disassembly into.\r
   @param  Size          Size of Buf in bytes. \r
   \r
   @param  Buf           Buffer to sprintf disassembly into.\r
   @param  Size          Size of Buf in bytes. \r
   \r
@@ -449,14 +466,15 @@ VOID
 DisassembleInstruction (\r
   IN  UINT8     **OpCodePtr,\r
   IN  BOOLEAN   Thumb,\r
 DisassembleInstruction (\r
   IN  UINT8     **OpCodePtr,\r
   IN  BOOLEAN   Thumb,\r
+  IN  BOOLEAN   Extended,\r
   OUT CHAR8     *Buf,\r
   OUT UINTN     Size\r
   )\r
 {\r
   if (Thumb) {\r
   OUT CHAR8     *Buf,\r
   OUT UINTN     Size\r
   )\r
 {\r
   if (Thumb) {\r
-    DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size);\r
+    DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size, Extended);\r
   } else {\r
   } else {\r
-    DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size);\r
+    DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);\r
   }\r
 }\r
  \r
   }\r
 }\r
  \r
index b6fbb19f46837a06dbfda7f5b2873a1715a61753..a0f327d654dfdb07d68060633256cf33400b583a 100644 (file)
@@ -256,7 +256,7 @@ DefaultExceptionHandler (
       \r
       // If we come from an image it is safe to show the instruction. We know it should not fault\r
       DisAsm = (UINT8 *)(UINTN)SystemContext.SystemContextArm->PC;\r
       \r
       // If we come from an image it is safe to show the instruction. We know it should not fault\r
       DisAsm = (UINT8 *)(UINTN)SystemContext.SystemContextArm->PC;\r
-      DisassembleInstruction (&DisAsm, (SystemContext.SystemContextArm->CPSR & BIT5) == BIT5, Buffer, sizeof (Buffer));\r
+      DisassembleInstruction (&DisAsm, (SystemContext.SystemContextArm->CPSR & BIT5) == BIT5, TRUE, Buffer, sizeof (Buffer));\r
       DEBUG ((EFI_D_ERROR, "\n%a", Buffer));\r
 \r
     }\r
       DEBUG ((EFI_D_ERROR, "\n%a", Buffer));\r
 \r
     }\r
index b101049cad5a4243599cbb07c68693a394d5181a..6ce3f70f6dd0d2b53f4065493c0177b50260195c 100644 (file)
@@ -25,7 +25,7 @@
 #include <Library/UefiLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/EfiFileLib.h>\r
 #include <Library/UefiLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/EfiFileLib.h>\r
-\r
+#include <Library/ArmDisassemblerLib.h>\r
 \r
 //PcdEmbeddedFdBaseAddress\r
 \r
 \r
 //PcdEmbeddedFdBaseAddress\r
 \r
 \r
 **/\r
 EFI_STATUS\r
 \r
 **/\r
 EFI_STATUS\r
-EblEdk2Cmd (\r
+EblDisassembler (\r
   IN UINTN  Argc,\r
   IN CHAR8  **Argv\r
   )\r
 {\r
   IN UINTN  Argc,\r
   IN CHAR8  **Argv\r
   )\r
 {\r
+  UINT8   *Ptr;\r
+  UINT32  Address;\r
+  UINT32  Count;\r
+  CHAR8   Buffer[80];\r
+  \r
+  if (Argc < 2) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  Address = AsciiStrHexToUintn (Argv[1]);\r
+  Count   = (Argc > 2) ? (UINT32)AsciiStrHexToUintn (Argv[2]) : 10;\r
+\r
+  Ptr = (UINT8 *)(UINTN)Address;  \r
+  while (Count-- > 0) {\r
+    DisassembleInstruction (&Ptr, TRUE, TRUE, Buffer, sizeof (Buffer));\r
+    AsciiPrint ("0x%08x: %a", Address, Buffer);\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -54,10 +72,10 @@ EblEdk2Cmd (
 GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mLibCmdTemplate[] =\r
 {\r
   {\r
 GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mLibCmdTemplate[] =\r
 {\r
   {\r
-    "edk2",\r
-    " filename ; Load FD into memory and boot from it",\r
+    "disasm address [count]",\r
+    " disassemble count instructions",\r
     NULL,\r
     NULL,\r
-    EblEdk2Cmd\r
+    EblDisassembler\r
   }\r
 };\r
 \r
   }\r
 };\r
 \r
index 18074438c05322d8a958ded72430680f6e97a165..35903515173b75454241c5851b9716fd3285cdfc 100644 (file)
@@ -40,6 +40,7 @@
 [LibraryClasses]\r
   BaseLib\r
   DebugLib\r
 [LibraryClasses]\r
   BaseLib\r
   DebugLib\r
+  ArmDisassemblerLib\r
   \r
 [Protocols]\r
   \r
   \r
 [Protocols]\r
   \r