@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
- OUT UINTN Size\r
+ OUT UINTN Size,\r
+ IN BOOLEAN Extended\r
)\r
{\r
UINT32 OpCode = **OpCodePtr;\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
@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
- OUT UINTN Size\r
+ OUT UINTN Size,\r
+ IN BOOLEAN Extended\r
)\r
{\r
UINT16 *OpCodePtr;\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
*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
- AsciiSPrint (Buf, Size, "0x%04x", OpCode);\r
+ if (!Extended) {\r
+ AsciiSPrint (Buf, Size, "0x%04x", OpCode);\r
+ }\r
}\r
\r
\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
@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
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
- DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size);\r
+ DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size, Extended);\r
} else {\r
- DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size);\r
+ DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);\r
}\r
}\r
\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
**/\r
EFI_STATUS\r
-EblEdk2Cmd (\r
+EblDisassembler (\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
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
- EblEdk2Cmd\r
+ EblDisassembler\r
}\r
};\r
\r