/** @file | |
Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _EFI_EDB_COMMON_H_ | |
#define _EFI_EDB_COMMON_H_ | |
#include <Uefi.h> | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/UefiLib.h> | |
#include <Library/PrintLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Protocol/Ebc.h> | |
#include <Protocol/EbcVmTest.h> | |
#include <Protocol/DebugSupport.h> | |
#include <Protocol/PciRootBridgeIo.h> | |
#include <Protocol/SimpleFileSystem.h> | |
#include <Protocol/DebuggerConfiguration.h> | |
#include <Guid/FileInfo.h> | |
#include <Guid/DebugImageInfoTable.h> | |
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 |