mirror of https://github.com/acidanthera/audk.git
518 lines
16 KiB
C
518 lines
16 KiB
C
/** @file
|
||
DebugSupport protocol and supporting definitions as defined in the EFI 1.1
|
||
specification.
|
||
|
||
The DebugSupport protocol is used by source level debuggers to abstract the
|
||
processor and handle context save and restore operations.
|
||
|
||
Copyright (c) 2006, Intel Corporation
|
||
All rights reserved. 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.
|
||
|
||
Module Name: DebugSupport.h
|
||
|
||
**/
|
||
|
||
#ifndef __DEBUG_SUPPORT_H__
|
||
#define __DEBUG_SUPPORT_H__
|
||
|
||
typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL;
|
||
|
||
//
|
||
// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}
|
||
//
|
||
#define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
|
||
{ \
|
||
0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \
|
||
}
|
||
|
||
//
|
||
// Debug Support definitions
|
||
//
|
||
typedef INTN EFI_EXCEPTION_TYPE;
|
||
|
||
//
|
||
// IA-32 processor exception types
|
||
//
|
||
#define EXCEPT_IA32_DIVIDE_ERROR 0
|
||
#define EXCEPT_IA32_DEBUG 1
|
||
#define EXCEPT_IA32_NMI 2
|
||
#define EXCEPT_IA32_BREAKPOINT 3
|
||
#define EXCEPT_IA32_OVERFLOW 4
|
||
#define EXCEPT_IA32_BOUND 5
|
||
#define EXCEPT_IA32_INVALID_OPCODE 6
|
||
#define EXCEPT_IA32_DOUBLE_FAULT 8
|
||
#define EXCEPT_IA32_INVALID_TSS 10
|
||
#define EXCEPT_IA32_SEG_NOT_PRESENT 11
|
||
#define EXCEPT_IA32_STACK_FAULT 12
|
||
#define EXCEPT_IA32_GP_FAULT 13
|
||
#define EXCEPT_IA32_PAGE_FAULT 14
|
||
#define EXCEPT_IA32_FP_ERROR 16
|
||
#define EXCEPT_IA32_ALIGNMENT_CHECK 17
|
||
#define EXCEPT_IA32_MACHINE_CHECK 18
|
||
#define EXCEPT_IA32_SIMD 19
|
||
|
||
//
|
||
// IA-32 processor context definition
|
||
//
|
||
//
|
||
// FXSAVE_STATE
|
||
// FP / MMX / XMM registers (see fxrstor instruction definition)
|
||
//
|
||
typedef struct {
|
||
UINT16 Fcw;
|
||
UINT16 Fsw;
|
||
UINT16 Ftw;
|
||
UINT16 Opcode;
|
||
UINT32 Eip;
|
||
UINT16 Cs;
|
||
UINT16 Reserved1;
|
||
UINT32 DataOffset;
|
||
UINT16 Ds;
|
||
UINT8 Reserved2[10];
|
||
UINT8 St0Mm0[10], Reserved3[6];
|
||
UINT8 St0Mm1[10], Reserved4[6];
|
||
UINT8 St0Mm2[10], Reserved5[6];
|
||
UINT8 St0Mm3[10], Reserved6[6];
|
||
UINT8 St0Mm4[10], Reserved7[6];
|
||
UINT8 St0Mm5[10], Reserved8[6];
|
||
UINT8 St0Mm6[10], Reserved9[6];
|
||
UINT8 St0Mm7[10], Reserved10[6];
|
||
UINT8 Reserved11[22 * 16];
|
||
} EFI_FX_SAVE_STATE_IA32;
|
||
|
||
typedef struct {
|
||
UINT32 ExceptionData;
|
||
EFI_FX_SAVE_STATE_IA32 FxSaveState;
|
||
UINT32 Dr0;
|
||
UINT32 Dr1;
|
||
UINT32 Dr2;
|
||
UINT32 Dr3;
|
||
UINT32 Dr6;
|
||
UINT32 Dr7;
|
||
UINT32 Cr0;
|
||
UINT32 Cr1;
|
||
UINT32 Cr2;
|
||
UINT32 Cr3;
|
||
UINT32 Cr4;
|
||
UINT32 Eflags;
|
||
UINT32 Ldtr;
|
||
UINT32 Tr;
|
||
UINT32 Gdtr[2];
|
||
UINT32 Idtr[2];
|
||
UINT32 Eip;
|
||
UINT32 Gs;
|
||
UINT32 Fs;
|
||
UINT32 Es;
|
||
UINT32 Ds;
|
||
UINT32 Cs;
|
||
UINT32 Ss;
|
||
UINT32 Edi;
|
||
UINT32 Esi;
|
||
UINT32 Ebp;
|
||
UINT32 Esp;
|
||
UINT32 Ebx;
|
||
UINT32 Edx;
|
||
UINT32 Ecx;
|
||
UINT32 Eax;
|
||
} EFI_SYSTEM_CONTEXT_IA32;
|
||
|
||
//
|
||
// IPF processor exception types
|
||
//
|
||
#define EXCEPT_IPF_VHTP_TRANSLATION 0
|
||
#define EXCEPT_IPF_INSTRUCTION_TLB 1
|
||
#define EXCEPT_IPF_DATA_TLB 2
|
||
#define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3
|
||
#define EXCEPT_IPF_ALT_DATA_TLB 4
|
||
#define EXCEPT_IPF_DATA_NESTED_TLB 5
|
||
#define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6
|
||
#define EXCEPT_IPF_DATA_KEY_MISSED 7
|
||
#define EXCEPT_IPF_DIRTY_BIT 8
|
||
#define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9
|
||
#define EXCEPT_IPF_DATA_ACCESS_BIT 10
|
||
#define EXCEPT_IPF_BREAKPOINT 11
|
||
#define EXCEPT_IPF_EXTERNAL_INTERRUPT 12
|
||
//
|
||
// 13 - 19 reserved
|
||
//
|
||
#define EXCEPT_IPF_PAGE_NOT_PRESENT 20
|
||
#define EXCEPT_IPF_KEY_PERMISSION 21
|
||
#define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22
|
||
#define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23
|
||
#define EXCEPT_IPF_GENERAL_EXCEPTION 24
|
||
#define EXCEPT_IPF_DISABLED_FP_REGISTER 25
|
||
#define EXCEPT_IPF_NAT_CONSUMPTION 26
|
||
#define EXCEPT_IPF_SPECULATION 27
|
||
//
|
||
// 28 reserved
|
||
//
|
||
#define EXCEPT_IPF_DEBUG 29
|
||
#define EXCEPT_IPF_UNALIGNED_REFERENCE 30
|
||
#define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31
|
||
#define EXCEPT_IPF_FP_FAULT 32
|
||
#define EXCEPT_IPF_FP_TRAP 33
|
||
#define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34
|
||
#define EXCEPT_IPF_TAKEN_BRANCH 35
|
||
#define EXCEPT_IPF_SINGLE_STEP 36
|
||
//
|
||
// 37 - 44 reserved
|
||
//
|
||
#define EXCEPT_IPF_IA32_EXCEPTION 45
|
||
#define EXCEPT_IPF_IA32_INTERCEPT 46
|
||
#define EXCEPT_IPF_IA32_INTERRUPT 47
|
||
|
||
//
|
||
// IPF processor context definition
|
||
//
|
||
typedef struct {
|
||
//
|
||
// The first reserved field is necessary to preserve alignment for the correct
|
||
// bits in UNAT and to insure F2 is 16 byte aligned..
|
||
//
|
||
UINT64 Reserved;
|
||
UINT64 R1;
|
||
UINT64 R2;
|
||
UINT64 R3;
|
||
UINT64 R4;
|
||
UINT64 R5;
|
||
UINT64 R6;
|
||
UINT64 R7;
|
||
UINT64 R8;
|
||
UINT64 R9;
|
||
UINT64 R10;
|
||
UINT64 R11;
|
||
UINT64 R12;
|
||
UINT64 R13;
|
||
UINT64 R14;
|
||
UINT64 R15;
|
||
UINT64 R16;
|
||
UINT64 R17;
|
||
UINT64 R18;
|
||
UINT64 R19;
|
||
UINT64 R20;
|
||
UINT64 R21;
|
||
UINT64 R22;
|
||
UINT64 R23;
|
||
UINT64 R24;
|
||
UINT64 R25;
|
||
UINT64 R26;
|
||
UINT64 R27;
|
||
UINT64 R28;
|
||
UINT64 R29;
|
||
UINT64 R30;
|
||
UINT64 R31;
|
||
|
||
UINT64 F2[2];
|
||
UINT64 F3[2];
|
||
UINT64 F4[2];
|
||
UINT64 F5[2];
|
||
UINT64 F6[2];
|
||
UINT64 F7[2];
|
||
UINT64 F8[2];
|
||
UINT64 F9[2];
|
||
UINT64 F10[2];
|
||
UINT64 F11[2];
|
||
UINT64 F12[2];
|
||
UINT64 F13[2];
|
||
UINT64 F14[2];
|
||
UINT64 F15[2];
|
||
UINT64 F16[2];
|
||
UINT64 F17[2];
|
||
UINT64 F18[2];
|
||
UINT64 F19[2];
|
||
UINT64 F20[2];
|
||
UINT64 F21[2];
|
||
UINT64 F22[2];
|
||
UINT64 F23[2];
|
||
UINT64 F24[2];
|
||
UINT64 F25[2];
|
||
UINT64 F26[2];
|
||
UINT64 F27[2];
|
||
UINT64 F28[2];
|
||
UINT64 F29[2];
|
||
UINT64 F30[2];
|
||
UINT64 F31[2];
|
||
|
||
UINT64 Pr;
|
||
|
||
UINT64 B0;
|
||
UINT64 B1;
|
||
UINT64 B2;
|
||
UINT64 B3;
|
||
UINT64 B4;
|
||
UINT64 B5;
|
||
UINT64 B6;
|
||
UINT64 B7;
|
||
|
||
//
|
||
// application registers
|
||
//
|
||
UINT64 ArRsc;
|
||
UINT64 ArBsp;
|
||
UINT64 ArBspstore;
|
||
UINT64 ArRnat;
|
||
|
||
UINT64 ArFcr;
|
||
|
||
UINT64 ArEflag;
|
||
UINT64 ArCsd;
|
||
UINT64 ArSsd;
|
||
UINT64 ArCflg;
|
||
UINT64 ArFsr;
|
||
UINT64 ArFir;
|
||
UINT64 ArFdr;
|
||
|
||
UINT64 ArCcv;
|
||
|
||
UINT64 ArUnat;
|
||
|
||
UINT64 ArFpsr;
|
||
|
||
UINT64 ArPfs;
|
||
UINT64 ArLc;
|
||
UINT64 ArEc;
|
||
|
||
//
|
||
// control registers
|
||
//
|
||
UINT64 CrDcr;
|
||
UINT64 CrItm;
|
||
UINT64 CrIva;
|
||
UINT64 CrPta;
|
||
UINT64 CrIpsr;
|
||
UINT64 CrIsr;
|
||
UINT64 CrIip;
|
||
UINT64 CrIfa;
|
||
UINT64 CrItir;
|
||
UINT64 CrIipa;
|
||
UINT64 CrIfs;
|
||
UINT64 CrIim;
|
||
UINT64 CrIha;
|
||
|
||
//
|
||
// debug registers
|
||
//
|
||
UINT64 Dbr0;
|
||
UINT64 Dbr1;
|
||
UINT64 Dbr2;
|
||
UINT64 Dbr3;
|
||
UINT64 Dbr4;
|
||
UINT64 Dbr5;
|
||
UINT64 Dbr6;
|
||
UINT64 Dbr7;
|
||
|
||
UINT64 Ibr0;
|
||
UINT64 Ibr1;
|
||
UINT64 Ibr2;
|
||
UINT64 Ibr3;
|
||
UINT64 Ibr4;
|
||
UINT64 Ibr5;
|
||
UINT64 Ibr6;
|
||
UINT64 Ibr7;
|
||
|
||
//
|
||
// virtual registers - nat bits for R1-R31
|
||
//
|
||
UINT64 IntNat;
|
||
|
||
} EFI_SYSTEM_CONTEXT_IPF;
|
||
|
||
//
|
||
// EBC processor exception types
|
||
//
|
||
#define EXCEPT_EBC_UNDEFINED 0
|
||
#define EXCEPT_EBC_DIVIDE_ERROR 1
|
||
#define EXCEPT_EBC_DEBUG 2
|
||
#define EXCEPT_EBC_BREAKPOINT 3
|
||
#define EXCEPT_EBC_OVERFLOW 4
|
||
#define EXCEPT_EBC_INVALID_OPCODE 5 // opcode out of range
|
||
#define EXCEPT_EBC_STACK_FAULT 6
|
||
#define EXCEPT_EBC_ALIGNMENT_CHECK 7
|
||
#define EXCEPT_EBC_INSTRUCTION_ENCODING 8 // malformed instruction
|
||
#define EXCEPT_EBC_BAD_BREAK 9 // BREAK 0 or undefined BREAK
|
||
#define EXCEPT_EBC_STEP 10 // to support debug stepping
|
||
//
|
||
// For coding convenience, define the maximum valid EBC exception.
|
||
//
|
||
#define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP
|
||
|
||
//
|
||
// EBC processor context definition
|
||
//
|
||
typedef struct {
|
||
UINT64 R0;
|
||
UINT64 R1;
|
||
UINT64 R2;
|
||
UINT64 R3;
|
||
UINT64 R4;
|
||
UINT64 R5;
|
||
UINT64 R6;
|
||
UINT64 R7;
|
||
UINT64 Flags;
|
||
UINT64 ControlFlags;
|
||
UINT64 Ip;
|
||
} EFI_SYSTEM_CONTEXT_EBC;
|
||
|
||
//
|
||
// Universal EFI_SYSTEM_CONTEXT definition
|
||
//
|
||
typedef union {
|
||
EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc;
|
||
EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;
|
||
EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf;
|
||
} EFI_SYSTEM_CONTEXT;
|
||
|
||
//
|
||
// DebugSupport callback function prototypes
|
||
//
|
||
|
||
/**
|
||
Registers and enables an exception callback function for the specified exception.
|
||
|
||
@param ExceptionType Exception types in EBC, IA-32, X64, or IPF
|
||
@param SystemContext Exception content.
|
||
|
||
**/
|
||
typedef
|
||
VOID
|
||
(*EFI_EXCEPTION_CALLBACK) (
|
||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||
);
|
||
|
||
/**
|
||
Registers and enables the on-target debug agent<6E><74>s periodic entry point.
|
||
|
||
@param SystemContext Exception content.
|
||
|
||
**/
|
||
typedef
|
||
VOID
|
||
(*EFI_PERIODIC_CALLBACK) (
|
||
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||
);
|
||
|
||
//
|
||
// Machine type definition
|
||
//
|
||
typedef enum {
|
||
IsaIa32 = IMAGE_FILE_MACHINE_I386, // 0x014C
|
||
IsaX64 = IMAGE_FILE_MACHINE_X64, // 0x8664
|
||
IsaIpf = IMAGE_FILE_MACHINE_IA64, // 0x0200
|
||
IsaEbc = IMAGE_FILE_MACHINE_EBC // 0x0EBC
|
||
} EFI_INSTRUCTION_SET_ARCHITECTURE;
|
||
|
||
|
||
//
|
||
// DebugSupport member function definitions
|
||
//
|
||
|
||
/**
|
||
Returns the maximum value that may be used for the ProcessorIndex parameter in
|
||
RegisterPeriodicCallback() and RegisterExceptionCallback().
|
||
|
||
@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
|
||
@param MaxProcessorIndex Pointer to a caller-allocated UINTN in which the maximum supported
|
||
processor index is returned.
|
||
|
||
@retval EFI_SUCCESS The function completed successfully.
|
||
|
||
**/
|
||
typedef
|
||
EFI_STATUS
|
||
(EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX) (
|
||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||
OUT UINTN *MaxProcessorIndex
|
||
);
|
||
|
||
/**
|
||
Registers a function to be called back periodically in interrupt context.
|
||
|
||
@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
|
||
@param ProcessorIndex Specifies which processor the callback function applies to.
|
||
@param PeriodicCallback A pointer to a function of type PERIODIC_CALLBACK that is the main
|
||
periodic entry point of the debug agent.
|
||
|
||
@retval EFI_SUCCESS The function completed successfully.
|
||
@retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback
|
||
function was previously registered.
|
||
@retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback
|
||
function.
|
||
|
||
**/
|
||
typedef
|
||
EFI_STATUS
|
||
(EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK) (
|
||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||
IN UINTN ProcessorIndex,
|
||
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||
);
|
||
|
||
/**
|
||
Registers a function to be called when a given processor exception occurs.
|
||
|
||
@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
|
||
@param ProcessorIndex Specifies which processor the callback function applies to.
|
||
@param PeriodicCallback A pointer to a function of type EXCEPTION_CALLBACK that is called
|
||
when the processor exception specified by ExceptionType occurs.
|
||
@param ExceptionType Specifies which processor exception to hook.
|
||
|
||
@retval EFI_SUCCESS The function completed successfully.
|
||
@retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback
|
||
function was previously registered.
|
||
@retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback
|
||
function.
|
||
|
||
**/
|
||
typedef
|
||
EFI_STATUS
|
||
(EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK) (
|
||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||
IN UINTN ProcessorIndex,
|
||
IN EFI_EXCEPTION_CALLBACK ExceptionCallback,
|
||
IN EFI_EXCEPTION_TYPE ExceptionType
|
||
);
|
||
|
||
/**
|
||
Invalidates processor instruction cache for a memory range. Subsequent execution in this range
|
||
causes a fresh memory fetch to retrieve code to be executed.
|
||
|
||
@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
|
||
@param ProcessorIndex Specifies which processor<6F><72>s instruction cache is to be invalidated.
|
||
@param Start Specifies the physical base of the memory range to be invalidated.
|
||
@param Length Specifies the minimum number of bytes in the processor<6F><72>s instruction
|
||
cache to invalidate.
|
||
|
||
@retval EFI_SUCCESS The function completed successfully.
|
||
|
||
**/
|
||
typedef
|
||
EFI_STATUS
|
||
(EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE) (
|
||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||
IN UINTN ProcessorIndex,
|
||
IN VOID *Start,
|
||
IN UINT64 Length
|
||
);
|
||
|
||
//
|
||
// DebugSupport protocol definition
|
||
//
|
||
struct _EFI_DEBUG_SUPPORT_PROTOCOL {
|
||
EFI_INSTRUCTION_SET_ARCHITECTURE Isa;
|
||
EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex;
|
||
EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback;
|
||
EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback;
|
||
EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache;
|
||
};
|
||
|
||
extern EFI_GUID gEfiDebugSupportProtocolGuid;
|
||
|
||
#endif
|