/** @file | |
Generic debug support macros, typedefs and prototypes for IA32/x64. | |
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _DEBUG_SUPPORT_H_ | |
#define _DEBUG_SUPPORT_H_ | |
#include <Uefi.h> | |
#include <Protocol/DebugSupport.h> | |
#include <Protocol/LoadedImage.h> | |
#include <Library/DebugLib.h> | |
#include <Library/UefiDriverEntryPoint.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Library/BaseLib.h> | |
#define NUM_IDT_ENTRIES 0x78 | |
#define SYSTEM_TIMER_VECTOR 0x68 | |
typedef | |
VOID | |
(*DEBUG_PROC) ( | |
VOID | |
); | |
typedef | |
VOID | |
(EFIAPI *CALLBACK_FUNC)( | |
); | |
typedef struct { | |
IA32_IDT_GATE_DESCRIPTOR OrigDesc; | |
DEBUG_PROC OrigVector; | |
IA32_IDT_GATE_DESCRIPTOR NewDesc; | |
DEBUG_PROC StubEntry; | |
CALLBACK_FUNC RegisteredCallback; | |
} IDT_ENTRY; | |
extern UINT8 InterruptEntryStub[]; | |
extern UINT32 StubSize; | |
extern VOID (*OrigVector) ( | |
VOID | |
); | |
extern IDT_ENTRY *IdtEntryTable; | |
extern IA32_IDT_GATE_DESCRIPTOR NullDesc; | |
/** | |
Generic IDT entry. | |
**/ | |
VOID | |
CommonIdtEntry ( | |
VOID | |
); | |
/** | |
Check whether FXSTOR is supported | |
@retval TRUE FXSTOR is supported. | |
@retval FALSE FXSTOR is not supported. | |
**/ | |
BOOLEAN | |
FxStorSupport ( | |
VOID | |
); | |
/** | |
Encodes an IDT descriptor with the given physical address. | |
@param DestDesc The IDT descriptor address. | |
@param Vecotr The interrupt vector entry. | |
**/ | |
VOID | |
Vect2Desc ( | |
IA32_IDT_GATE_DESCRIPTOR *DestDesc, | |
VOID ( *Vector )(VOID) | |
); | |
/** | |
Initializes driver's handler registration database. | |
This code executes in boot services context | |
Must be public because it's referenced from DebugSupport.c | |
@retval EFI_UNSUPPORTED If IA32 processor does not support FXSTOR/FXRSTOR instructions, | |
the context save will fail, so these processor's are not supported. | |
@retval EFI_OUT_OF_RESOURCES Fails to allocate memory. | |
@retval EFI_SUCCESS Initializes successfully. | |
**/ | |
EFI_STATUS | |
PlInitializeDebugSupportDriver ( | |
VOID | |
); | |
/** | |
This is the callback that is written to the LoadedImage protocol instance | |
on the image handle. It uninstalls all registered handlers and frees all entry | |
stub memory. | |
@param ImageHandle The firmware allocated handle for the EFI image. | |
@retval EFI_SUCCESS Always. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
PlUnloadDebugSupportDriver ( | |
IN EFI_HANDLE ImageHandle | |
); | |
/** | |
Returns the maximum value that may be used for the ProcessorIndex parameter in | |
RegisterPeriodicCallback() and RegisterExceptionCallback(). | |
Hard coded to support only 1 processor for now. | |
@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. Always 0 returned. | |
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
GetMaximumProcessorIndex ( | |
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. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
RegisterPeriodicCallback ( | |
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. | |
This code executes in boot services context. | |
@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. | |
@param ProcessorIndex Specifies which processor the callback function applies to. | |
@param ExceptionCallback 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. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
RegisterExceptionCallback ( | |
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'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's instruction | |
cache to invalidate. | |
@retval EFI_SUCCESS Always returned. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
InvalidateInstructionCache ( | |
IN EFI_DEBUG_SUPPORT_PROTOCOL *This, | |
IN UINTN ProcessorIndex, | |
IN VOID *Start, | |
IN UINT64 Length | |
); | |
/** | |
Allocate pool for a new IDT entry stub. | |
Copy the generic stub into the new buffer and fixup the vector number | |
and jump target address. | |
@param ExceptionType This is the exception type that the new stub will be created | |
for. | |
@param Stub On successful exit, *Stub contains the newly allocated entry stub. | |
**/ | |
VOID | |
CreateEntryStub ( | |
IN EFI_EXCEPTION_TYPE ExceptionType, | |
OUT VOID **Stub | |
); | |
/** | |
Get Interrupt Handle from IDT Gate Descriptor. | |
@param IdtGateDecriptor IDT Gate Descriptor. | |
@return Interrupt Handle stored in IDT Gate Descriptor. | |
**/ | |
UINTN | |
GetInterruptHandleFromIdt ( | |
IN IA32_IDT_GATE_DESCRIPTOR *IdtGateDecriptor | |
); | |
/** | |
This is the main worker function that manages the state of the interrupt | |
handlers. It both installs and uninstalls interrupt handlers based on the | |
value of NewCallback. If NewCallback is NULL, then uninstall is indicated. | |
If NewCallback is non-NULL, then install is indicated. | |
@param NewCallback If non-NULL, NewCallback specifies the new handler to register. | |
If NULL, specifies that the previously registered handler should | |
be uninstalled. | |
@param ExceptionType Indicates which entry to manage. | |
@retval EFI_SUCCESS Process is ok. | |
@retval EFI_INVALID_PARAMETER Requested uninstalling a handler from a vector that has | |
no handler registered for it | |
@retval EFI_ALREADY_STARTED Requested install to a vector that already has a handler registered. | |
@retval others Possible return values are passed through from UnHookEntry and HookEntry. | |
**/ | |
EFI_STATUS | |
ManageIdtEntryTable ( | |
CALLBACK_FUNC NewCallback, | |
EFI_EXCEPTION_TYPE ExceptionType | |
); | |
/** | |
Creates a nes entry stub. Then saves the current IDT entry and replaces it | |
with an interrupt gate for the new entry point. The IdtEntryTable is updated | |
with the new registered function. | |
This code executes in boot services context. The stub entry executes in interrupt | |
context. | |
@param ExceptionType Specifies which vector to hook. | |
@param NewCallback A pointer to the new function to be registered. | |
**/ | |
VOID | |
HookEntry ( | |
IN EFI_EXCEPTION_TYPE ExceptionType, | |
IN CALLBACK_FUNC NewCallback | |
); | |
/** | |
Undoes HookEntry. This code executes in boot services context. | |
@param ExceptionType Specifies which entry to unhook | |
**/ | |
VOID | |
UnhookEntry ( | |
IN EFI_EXCEPTION_TYPE ExceptionType | |
); | |
#endif |