/** @file Copyright (c) 2007, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _EFI_EDB_COMMON_H_ #define _EFI_EDB_COMMON_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef UINTN EFI_DEBUG_STATUS; typedef struct _EFI_DEBUGGER_PRIVATE_DATA EFI_DEBUGGER_PRIVATE_DATA; // // Definition for Debugger Command // typedef EFI_DEBUG_STATUS (* EFI_DEBUGGER_COMMAND) ( IN CHAR16 *CommandArg, IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN EFI_EXCEPTION_TYPE ExceptionType, IN OUT EFI_SYSTEM_CONTEXT SystemContext ); typedef struct { CHAR16 *CommandName; CHAR16 *CommandTitle; CHAR16 *CommandHelp; CHAR16 *CommandSyntax; CHAR16 *ClassName; EFI_INPUT_KEY CommandKey; EFI_DEBUGGER_COMMAND CommandFunc; } EFI_DEBUGGER_COMMAND_SET; // // Definition for Debugger Symbol // #define EFI_DEBUGGER_SYMBOL_NAME_MAX 256 #define EFI_DEBUGGER_SYMBOL_ENTRY_MAX 512 #define EFI_DEBUGGER_SYMBOL_OBJECT_MAX 32 // // We have following SYMBOL data structure: // // SYMBOL_CONTEXT -> SYMBOL_OBJECT -> SYMBOL_ENTRY (FuncXXX, 0xXXX) // SYMBOL_ENTRY (VarYYY, 0xYYY) // SYMBOL_ENTRY // // SYMBOL_OBJECT -> SYMBOL_ENTRY // SYMBOL_ENTRY // // SYMBOL_OBJECT -> SYMBOL_ENTRY // SYMBOL_ENTRY // typedef enum { EfiDebuggerSymbolFunction, EfiDebuggerSymbolStaticFunction, EfiDebuggerSymbolGlobalVariable, EfiDebuggerSymbolStaticVariable, EfiDebuggerSymbolTypeMax, } EFI_DEBUGGER_SYMBOL_TYPE; typedef struct { CHAR8 Name[EFI_DEBUGGER_SYMBOL_NAME_MAX]; UINTN Rva; EFI_DEBUGGER_SYMBOL_TYPE Type; CHAR8 ObjName[EFI_DEBUGGER_SYMBOL_NAME_MAX]; CHAR8 *CodBuffer; UINTN CodBufferSize; UINTN FuncOffsetBase; CHAR8 *SourceBuffer; } EFI_DEBUGGER_SYMBOL_ENTRY; typedef struct { CHAR16 Name[EFI_DEBUGGER_SYMBOL_NAME_MAX]; UINTN EntryCount; UINTN MaxEntryCount; UINTN BaseAddress; UINTN StartEntrypointRVA; UINTN MainEntrypointRVA; EFI_DEBUGGER_SYMBOL_ENTRY *Entry; VOID **SourceBuffer; } EFI_DEBUGGER_SYMBOL_OBJECT; typedef struct { UINTN ObjectCount; UINTN MaxObjectCount; EFI_DEBUGGER_SYMBOL_OBJECT *Object; BOOLEAN DisplaySymbol; BOOLEAN DisplayCodeOnly; } EFI_DEBUGGER_SYMBOL_CONTEXT; // // Definition for Debugger Breakpoint // #define EFI_DEBUGGER_BREAKPOINT_MAX 0x10 typedef struct { EFI_PHYSICAL_ADDRESS BreakpointAddress; UINT64 OldInstruction; // UINT64 is enough for an instruction BOOLEAN State; } EFI_DEBUGGER_BREAKPOINT_CONTEXT; // // Definition for Debugger Call-Stack // #define EFI_DEBUGGER_CALLSTACK_MAX 0x10 typedef enum { EfiDebuggerBranchTypeEbcCall, EfiDebuggerBranchTypeEbcCallEx, EfiDebuggerBranchTypeEbcRet, EfiDebuggerBranchTypeEbcJmp, EfiDebuggerBranchTypeEbcJmp8, EfiDebuggerBranchTypeEbcMax, } EFI_DEBUGGER_BRANCH_TYPE; #define EFI_DEBUGGER_CALL_MAX_PARAMETER 0x16 #define EFI_DEBUGGER_CALL_DEFAULT_PARAMETER 0x8 typedef struct { EFI_PHYSICAL_ADDRESS SourceAddress; EFI_PHYSICAL_ADDRESS DestAddress; // // We save all parameter here, because code may update the parameter as local variable. // UINTN ParameterAddr; UINTN Parameter[EFI_DEBUGGER_CALL_MAX_PARAMETER]; EFI_DEBUGGER_BRANCH_TYPE Type; } EFI_DEBUGGER_CALLSTACK_CONTEXT; // // Definition for Debugger Trace // #define EFI_DEBUGGER_TRACE_MAX 0x10 typedef struct { EFI_PHYSICAL_ADDRESS SourceAddress; EFI_PHYSICAL_ADDRESS DestAddress; EFI_DEBUGGER_BRANCH_TYPE Type; } EFI_DEBUGGER_TRACE_CONTEXT; // // Definition for Debugger Step // typedef struct { EFI_PHYSICAL_ADDRESS BreakAddress; EFI_PHYSICAL_ADDRESS FramePointer; } EFI_DEBUGGER_STEP_CONTEXT; // // Definition for Debugger GoTil // typedef struct { EFI_PHYSICAL_ADDRESS BreakAddress; } EFI_DEBUGGER_GOTIL_CONTEXT; // // Definition for Debugger private data structure // #define EFI_DEBUGGER_SIGNATURE SIGNATURE_32 ('e', 'd', 'b', '!') #define EFI_DEBUG_DEFAULT_INSTRUCTION_NUMBER 5 #define EFI_DEBUG_BREAK_TIMER_INTERVAL 10000000 // 1 second #define EFI_DEBUG_FLAG_EBC 0x80000000 #define EFI_DEBUG_FLAG_EBC_B_BOC 0x1 #define EFI_DEBUG_FLAG_EBC_B_BOCX 0x2 #define EFI_DEBUG_FLAG_EBC_B_BOR 0x4 #define EFI_DEBUG_FLAG_EBC_B_BOE 0x8 #define EFI_DEBUG_FLAG_EBC_B_BOT 0x10 #define EFI_DEBUG_FLAG_EBC_B_STEPOVER 0x20 #define EFI_DEBUG_FLAG_EBC_B_STEPOUT 0x40 #define EFI_DEBUG_FLAG_EBC_B_BP 0x80 #define EFI_DEBUG_FLAG_EBC_B_GT 0x100 #define EFI_DEBUG_FLAG_EBC_B_BOK 0x200 #define EFI_DEBUG_FLAG_EBC_BOC (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOC) #define EFI_DEBUG_FLAG_EBC_BOCX (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOCX) #define EFI_DEBUG_FLAG_EBC_BOR (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOR) #define EFI_DEBUG_FLAG_EBC_BOE (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOE) #define EFI_DEBUG_FLAG_EBC_BOT (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOT) #define EFI_DEBUG_FLAG_EBC_STEPOVER (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_STEPOVER) #define EFI_DEBUG_FLAG_EBC_STEPOUT (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_STEPOUT) #define EFI_DEBUG_FLAG_EBC_BP (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BP) #define EFI_DEBUG_FLAG_EBC_GT (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_GT) #define EFI_DEBUG_FLAG_EBC_BOK (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOK) // // Debugger private data structure // typedef struct _EFI_DEBUGGER_PRIVATE_DATA { UINT32 Signature; EFI_INSTRUCTION_SET_ARCHITECTURE Isa; UINT32 EfiDebuggerRevision; UINT32 EbcVmRevision; EFI_DEBUGGER_CONFIGURATION_PROTOCOL DebuggerConfiguration; EFI_DEBUG_IMAGE_INFO_TABLE_HEADER *DebugImageInfoTableHeader; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; EFI_DEBUGGER_COMMAND_SET *DebuggerCommandSet; EFI_DEBUGGER_SYMBOL_CONTEXT DebuggerSymbolContext; UINTN DebuggerBreakpointCount; EFI_DEBUGGER_BREAKPOINT_CONTEXT DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX + 1]; UINTN CallStackEntryCount; EFI_DEBUGGER_CALLSTACK_CONTEXT CallStackEntry[EFI_DEBUGGER_CALLSTACK_MAX + 1]; UINTN TraceEntryCount; EFI_DEBUGGER_TRACE_CONTEXT TraceEntry[EFI_DEBUGGER_TRACE_MAX + 1]; EFI_DEBUGGER_STEP_CONTEXT StepContext; EFI_DEBUGGER_GOTIL_CONTEXT GoTilContext; EFI_PHYSICAL_ADDRESS InstructionScope; UINTN InstructionNumber; UINT32 FeatureFlags; UINT32 StatusFlags; BOOLEAN EnablePageBreak; EFI_EVENT BreakEvent; } EFI_DEBUGGER_PRIVATE_DATA; #endif