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