]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbDisasm.c
MdeModulePkg/EbcDxe: add EBC Debugger
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbDisasm.c
diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbDisasm.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbDisasm.c
new file mode 100644 (file)
index 0000000..52800f7
--- /dev/null
@@ -0,0 +1,1907 @@
+/*++\r
+\r
+Copyright (c) 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  EdbDisasm.c\r
+\r
+Abstract:\r
+\r
+\r
+--*/\r
+\r
+#include "Edb.h"\r
+\r
+//\r
+// Debugger Disasm definition\r
+//\r
+#define EDB_DISASM_DEFINE(func) \\r
+UINTN \\r
+func ( \\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress, \\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext, \\r
+  OUT    CHAR16                    **DisasmString \\r
+  )\r
+\r
+EDB_DISASM_DEFINE (EdbDisasmBREAK);\r
+EDB_DISASM_DEFINE (EdbDisasmJMP);\r
+EDB_DISASM_DEFINE (EdbDisasmJMP8);\r
+EDB_DISASM_DEFINE (EdbDisasmCALL);\r
+EDB_DISASM_DEFINE (EdbDisasmRET);\r
+EDB_DISASM_DEFINE (EdbDisasmCMP);\r
+EDB_DISASM_DEFINE (EdbDisasmUnsignedDataManip);\r
+EDB_DISASM_DEFINE (EdbDisasmSignedDataManip);\r
+EDB_DISASM_DEFINE (EdbDisasmMOVxx);\r
+EDB_DISASM_DEFINE (EdbDisasmMOVsnw);\r
+EDB_DISASM_DEFINE (EdbDisasmMOVsnd);\r
+EDB_DISASM_DEFINE (EdbDisasmLOADSP);\r
+EDB_DISASM_DEFINE (EdbDisasmSTORESP);\r
+EDB_DISASM_DEFINE (EdbDisasmPUSH);\r
+EDB_DISASM_DEFINE (EdbDisasmPOP);\r
+EDB_DISASM_DEFINE (EdbDisasmCMPI);\r
+EDB_DISASM_DEFINE (EdbDisasmPUSHn);\r
+EDB_DISASM_DEFINE (EdbDisasmPOPn);\r
+EDB_DISASM_DEFINE (EdbDisasmMOVI);\r
+EDB_DISASM_DEFINE (EdbDisasmMOVIn);\r
+EDB_DISASM_DEFINE (EdbDisasmMOVREL);\r
+\r
+//\r
+// Debugger Disasm Table\r
+//\r
+EDB_DISASM_INSTRUCTION mEdbDisasmInstructionTable[] = {\r
+  EdbDisasmBREAK,             // opcode 0x00 BREAK\r
+  EdbDisasmJMP,               // opcode 0x01 JMP\r
+  EdbDisasmJMP8,              // opcode 0x02 JMP8\r
+  EdbDisasmCALL,              // opcode 0x03 CALL\r
+  EdbDisasmRET,               // opcode 0x04 RET\r
+  EdbDisasmCMP,               // opcode 0x05 CMPEQ\r
+  EdbDisasmCMP,               // opcode 0x06 CMPLTE\r
+  EdbDisasmCMP,               // opcode 0x07 CMPGTE\r
+  EdbDisasmCMP,               // opcode 0x08 CMPULTE\r
+  EdbDisasmCMP,               // opcode 0x09 CMPUGTE\r
+  EdbDisasmUnsignedDataManip, // opcode 0x0A NOT\r
+  EdbDisasmSignedDataManip,   // opcode 0x0B NEG\r
+  EdbDisasmSignedDataManip,   // opcode 0x0C ADD\r
+  EdbDisasmSignedDataManip,   // opcode 0x0D SUB\r
+  EdbDisasmSignedDataManip,   // opcode 0x0E MUL\r
+  EdbDisasmUnsignedDataManip, // opcode 0x0F MULU\r
+  EdbDisasmSignedDataManip,   // opcode 0x10 DIV\r
+  EdbDisasmUnsignedDataManip, // opcode 0x11 DIVU\r
+  EdbDisasmSignedDataManip,   // opcode 0x12 MOD\r
+  EdbDisasmUnsignedDataManip, // opcode 0x13 MODU\r
+  EdbDisasmUnsignedDataManip, // opcode 0x14 AND\r
+  EdbDisasmUnsignedDataManip, // opcode 0x15 OR\r
+  EdbDisasmUnsignedDataManip, // opcode 0x16 XOR\r
+  EdbDisasmUnsignedDataManip, // opcode 0x17 SHL\r
+  EdbDisasmUnsignedDataManip, // opcode 0x18 SHR\r
+  EdbDisasmSignedDataManip,   // opcode 0x19 ASHR\r
+  EdbDisasmUnsignedDataManip, // opcode 0x1A EXTNDB\r
+  EdbDisasmUnsignedDataManip, // opcode 0x1B EXTNDW\r
+  EdbDisasmUnsignedDataManip, // opcode 0x1C EXTNDD\r
+  EdbDisasmMOVxx,             // opcode 0x1D MOVBW\r
+  EdbDisasmMOVxx,             // opcode 0x1E MOVWW\r
+  EdbDisasmMOVxx,             // opcode 0x1F MOVDW\r
+  EdbDisasmMOVxx,             // opcode 0x20 MOVQW\r
+  EdbDisasmMOVxx,             // opcode 0x21 MOVBD\r
+  EdbDisasmMOVxx,             // opcode 0x22 MOVWD\r
+  EdbDisasmMOVxx,             // opcode 0x23 MOVDD\r
+  EdbDisasmMOVxx,             // opcode 0x24 MOVQD\r
+  EdbDisasmMOVsnw,            // opcode 0x25 MOVSNW\r
+  EdbDisasmMOVsnd,            // opcode 0x26 MOVSND\r
+  NULL,                       // opcode 0x27\r
+  EdbDisasmMOVxx,             // opcode 0x28 MOVQQ\r
+  EdbDisasmLOADSP,            // opcode 0x29 LOADSP\r
+  EdbDisasmSTORESP,           // opcode 0x2A STORESP\r
+  EdbDisasmPUSH,              // opcode 0x2B PUSH\r
+  EdbDisasmPOP,               // opcode 0x2C POP\r
+  EdbDisasmCMPI,              // opcode 0x2D CMPIEQ\r
+  EdbDisasmCMPI,              // opcode 0x2E CMPILTE\r
+  EdbDisasmCMPI,              // opcode 0x2F CMPIGTE\r
+  EdbDisasmCMPI,              // opcode 0x30 CMPIULTE\r
+  EdbDisasmCMPI,              // opcode 0x31 CMPIUGTE\r
+  EdbDisasmMOVxx,             // opcode 0x32 MOVNW\r
+  EdbDisasmMOVxx,             // opcode 0x33 MOVND\r
+  NULL,                       // opcode 0x34\r
+  EdbDisasmPUSHn,             // opcode 0x35 PUSHN\r
+  EdbDisasmPOPn,              // opcode 0x36 POPN\r
+  EdbDisasmMOVI,              // opcode 0x37 MOVI\r
+  EdbDisasmMOVIn,             // opcode 0x38 MOVIN\r
+  EdbDisasmMOVREL,            // opcode 0x39 MOVREL\r
+};\r
+\r
+UINTN\r
+EdbDisasmBREAK (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - BREAK\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_BREAK);\r
+\r
+  if (*(UINT8 *)(UINTN)(InstructionAddress + 1) > 6) {\r
+    return 0;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"BREAK");\r
+    EdbPrintDatan (*(UINT8 *)(UINTN)(InstructionAddress + 1));\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return 2;\r
+}\r
+\r
+extern CONST UINT8                    mJMPLen[];\r
+\r
+UINTN\r
+EdbDisasmJMP (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - JMP\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8   Modifiers;\r
+  UINT8   Operands;\r
+  UINTN   Size;\r
+  UINT32  Data32;\r
+  UINT64  Data64;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_JMP);\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Size = (UINTN)mJMPLen[(Modifiers >> 6) & 0x03];\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"JMP");\r
+//    if (Modifiers & OPCODE_M_IMMDATA64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+    if (Modifiers & CONDITION_M_CONDITIONAL) {\r
+      if (Modifiers & JMP_M_CS) {\r
+        EdbPrintInstructionName (L"cs");\r
+      } else {\r
+        EdbPrintInstructionName (L"cc");\r
+      }\r
+    }\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & OPCODE_M_IMMDATA64) {\r
+      CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+      if (Modifiers & OPCODE_M_IMMDATA) {\r
+        EdbPrintData64 (Data64);\r
+      } else {\r
+        return 0;\r
+      }\r
+    } else {\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      EdbPrintRegister1 (Operands);\r
+\r
+      if ((Operands & OPERAND_M_INDIRECT1) == 0) {\r
+        if ((Modifiers & OPCODE_M_IMMDATA) == 0) {\r
+          Data32 = 0;\r
+        }\r
+        EdbPrintImmDatan (Data32);\r
+      } else {\r
+        EdbPrintRawIndexData32 (Data32);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmJMP8 (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - JMP8\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8   Modifiers;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_JMP8);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"JMP8");\r
+    if (Modifiers & CONDITION_M_CONDITIONAL) {\r
+      if (Modifiers & JMP_M_CS) {\r
+        EdbPrintInstructionName (L"cs");\r
+      } else {\r
+        EdbPrintInstructionName (L"cc");\r
+      }\r
+    }\r
+\r
+    EdbPrintData8 (*(UINT8 *)(UINTN)(InstructionAddress + 1));\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return 2;\r
+}\r
+\r
+UINTN\r
+EdbDisasmCALL (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - CALL\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8   Modifiers;\r
+  UINT8   Operands;\r
+  UINTN   Size;\r
+  UINT32  Data32;\r
+  UINT64  Data64;\r
+  UINT64  Ip;\r
+  UINTN   Result;\r
+  EFI_PHYSICAL_ADDRESS      SavedInstructionAddress;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_CALL);\r
+  SavedInstructionAddress = InstructionAddress;\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Size = (UINTN)mJMPLen[(Modifiers >> 6) & 0x03];\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"CALL");\r
+//    if (Modifiers & OPCODE_M_IMMDATA64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+    if (Operands & OPERAND_M_NATIVE_CALL) {\r
+      EdbPrintInstructionName (L"EX");\r
+    }\r
+//    if ((Operands & OPERAND_M_RELATIVE_ADDR) == 0) {\r
+//      EdbPrintInstructionName (L"a");\r
+//    }\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & OPCODE_M_IMMDATA64) {\r
+      CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+      Ip = Data64;\r
+      if (Modifiers & OPCODE_M_IMMDATA) {\r
+        Result = EdbFindAndPrintSymbol ((UINTN)Ip);\r
+        if (Result == 0) {\r
+          EdbPrintData64 (Data64);\r
+        }\r
+      } else {\r
+        return 0;\r
+      }\r
+    } else {\r
+      if (Modifiers & OPCODE_M_IMMDATA) {\r
+        CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      } else {\r
+        Data32 = 0;\r
+      }\r
+\r
+      if ((Operands & OPERAND_M_OP1) == 0) {\r
+        Ip = (UINT64)Data32;\r
+      } else {\r
+        Ip = GetRegisterValue (SystemContext, (Operands & OPERAND_M_OP1));\r
+      }\r
+\r
+      if ((Operands & OPERAND_M_INDIRECT1) == 0) {\r
+        if (Operands & OPERAND_M_RELATIVE_ADDR) {\r
+          Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Ip + Size));\r
+        } else {\r
+          Result = EdbFindAndPrintSymbol ((UINTN)Ip);\r
+        }\r
+        if (Result == 0) {\r
+          EdbPrintRegister1 (Operands);\r
+          if (Modifiers & OPCODE_M_IMMDATA) {\r
+            EdbPrintImmData32 (Data32);\r
+          }\r
+        }\r
+      } else {\r
+        EdbPrintRegister1 (Operands);\r
+        if (Modifiers & OPCODE_M_IMMDATA) {\r
+          EdbPrintRawIndexData32 (Data32);\r
+        }\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmRET (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - RET\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_RET);\r
+\r
+  if (*(UINT8 *)(UINTN)(InstructionAddress + 1) != 0) {\r
+    return 0;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"RET");\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return 2;\r
+}\r
+\r
+UINTN\r
+EdbDisasmCMP (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - CMP\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Opcode;\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINT16 Data16;\r
+  UINTN  Size;\r
+\r
+  ASSERT (\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPEQ)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPLTE)  ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPGTE)  ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPULTE) ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPUGTE)\r
+    );\r
+\r
+  Opcode     = GET_OPCODE (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  if (Modifiers & OPCODE_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"CMP");\r
+//    if (Modifiers & OPCODE_M_64BIT) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+    switch (Opcode) {\r
+    case OPCODE_CMPEQ:\r
+      EdbPrintInstructionName (L"eq");\r
+      break;\r
+    case OPCODE_CMPLTE:\r
+      EdbPrintInstructionName (L"lte");\r
+      break;\r
+    case OPCODE_CMPGTE:\r
+      EdbPrintInstructionName (L"gte");\r
+      break;\r
+    case OPCODE_CMPULTE:\r
+      EdbPrintInstructionName (L"ulte");\r
+      break;\r
+    case OPCODE_CMPUGTE:\r
+      EdbPrintInstructionName (L"ugte");\r
+      break;\r
+    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+    InstructionAddress += 2;\r
+\r
+    EdbPrintComma ();\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    if (Modifiers & OPCODE_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT2) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmUnsignedDataManip (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - Unsigned Data Manipulate\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Opcode;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_NOT)    ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MULU)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_DIVU)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MODU)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_AND)    ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_OR)     ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_XOR)    ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_SHL)    ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_SHR)    ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_EXTNDB) ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_EXTNDW) ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_EXTNDD)\r
+    );\r
+\r
+  Opcode     = GET_OPCODE (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  if (Modifiers & DATAMANIP_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    switch (Opcode) {\r
+    case OPCODE_NOT:\r
+      EdbPrintInstructionName (L"NOT");\r
+      break;\r
+    case OPCODE_MULU:\r
+      EdbPrintInstructionName (L"MULU");\r
+      break;\r
+    case OPCODE_DIVU:\r
+      EdbPrintInstructionName (L"DIVU");\r
+      break;\r
+    case OPCODE_MODU:\r
+      EdbPrintInstructionName (L"MODU");\r
+      break;\r
+    case OPCODE_AND:\r
+      EdbPrintInstructionName (L"AND");\r
+      break;\r
+    case OPCODE_OR:\r
+      EdbPrintInstructionName (L"OR");\r
+      break;\r
+    case OPCODE_XOR:\r
+      EdbPrintInstructionName (L"XOR");\r
+      break;\r
+    case OPCODE_SHL:\r
+      EdbPrintInstructionName (L"SHL");\r
+      break;\r
+    case OPCODE_SHR:\r
+      EdbPrintInstructionName (L"SHR");\r
+      break;\r
+    case OPCODE_EXTNDB:\r
+      EdbPrintInstructionName (L"EXTNDB");\r
+      break;\r
+    case OPCODE_EXTNDW:\r
+      EdbPrintInstructionName (L"EXTNDW");\r
+      break;\r
+    case OPCODE_EXTNDD:\r
+      EdbPrintInstructionName (L"EXTNDD");\r
+      break;\r
+    }\r
+//    if (Modifiers & DATAMANIP_M_64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+    EdbPrintComma ();\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & DATAMANIP_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT2) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmSignedDataManip (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - Signed Data Manipulate\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Opcode;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_NEG)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_ADD)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_SUB)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MUL)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_DIV)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOD)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_ASHR)\r
+    );\r
+\r
+  Opcode     = GET_OPCODE (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  if (Modifiers & DATAMANIP_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    switch (Opcode) {\r
+    case OPCODE_NEG:\r
+      EdbPrintInstructionName (L"NEG");\r
+      break;\r
+    case OPCODE_ADD:\r
+      EdbPrintInstructionName (L"ADD");\r
+      break;\r
+    case OPCODE_SUB:\r
+      EdbPrintInstructionName (L"SUB");\r
+      break;\r
+    case OPCODE_MUL:\r
+      EdbPrintInstructionName (L"MUL");\r
+      break;\r
+    case OPCODE_DIV:\r
+      EdbPrintInstructionName (L"DIV");\r
+      break;\r
+    case OPCODE_MOD:\r
+      EdbPrintInstructionName (L"MOD");\r
+      break;\r
+    case OPCODE_ASHR:\r
+      EdbPrintInstructionName (L"ASHR");\r
+      break;\r
+    }\r
+//    if (Modifiers & DATAMANIP_M_64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+    EdbPrintComma ();\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & DATAMANIP_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT2) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmMOVxx (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - MOVxx\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8   Modifiers;\r
+  UINT8   Opcode;\r
+  UINT8   Operands;\r
+  UINTN   Size;\r
+  UINT16  Data16;\r
+  UINT32  Data32;\r
+  UINT64  Data64;\r
+\r
+  ASSERT (\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVBW)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVWW)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVDW)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVQW)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVBD)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVWD)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVDD)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVQD)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVQQ)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVNW)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_MOVND)\r
+    );\r
+\r
+  Opcode     = GET_OPCODE (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Size = 2;\r
+  if (Modifiers & (OPCODE_M_IMMED_OP1 | OPCODE_M_IMMED_OP2)) {\r
+    if ((Opcode <= OPCODE_MOVQW) || (Opcode == OPCODE_MOVNW)) {\r
+      if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+        Size += 2;\r
+      }\r
+      if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+        Size += 2;\r
+      }\r
+    } else if ((Opcode <= OPCODE_MOVQD) || (Opcode == OPCODE_MOVND)) {\r
+      if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+        Size += 4;\r
+      }\r
+      if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+        Size += 4;\r
+      }\r
+    } else if (Opcode == OPCODE_MOVQQ) {\r
+      if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+        Size += 8;\r
+      }\r
+      if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+        Size += 8;\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"MOV");\r
+    switch (Opcode) {\r
+    case OPCODE_MOVBW:\r
+      EdbPrintInstructionName (L"bw");\r
+      break;\r
+    case OPCODE_MOVWW:\r
+      EdbPrintInstructionName (L"ww");\r
+      break;\r
+    case OPCODE_MOVDW:\r
+      EdbPrintInstructionName (L"dw");\r
+      break;\r
+    case OPCODE_MOVQW:\r
+      EdbPrintInstructionName (L"qw");\r
+      break;\r
+    case OPCODE_MOVBD:\r
+      EdbPrintInstructionName (L"bd");\r
+      break;\r
+    case OPCODE_MOVWD:\r
+      EdbPrintInstructionName (L"wd");\r
+      break;\r
+    case OPCODE_MOVDD:\r
+      EdbPrintInstructionName (L"dd");\r
+      break;\r
+    case OPCODE_MOVQD:\r
+      EdbPrintInstructionName (L"qd");\r
+      break;\r
+    case OPCODE_MOVQQ:\r
+      EdbPrintInstructionName (L"qq");\r
+      break;\r
+    case OPCODE_MOVNW:\r
+      EdbPrintInstructionName (L"nw");\r
+      break;\r
+    case OPCODE_MOVND:\r
+      EdbPrintInstructionName (L"nd");\r
+      break;\r
+    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+      if ((Opcode <= OPCODE_MOVQW) || (Opcode == OPCODE_MOVNW)) {\r
+        CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+        InstructionAddress += 2;\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else if ((Opcode <= OPCODE_MOVQD) || (Opcode == OPCODE_MOVND)) {\r
+        CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+        InstructionAddress += 4;\r
+        EdbPrintRawIndexData32 (Data32);\r
+      } else if (Opcode == OPCODE_MOVQQ) {\r
+        CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+        InstructionAddress += 8;\r
+        EdbPrintRawIndexData64 (Data64);\r
+      }\r
+    }\r
+\r
+    EdbPrintComma ();\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+      if ((Opcode <= OPCODE_MOVQW) || (Opcode == OPCODE_MOVNW)) {\r
+        CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else if ((Opcode <= OPCODE_MOVQD) || (Opcode == OPCODE_MOVND)) {\r
+        CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+        EdbPrintRawIndexData32 (Data32);\r
+      } else if (Opcode == OPCODE_MOVQQ) {\r
+        CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+        EdbPrintRawIndexData64 (Data64);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmMOVsnw (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - MOVsnw\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVSNW);\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Size = 2;\r
+  if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+    Size += 2;\r
+  }\r
+  if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+    Size += 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"MOVsnw");\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      InstructionAddress += 2;\r
+      EdbPrintRawIndexData16 (Data16);\r
+    }\r
+\r
+    EdbPrintComma ();\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT2) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmMOVsnd (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - MOVsnd\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT32 Data32;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVSND);\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Size = 2;\r
+  if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+    Size += 4;\r
+  }\r
+  if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+    Size += 4;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"MOVsnd");\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & OPCODE_M_IMMED_OP1) {\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      InstructionAddress += 4;\r
+      EdbPrintRawIndexData32 (Data32);\r
+    }\r
+\r
+    EdbPrintComma ();\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    if (Modifiers & OPCODE_M_IMMED_OP2) {\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      if (Operands & OPERAND_M_INDIRECT2) {\r
+        EdbPrintRawIndexData32 (Data32);\r
+      } else {\r
+        EdbPrintImmDatan (Data32);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmLOADSP (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - LOADSP\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Operands;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_LOADSP);\r
+\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"LOADSP");\r
+\r
+    EdbPrintDedicatedRegister1 (Operands);\r
+\r
+    EdbPrintRegister2 (Operands);\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return 2;\r
+}\r
+\r
+UINTN\r
+EdbDisasmSTORESP (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - STORESP\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Operands;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_STORESP);\r
+\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"STORESP");\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    EdbPrintDedicatedRegister2 (Operands);\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return 2;\r
+}\r
+\r
+UINTN\r
+EdbDisasmPUSH (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - PUSH\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_PUSH);\r
+\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"PUSH");\r
+//    if (Modifiers & PUSHPOP_M_64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT1) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmPOP (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - POP\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_POP);\r
+\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"POP");\r
+//    if (Modifiers & PUSHPOP_M_64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT1) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmCMPI (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - CMPI\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Opcode;\r
+  UINT8  Operands;\r
+  UINT16 Data16;\r
+  UINT32 Data32;\r
+  UINTN  Size;\r
+\r
+  ASSERT (\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPIEQ)   ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPILTE)  ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPIGTE)  ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPIULTE) ||\r
+    (GET_OPCODE(InstructionAddress) == OPCODE_CMPIUGTE)\r
+    );\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Opcode     = GET_OPCODE (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+\r
+  if ((Operands & 0xE0) != 0) {\r
+    return 0;\r
+  }\r
+\r
+  Size = 2;\r
+  if (Operands & OPERAND_M_CMPI_INDEX) {\r
+    Size += 2;\r
+  }\r
+  if (Modifiers & OPCODE_M_CMPI32_DATA) {\r
+    Size += 4;\r
+  } else {\r
+    Size += 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"CMPI");\r
+//    if (Modifiers & OPCODE_M_CMPI64) {\r
+//      EdbPrintInstructionName (L"64");\r
+//    } else {\r
+//      EdbPrintInstructionName (L"32");\r
+//    }\r
+    if (Modifiers & OPCODE_M_CMPI32_DATA) {\r
+      EdbPrintInstructionName (L"d");\r
+    } else {\r
+      EdbPrintInstructionName (L"w");\r
+    }\r
+    switch (Opcode) {\r
+    case OPCODE_CMPIEQ:\r
+      EdbPrintInstructionName (L"eq");\r
+      break;\r
+    case OPCODE_CMPILTE:\r
+      EdbPrintInstructionName (L"lte");\r
+      break;\r
+    case OPCODE_CMPIGTE:\r
+      EdbPrintInstructionName (L"gte");\r
+      break;\r
+    case OPCODE_CMPIULTE:\r
+      EdbPrintInstructionName (L"ulte");\r
+      break;\r
+    case OPCODE_CMPIUGTE:\r
+      EdbPrintInstructionName (L"ugte");\r
+      break;\r
+    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Operands & OPERAND_M_CMPI_INDEX) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      InstructionAddress += 2;\r
+      EdbPrintRawIndexData16 (Data16);\r
+    }\r
+\r
+    EdbPrintComma ();\r
+\r
+    if (Modifiers & OPCODE_M_CMPI32_DATA) {\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      EdbPrintDatan (Data32);\r
+    } else {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      EdbPrintDatan (Data16);\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmPUSHn (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - PUSHn\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_PUSHN);\r
+\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"PUSHn");\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT1) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmPOPn (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - POPn\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_POPN);\r
+\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+    Size = 4;\r
+  } else {\r
+    Size = 2;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"POPn");\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Modifiers & PUSHPOP_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      if (Operands & OPERAND_M_INDIRECT1) {\r
+        EdbPrintRawIndexData16 (Data16);\r
+      } else {\r
+        EdbPrintImmDatan (Data16);\r
+      }\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmMOVI (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - MOVI\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+  UINT32 Data32;\r
+  UINT64 Data64;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVI);\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+\r
+  if (Operands & MOVI_M_IMMDATA) {\r
+    Size    = 4;\r
+  } else {\r
+    Size    = 2;\r
+  }\r
+  if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) {\r
+    Size += 2;\r
+  } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) {\r
+    Size += 4;\r
+  } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) {\r
+    Size += 8;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"MOVI");\r
+    switch (Operands & MOVI_M_MOVEWIDTH) {\r
+    case MOVI_MOVEWIDTH8:\r
+      EdbPrintInstructionName (L"b");\r
+      break;\r
+    case MOVI_MOVEWIDTH16:\r
+      EdbPrintInstructionName (L"w");\r
+      break;\r
+    case MOVI_MOVEWIDTH32:\r
+      EdbPrintInstructionName (L"d");\r
+      break;\r
+    case MOVI_MOVEWIDTH64:\r
+      EdbPrintInstructionName (L"q");\r
+      break;\r
+    }\r
+    switch (Modifiers & MOVI_M_DATAWIDTH) {\r
+    case MOVI_DATAWIDTH16:\r
+      EdbPrintInstructionName (L"w");\r
+      break;\r
+    case MOVI_DATAWIDTH32:\r
+      EdbPrintInstructionName (L"d");\r
+      break;\r
+    case MOVI_DATAWIDTH64:\r
+      EdbPrintInstructionName (L"q");\r
+      break;\r
+    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Operands & MOVI_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      InstructionAddress += 2;\r
+      EdbPrintRawIndexData16 (Data16);\r
+    }\r
+\r
+    EdbPrintComma ();\r
+\r
+    switch (Modifiers & MOVI_M_DATAWIDTH) {\r
+    case MOVI_DATAWIDTH16:\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      EdbPrintDatan (Data16);\r
+      break;\r
+    case MOVI_DATAWIDTH32:\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      EdbPrintDatan (Data32);\r
+      break;\r
+    case MOVI_DATAWIDTH64:\r
+      CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+      EdbPrintData64n (Data64);\r
+      break;\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmMOVIn (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - MOVIn\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8  Modifiers;\r
+  UINT8  Operands;\r
+  UINTN  Size;\r
+  UINT16 Data16;\r
+  UINT32 Data32;\r
+  UINT64 Data64;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVIN);\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+\r
+  if (Operands & MOVI_M_IMMDATA) {\r
+    Size    = 4;\r
+  } else {\r
+    Size    = 2;\r
+  }\r
+  if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) {\r
+    Size += 2;\r
+  } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) {\r
+    Size += 4;\r
+  } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) {\r
+    Size += 8;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"MOVIn");\r
+    switch (Modifiers & MOVI_M_DATAWIDTH) {\r
+    case MOVI_DATAWIDTH16:\r
+      EdbPrintInstructionName (L"w");\r
+      break;\r
+    case MOVI_DATAWIDTH32:\r
+      EdbPrintInstructionName (L"d");\r
+      break;\r
+    case MOVI_DATAWIDTH64:\r
+      EdbPrintInstructionName (L"q");\r
+      break;\r
+    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Operands & MOVI_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      InstructionAddress += 2;\r
+      EdbPrintRawIndexData16 (Data16);\r
+    }\r
+\r
+    EdbPrintComma ();\r
+\r
+    switch (Modifiers & MOVI_M_DATAWIDTH) {\r
+    case MOVI_DATAWIDTH16:\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      EdbPrintRawIndexData16 (Data16);\r
+      break;\r
+    case MOVI_DATAWIDTH32:\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      EdbPrintRawIndexData32 (Data32);\r
+      break;\r
+    case MOVI_DATAWIDTH64:\r
+      CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+      EdbPrintRawIndexData64 (Data64);\r
+      break;\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r
+\r
+UINTN\r
+EdbDisasmMOVREL (\r
+  IN     EFI_PHYSICAL_ADDRESS      InstructionAddress,\r
+  IN     EFI_SYSTEM_CONTEXT        SystemContext,\r
+  OUT    CHAR16                    **DisasmString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Disasm instruction - MOVREL\r
+\r
+Arguments:\r
+\r
+  InstructionAddress - The instruction address\r
+  SystemContext      - EBC system context.\r
+  DisasmString       - The instruction string\r
+\r
+Returns:\r
+\r
+  Instruction length\r
+\r
+--*/\r
+{\r
+  UINT8   Modifiers;\r
+  UINT8   Operands;\r
+  UINTN   Size;\r
+  UINT16  Data16;\r
+  UINT32  Data32;\r
+  UINT64  Data64;\r
+  UINTN   Result;\r
+  EFI_PHYSICAL_ADDRESS      SavedInstructionAddress;\r
+\r
+  ASSERT (GET_OPCODE(InstructionAddress) == OPCODE_MOVREL);\r
+  SavedInstructionAddress = InstructionAddress;\r
+\r
+  Modifiers  = GET_MODIFIERS (InstructionAddress);\r
+  Operands   = GET_OPERANDS (InstructionAddress);\r
+\r
+  if (Operands & MOVI_M_IMMDATA) {\r
+    Size    = 4;\r
+  } else {\r
+    Size    = 2;\r
+  }\r
+  if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH16) {\r
+    Size += 2;\r
+  } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH32) {\r
+    Size += 4;\r
+  } else if ((Modifiers & MOVI_M_DATAWIDTH) == MOVI_DATAWIDTH64) {\r
+    Size += 8;\r
+  } else {\r
+    return 0;\r
+  }\r
+\r
+  //\r
+  // Construct Disasm String\r
+  //\r
+  if (DisasmString != NULL) {\r
+    *DisasmString = EdbPreInstructionString ();\r
+\r
+    EdbPrintInstructionName (L"MOVrel");\r
+    switch (Modifiers & MOVI_M_DATAWIDTH) {\r
+    case MOVI_DATAWIDTH16:\r
+      EdbPrintInstructionName (L"w");\r
+      break;\r
+    case MOVI_DATAWIDTH32:\r
+      EdbPrintInstructionName (L"d");\r
+      break;\r
+    case MOVI_DATAWIDTH64:\r
+      EdbPrintInstructionName (L"q");\r
+      break;\r
+    }\r
+\r
+    EdbPrintRegister1 (Operands);\r
+\r
+    InstructionAddress += 2;\r
+    if (Operands & MOVI_M_IMMDATA) {\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      InstructionAddress += 2;\r
+      EdbPrintRawIndexData16 (Data16);\r
+    }\r
+\r
+    EdbPrintComma ();\r
+\r
+    switch (Modifiers & MOVI_M_DATAWIDTH) {\r
+    case MOVI_DATAWIDTH16:\r
+      CopyMem (&Data16, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT16));\r
+      Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Size + (INT16)Data16));\r
+      if (Result == 0) {\r
+        EdbPrintData16 (Data16);\r
+      }\r
+      break;\r
+    case MOVI_DATAWIDTH32:\r
+      CopyMem (&Data32, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT32));\r
+      Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Size + (INT32)Data32));\r
+      if (Result == 0) {\r
+        EdbPrintData32 (Data32);\r
+      }\r
+      break;\r
+    case MOVI_DATAWIDTH64:\r
+      CopyMem (&Data64, (VOID *)(UINTN)(InstructionAddress), sizeof(UINT64));\r
+      if (sizeof(UINTN) == sizeof(UINT64)) {\r
+        Result = EdbFindAndPrintSymbol ((UINTN)(SavedInstructionAddress + Size + (INT64)Data64));\r
+      } else {\r
+        Result = 0;\r
+      }\r
+      if (Result == 0) {\r
+        EdbPrintData64 (Data64);\r
+      }\r
+      break;\r
+    }\r
+\r
+    EdbPostInstructionString ();\r
+  }\r
+\r
+  return Size;\r
+}\r