--- /dev/null
+/*++\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