CloverBootloader/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCommon.h
2019-09-03 12:58:42 +03:00

240 lines
8.4 KiB
C

/** @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