/** @file Copyright (c) 2007, Intel Corporation. All rights reserved.
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; }