mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-05 13:33:33 +01:00
7c0aa811ec
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
240 lines
8.4 KiB
C
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
|