From af1a266670d040d2f4083ff309d732d648afba2a Mon Sep 17 00:00:00 2001
From: Angelos Mouzakitis <a.mouzakitis@virtualopensystems.com>
Date: Tue, 10 Oct 2023 14:33:42 +0000
Subject: Add submodule dependency files

Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
---
 .../Universal/EbcDxe/EbcDebugger/EdbDisasm.c       | 1770 ++++++++++++++++++++
 1 file changed, 1770 insertions(+)
 create mode 100644 roms/edk2/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbDisasm.c

(limited to 'roms/edk2/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbDisasm.c')

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