audk/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCommon.h

248 lines
8.8 KiB
C

/** @file
Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#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/FileSystemInfo.h>
#include <Guid/FileSystemVolumeLabelInfo.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