mirror of https://github.com/acidanthera/audk.git
ECC clean up.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6405 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
e1a590c3e7
commit
9e604fe42d
|
@ -2242,7 +2242,7 @@ ConSplitterAddOutputMode (
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Reconstruct TextOutModeMap to get intersection of modes
|
Reconstruct TextOutModeMap to get intersection of modes.
|
||||||
|
|
||||||
This routine reconstruct TextOutModeMap to get the intersection
|
This routine reconstruct TextOutModeMap to get the intersection
|
||||||
of modes for all console out devices. Because EFI/UEFI spec require
|
of modes for all console out devices. Because EFI/UEFI spec require
|
||||||
|
@ -2256,8 +2256,6 @@ ConSplitterAddOutputMode (
|
||||||
@param MaxMode Current max text mode
|
@param MaxMode Current max text mode
|
||||||
@param CurrentMode Current text mode
|
@param CurrentMode Current text mode
|
||||||
|
|
||||||
@retval None
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
ConSplitterGetIntersection (
|
ConSplitterGetIntersection (
|
||||||
|
|
|
@ -30,7 +30,7 @@ CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };
|
||||||
|
|
||||||
@param This Protocol instance pointer.
|
@param This Protocol instance pointer.
|
||||||
@param Mode Are we in text of grahics mode.
|
@param Mode Are we in text of grahics mode.
|
||||||
@param GopExists TRUE if Console Spliter has found a GOP or UGA device
|
@param GopUgaExists TRUE if Console Spliter has found a GOP or UGA device
|
||||||
@param StdInLocked TRUE if StdIn device is keyboard locked
|
@param StdInLocked TRUE if StdIn device is keyboard locked
|
||||||
|
|
||||||
@retval EFI_SUCCESS Mode information returned.
|
@retval EFI_SUCCESS Mode information returned.
|
||||||
|
|
|
@ -586,7 +586,7 @@ TerminalConOutEnableCursor (
|
||||||
Test to see if this driver supports Controller.
|
Test to see if this driver supports Controller.
|
||||||
|
|
||||||
@param This Protocol instance pointer.
|
@param This Protocol instance pointer.
|
||||||
@param Controller Handle of device to test
|
@param ControllerHandle Handle of device to test
|
||||||
@param RemainingDevicePath Optional parameter use to pick a specific child
|
@param RemainingDevicePath Optional parameter use to pick a specific child
|
||||||
device to start.
|
device to start.
|
||||||
|
|
||||||
|
@ -1305,8 +1305,6 @@ UnicodeToUtf8 (
|
||||||
@param ValidBytes The count of returned VT-VTF8 characters.
|
@param ValidBytes The count of returned VT-VTF8 characters.
|
||||||
If ValidBytes is zero, no valid VT-UTF8 returned.
|
If ValidBytes is zero, no valid VT-UTF8 returned.
|
||||||
|
|
||||||
@retval None.
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
GetOneValidUtf8Char (
|
GetOneValidUtf8Char (
|
||||||
|
|
|
@ -60,8 +60,6 @@ VTUTF8RawDataToUnicode (
|
||||||
@param ValidBytes The count of returned VT-VTF8 characters.
|
@param ValidBytes The count of returned VT-VTF8 characters.
|
||||||
If ValidBytes is zero, no valid VT-UTF8 returned.
|
If ValidBytes is zero, no valid VT-UTF8 returned.
|
||||||
|
|
||||||
@retval None.
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
GetOneValidUtf8Char (
|
GetOneValidUtf8Char (
|
||||||
|
|
|
@ -114,7 +114,7 @@ GetDebugPortVariable (
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Debug Port Driver entry pointo.
|
Debug Port Driver entry point.
|
||||||
|
|
||||||
Reads DebugPort variable to determine what device and settings to use as the
|
Reads DebugPort variable to determine what device and settings to use as the
|
||||||
debug port. Binds exclusively to SerialIo. Reverts to defaults if no variable
|
debug port. Binds exclusively to SerialIo. Reverts to defaults if no variable
|
||||||
|
|
|
@ -28,31 +28,26 @@ EFI_DEBUG_SUPPORT_PROTOCOL gDebugSupportProtocolInterface = {
|
||||||
InvalidateInstructionCache
|
InvalidateInstructionCache
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// Driver Entry Point
|
/**
|
||||||
//
|
Debug Port Driver entry point.
|
||||||
|
|
||||||
|
Checks to see there's not already a DebugSupport protocol installed for
|
||||||
|
the selected processor before installing protocol.
|
||||||
|
|
||||||
|
@param[in] ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
@param[in] SystemTable A pointer to the EFI System Table.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The entry point is executed successfully.
|
||||||
|
@retval EFI_ALREADY_STARTED DebugSupport protocol is installed already.
|
||||||
|
@retval other Some error occurs when executing this entry point.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
InitializeDebugSupportDriver (
|
InitializeDebugSupportDriver (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Driver entry point. Checks to see there's not already a DebugSupport protocol
|
|
||||||
installed for the selected processor before installing protocol.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
IN EFI_HANDLE ImageHandle,
|
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
// TODO: ImageHandle - add argument and description to function comment
|
|
||||||
// TODO: SystemTable - add argument and description to function comment
|
|
||||||
{
|
{
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolPtr;
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolPtr;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
@ -111,12 +106,12 @@ Returns:
|
||||||
goto ErrExit;
|
goto ErrExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadedImageProtocolPtr->Unload = plUnloadDebugSupportDriver;
|
LoadedImageProtocolPtr->Unload = PlUnloadDebugSupportDriver;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call hook for platform specific initialization
|
// Call hook for platform specific initialization
|
||||||
//
|
//
|
||||||
Status = plInitializeDebugSupportDriver ();
|
Status = PlInitializeDebugSupportDriver ();
|
||||||
ASSERT (!EFI_ERROR (Status));
|
ASSERT (!EFI_ERROR (Status));
|
||||||
if (Status != EFI_SUCCESS) {
|
if (Status != EFI_SUCCESS) {
|
||||||
goto ErrExit;
|
goto ErrExit;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**@file
|
/** @file
|
||||||
IA32 specific debug support functions
|
IA32 specific debug support functions
|
||||||
|
|
||||||
Copyright (c) 2006 - 2007, Intel Corporation
|
Copyright (c) 2006 - 2008, Intel Corporation
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -23,25 +23,24 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
IDT_ENTRY *IdtEntryTable = NULL;
|
IDT_ENTRY *IdtEntryTable = NULL;
|
||||||
DESCRIPTOR NullDesc = 0;
|
DESCRIPTOR NullDesc = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
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.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CreateEntryStub (
|
CreateEntryStub (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
OUT VOID **Stub
|
OUT VOID **Stub
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: 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.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - This is the exception type that the new stub will be created
|
|
||||||
for.
|
|
||||||
Stub - On successful exit, *Stub contains the newly allocated entry stub.
|
|
||||||
Returns:
|
|
||||||
Typically EFI_SUCCESS
|
|
||||||
other possibilities are passed through from AllocatePool
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
UINT8 *StubCopy;
|
UINT8 *StubCopy;
|
||||||
|
|
||||||
|
@ -73,14 +72,7 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
HookEntry (
|
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
|
||||||
IN VOID (*NewCallback) ()
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Creates a nes entry stub. Then saves the current IDT entry and replaces it
|
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 an interrupt gate for the new entry point. The IdtEntryTable is updated
|
||||||
with the new registered function.
|
with the new registered function.
|
||||||
|
@ -88,15 +80,17 @@ Routine Description:
|
||||||
This code executes in boot services context. The stub entry executes in interrupt
|
This code executes in boot services context. The stub entry executes in interrupt
|
||||||
context.
|
context.
|
||||||
|
|
||||||
Arguments:
|
@param ExceptionType Specifies which vector to hook.
|
||||||
ExceptionType - specifies which vector to hook.
|
@param NewCallback A pointer to the new function to be registered.
|
||||||
NewCallback - a pointer to the new function to be registered.
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Always.
|
||||||
EFI_SUCCESS
|
|
||||||
Other possibilities are passed through by CreateEntryStub
|
|
||||||
|
|
||||||
--*/
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
HookEntry (
|
||||||
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
|
IN VOID (*NewCallback) ()
|
||||||
|
)
|
||||||
{
|
{
|
||||||
BOOLEAN OldIntFlagState;
|
BOOLEAN OldIntFlagState;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
@ -104,81 +98,72 @@ Returns:
|
||||||
Status = CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);
|
Status = CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);
|
||||||
if (Status == EFI_SUCCESS) {
|
if (Status == EFI_SUCCESS) {
|
||||||
OldIntFlagState = WriteInterruptFlag (0);
|
OldIntFlagState = WriteInterruptFlag (0);
|
||||||
ReadIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
READ_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
||||||
|
|
||||||
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[0] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc)[0];
|
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[0] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc)[0];
|
||||||
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[1] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc)[3];
|
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[1] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc)[3];
|
||||||
|
|
||||||
Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);
|
Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);
|
||||||
IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
|
IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
|
||||||
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
|
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
|
||||||
WriteInterruptFlag (OldIntFlagState);
|
WriteInterruptFlag (OldIntFlagState);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Undoes HookEntry. This code executes in boot services context.
|
||||||
|
|
||||||
|
@param ExceptionType Specifies which entry to unhook
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UnhookEntry (
|
UnhookEntry (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Undoes HookEntry. This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - specifies which entry to unhook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
BOOLEAN OldIntFlagState;
|
BOOLEAN OldIntFlagState;
|
||||||
|
|
||||||
OldIntFlagState = WriteInterruptFlag (0);
|
OldIntFlagState = WriteInterruptFlag (0);
|
||||||
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
||||||
WriteInterruptFlag (OldIntFlagState);
|
WriteInterruptFlag (OldIntFlagState);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
ManageIdtEntryTable (
|
|
||||||
VOID (*NewCallback)(),
|
|
||||||
EFI_EXCEPTION_TYPE ExceptionType
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the main worker function that manages the state of the interrupt
|
This is the main worker function that manages the state of the interrupt
|
||||||
handlers. It both installs and uninstalls interrupt handlers based on the
|
handlers. It both installs and uninstalls interrupt handlers based on the
|
||||||
value of NewCallback. If NewCallback is NULL, then uninstall is indicated.
|
value of NewCallback. If NewCallback is NULL, then uninstall is indicated.
|
||||||
If NewCallback is non-NULL, then install is indicated.
|
If NewCallback is non-NULL, then install is indicated.
|
||||||
|
|
||||||
Arguments:
|
@param NewCallback If non-NULL, NewCallback specifies the new handler to register.
|
||||||
NewCallback - If non-NULL, NewCallback specifies the new handler to register.
|
If NULL, specifies that the previously registered handler should
|
||||||
If NULL, specifies that the previously registered handler should
|
be uninstalled.
|
||||||
be uninstalled.
|
@param ExceptionType Indicates which entry to manage.
|
||||||
ExceptionType - Indicates which entry to manage
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Process is ok.
|
||||||
EFI_SUCCESS
|
@retval EFI_INVALID_PARAMETER Requested uninstalling a handler from a vector that has
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
no handler registered for it
|
||||||
no handler registered for it
|
@retval EFI_ALREADY_STARTED Requested install to a vector that already has a handler registered.
|
||||||
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.
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
**/
|
||||||
|
EFI_STATUS
|
||||||
--*/
|
ManageIdtEntryTable (
|
||||||
|
VOID (*NewCallback)(),
|
||||||
|
EFI_EXCEPTION_TYPE ExceptionType
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {
|
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {
|
||||||
if (CompareDescriptor (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
|
if (COMPARE_DESCRIPTOR (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
|
||||||
//
|
//
|
||||||
// we've already installed to this vector
|
// we've already installed to this vector
|
||||||
//
|
//
|
||||||
|
@ -208,29 +193,38 @@ Returns:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is a DebugSupport protocol member function, hard
|
||||||
|
coded to support only 1 processor for now.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param MaxProcessorIndex The maximuim supported processor index
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetMaximumProcessorIndex (
|
GetMaximumProcessorIndex (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
OUT UINTN *MaxProcessorIndex
|
OUT UINTN *MaxProcessorIndex
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
MaxProcessorIndex - The maximuim supported processor index
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
*MaxProcessorIndex = 0;
|
*MaxProcessorIndex = 0;
|
||||||
return (EFI_SUCCESS);
|
return (EFI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param PeriodicCallback Callback function
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterPeriodicCallback (
|
RegisterPeriodicCallback (
|
||||||
|
@ -238,29 +232,24 @@ RegisterPeriodicCallback (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
PeriodicCallback - Callback function
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
return ManageIdtEntryTable (PeriodicCallback, SYSTEM_TIMER_VECTOR);
|
return ManageIdtEntryTable (PeriodicCallback, SYSTEM_TIMER_VECTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
|
This code executes in boot services context.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param NewCallback Callback function
|
||||||
|
@param ExceptionType Which exception to hook
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterExceptionCallback (
|
RegisterExceptionCallback (
|
||||||
|
@ -269,33 +258,21 @@ RegisterExceptionCallback (
|
||||||
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is a DebugSupport protocol member function.
|
|
||||||
|
|
||||||
This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
NewCallback - Callback function
|
|
||||||
ExceptionType - Which exception to hook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
return ManageIdtEntryTable (NewCallback, ExceptionType);
|
return ManageIdtEntryTable (NewCallback, ExceptionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param Start Physical base of the memory range to be invalidated
|
||||||
|
@param Length mininum number of bytes in instruction cache to invalidate
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always returned.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InvalidateInstructionCache (
|
InvalidateInstructionCache (
|
||||||
|
@ -304,49 +281,27 @@ InvalidateInstructionCache (
|
||||||
IN VOID *Start,
|
IN VOID *Start,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is a DebugSupport protocol member function.
|
|
||||||
Calls assembly routine to flush cache.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
Start - Physical base of the memory range to be invalidated
|
|
||||||
Length - mininum number of bytes in instruction cache to invalidate
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - always return success
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
AsmWbinvd ();
|
AsmWbinvd ();
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initializes driver's handler registration databas.
|
||||||
|
|
||||||
|
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
|
EFI_STATUS
|
||||||
plInitializeDebugSupportDriver (
|
PlInitializeDebugSupportDriver (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Initializes driver's handler registration database.
|
|
||||||
|
|
||||||
This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_UNSUPPORTED - if IA32 processor does not support FXSTOR/FXRSTOR instructions,
|
|
||||||
the context save will fail, so these processor's are not supported.
|
|
||||||
EFI_OUT_OF_RESOURCES - not resource to finish initialization
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
EFI_EXCEPTION_TYPE ExceptionType;
|
EFI_EXCEPTION_TYPE ExceptionType;
|
||||||
|
|
||||||
|
@ -381,28 +336,21 @@ ErrorCleanup:
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
EFIAPI
|
|
||||||
plUnloadDebugSupportDriver (
|
|
||||||
IN EFI_HANDLE ImageHandle
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the callback that is written to the LoadedImage protocol instance
|
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
|
on the image handle. It uninstalls all registered handlers and frees all entry
|
||||||
stub memory.
|
stub memory.
|
||||||
|
|
||||||
This code executes in boot services context.
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always.
|
||||||
ImageHandle - The image handle of the unload handler
|
|
||||||
|
|
||||||
Returns:
|
**/
|
||||||
|
EFI_STATUS
|
||||||
EFI_SUCCESS - always return success
|
EFIAPI
|
||||||
|
PlUnloadDebugSupportDriver (
|
||||||
--*/
|
IN EFI_HANDLE ImageHandle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_EXCEPTION_TYPE ExceptionType;
|
EFI_EXCEPTION_TYPE ExceptionType;
|
||||||
|
|
||||||
|
@ -414,26 +362,20 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Common piece of code that invokes the registered handlers.
|
||||||
|
|
||||||
|
This code executes in exception context so no efi calls are allowed.
|
||||||
|
|
||||||
|
@param ExceptionType Exception type
|
||||||
|
@param ContextRecord System context
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
InterruptDistrubutionHub (
|
InterruptDistrubutionHub (
|
||||||
EFI_EXCEPTION_TYPE ExceptionType,
|
EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
EFI_SYSTEM_CONTEXT_IA32 *ContextRecord
|
EFI_SYSTEM_CONTEXT_IA32 *ContextRecord
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: Common piece of code that invokes the registered handlers.
|
|
||||||
|
|
||||||
This code executes in exception context so no efi calls are allowed.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - exception type
|
|
||||||
ContextRecord - system context
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
if (IdtEntryTable[ExceptionType].RegisteredCallback != NULL) {
|
if (IdtEntryTable[ExceptionType].RegisteredCallback != NULL) {
|
||||||
if (ExceptionType != SYSTEM_TIMER_VECTOR) {
|
if (ExceptionType != SYSTEM_TIMER_VECTOR) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**@file
|
/** @file
|
||||||
IA32 specific debug support macros, typedefs and prototypes.
|
IA32 specific debug support macros, typedefs and prototypes.
|
||||||
|
|
||||||
Copyright (c) 2006, Intel Corporation
|
Copyright (c) 2006 - 2008, Intel Corporation
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -12,8 +12,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef _PLDEBUG_SUPPORT_H
|
#ifndef _PLDEBUG_SUPPORT_H_
|
||||||
#define _PLDEBUG_SUPPORT_H
|
#define _PLDEBUG_SUPPORT_H_
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
@ -32,11 +32,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#define NUM_IDT_ENTRIES 0x78
|
#define NUM_IDT_ENTRIES 0x78
|
||||||
#define SYSTEM_TIMER_VECTOR 0x68
|
#define SYSTEM_TIMER_VECTOR 0x68
|
||||||
#define VECTOR_ENTRY_PAGES 1
|
#define VECTOR_ENTRY_PAGES 1
|
||||||
#define CopyDescriptor(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
|
#define COPY_DESCRIPTOR(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
|
||||||
#define ZeroDescriptor(Dest) CopyDescriptor ((Dest), &NullDesc)
|
#define READ_IDT(Vector, Dest) COPY_DESCRIPTOR ((Dest), &((GetIdtr ())[(Vector)]))
|
||||||
#define ReadIdt(Vector, Dest) CopyDescriptor ((Dest), &((GetIdtr ())[(Vector)]))
|
#define WRITE_IDT(Vector, Src) COPY_DESCRIPTOR (&((GetIdtr ())[(Vector)]), (Src))
|
||||||
#define WriteIdt(Vector, Src) CopyDescriptor (&((GetIdtr ())[(Vector)]), (Src))
|
#define COMPARE_DESCRIPTOR(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
|
||||||
#define CompareDescriptor(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
|
|
||||||
#define EFI_ISA IsaIa32
|
#define EFI_ISA IsaIa32
|
||||||
#define FF_FXSR (1 << 24)
|
#define FF_FXSR (1 << 24)
|
||||||
|
|
||||||
|
@ -61,214 +60,149 @@ extern UINT8 InterruptEntryStub[];
|
||||||
extern UINT32 StubSize;
|
extern UINT32 StubSize;
|
||||||
extern VOID (*OrigVector) (VOID);
|
extern VOID (*OrigVector) (VOID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Generic IDT entry.
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
CommonIdtEntry (
|
CommonIdtEntry (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Check whether FXSTOR is supported
|
||||||
Generic IDT entry
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
@retval TRUE FXSTOR is supported.
|
||||||
|
@retval FALSE FXSTOR is not supported.
|
||||||
|
|
||||||
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
FxStorSupport (
|
FxStorSupport (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Return the physical address of IDTR.
|
||||||
|
|
||||||
Check whether FXSTOR is supported
|
@return The physical address of IDTR.
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
TRUE - supported
|
|
||||||
FALSE - not supported
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
DESCRIPTOR *
|
DESCRIPTOR *
|
||||||
GetIdtr (
|
GetIdtr (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Encodes an IDT descriptor with the given physical address.
|
||||||
|
|
||||||
Return the physical address of IDTR
|
@param DestDesc The IDT descriptor address.
|
||||||
|
@param Vecotr The interrupt vector entry.
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
The physical address of IDTR
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
Vect2Desc (
|
Vect2Desc (
|
||||||
DESCRIPTOR * DestDesc,
|
DESCRIPTOR * DestDesc,
|
||||||
VOID (*Vector) (VOID)
|
VOID (*Vector) (VOID)
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Encodes an IDT descriptor with the given physical address
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
DestDesc - The IDT descriptor address
|
|
||||||
Vector - The interrupt vector entry
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
WriteInterruptFlag (
|
|
||||||
BOOLEAN NewState
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
|
/**
|
||||||
Programs interrupt flag to the requested state and returns previous
|
Programs interrupt flag to the requested state and returns previous
|
||||||
state.
|
state.
|
||||||
|
|
||||||
Arguments:
|
@param NewState New interrupt status.
|
||||||
|
|
||||||
NewState - New interrupt status
|
@retval TRUE Old interrupt status is TRUE.
|
||||||
|
@retval FALSE Old interrupt status is FALSE
|
||||||
|
|
||||||
Returns:
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
WriteInterruptFlag (
|
||||||
|
BOOLEAN NewState
|
||||||
|
);
|
||||||
|
|
||||||
Old interrupt status
|
/**
|
||||||
|
Initializes driver's handler registration databas.
|
||||||
|
|
||||||
|
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
|
EFI_STATUS
|
||||||
plInitializeDebugSupportDriver (
|
PlInitializeDebugSupportDriver (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
Initializes driver's handler registration database.
|
|
||||||
|
|
||||||
This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_UNSUPPORTED - if IA32 processor does not support FXSTOR/FXRSTOR instructions,
|
|
||||||
the context save will fail, so these processor's are not supported.
|
|
||||||
EFI_OUT_OF_RESOURCES - not resource to finish initialization
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
plUnloadDebugSupportDriver (
|
|
||||||
IN EFI_HANDLE ImageHandle
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the callback that is written to the LoadedImage protocol instance
|
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
|
on the image handle. It uninstalls all registered handlers and frees all entry
|
||||||
stub memory.
|
stub memory.
|
||||||
|
|
||||||
This code executes in boot services context.
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always.
|
||||||
ImageHandle - The image handle of the unload handler
|
|
||||||
|
|
||||||
Returns:
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
PlUnloadDebugSupportDriver (
|
||||||
|
IN EFI_HANDLE ImageHandle
|
||||||
|
);
|
||||||
|
|
||||||
EFI_SUCCESS - always return success
|
/**
|
||||||
|
This is a DebugSupport protocol member function, hard
|
||||||
|
coded to support only 1 processor for now.
|
||||||
|
|
||||||
--*/
|
@param This The DebugSupport instance
|
||||||
;
|
@param MaxProcessorIndex The maximuim supported processor index
|
||||||
|
|
||||||
//
|
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
|
||||||
// DebugSupport protocol member functions
|
|
||||||
//
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetMaximumProcessorIndex (
|
GetMaximumProcessorIndex (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
OUT UINTN *MaxProcessorIndex
|
OUT UINTN *MaxProcessorIndex
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
Arguments:
|
@param This The DebugSupport instance
|
||||||
This - The DebugSupport instance
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
MaxProcessorIndex - The maximuim supported processor index
|
@param PeriodicCallback Callback function
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterPeriodicCallback (
|
RegisterPeriodicCallback (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
Arguments:
|
This code executes in boot services context.
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
PeriodicCallback - Callback function
|
|
||||||
|
|
||||||
Returns:
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param NewCallback Callback function
|
||||||
|
@param ExceptionType Which exception to hook
|
||||||
|
|
||||||
EFI_SUCCESS
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
@retval others Callback was not registered.
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterExceptionCallback (
|
RegisterExceptionCallback (
|
||||||
|
@ -276,32 +210,19 @@ RegisterExceptionCallback (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
This is a DebugSupport protocol member function.
|
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
||||||
|
|
||||||
This code executes in boot services context.
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param Start Physical base of the memory range to be invalidated
|
||||||
|
@param Length mininum number of bytes in instruction cache to invalidate
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always returned.
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
NewCallback - Callback function
|
|
||||||
ExceptionType - Which exception to hook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InvalidateInstructionCache (
|
InvalidateInstructionCache (
|
||||||
|
@ -309,24 +230,6 @@ InvalidateInstructionCache (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN VOID *Start,
|
IN VOID *Start,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is a DebugSupport protocol member function.
|
|
||||||
Calls assembly routine to flush cache.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
Start - Physical base of the memory range to be invalidated
|
|
||||||
Length - mininum number of bytes in instruction cache to invalidate
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - always return success
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/**@file
|
/** @file
|
||||||
IPF specific debug support functions
|
IPF specific debug support functions
|
||||||
|
|
||||||
Copyright (c) 2006 - 2008, Intel Corporation
|
Copyright (c) 2006 - 2008, Intel Corporation
|
||||||
|
@ -35,35 +35,82 @@ typedef struct {
|
||||||
VOID (*RegisteredCallback) ();
|
VOID (*RegisteredCallback) ();
|
||||||
} IVT_ENTRY;
|
} IVT_ENTRY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is the worker function that uninstalls and removes all handlers.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
@param NewBundles New Boundles
|
||||||
|
@param NewCallback New Callback
|
||||||
|
|
||||||
|
@retval EFI_ALEADY_STARTED Ivt already hooked.
|
||||||
|
@retval others Indicates the request was not satisfied.
|
||||||
|
@retval EFI_SUCCESS Successfully uninstalled.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ManageIvtEntryTable (
|
ManageIvtEntryTable (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN BUNDLE NewBundles[4],
|
IN BUNDLE NewBundles[4],
|
||||||
IN VOID (*NewCallback) ()
|
IN VOID (*NewCallback) ()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Saves original IVT contents and inserts a few new bundles which are fixed up
|
||||||
|
to store the ExceptionType and then call the common handler.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
@param NewBundles New Boundles
|
||||||
|
@param NewCallback New Callback
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
HookEntry (
|
HookEntry (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN BUNDLE NewBundles[4],
|
IN BUNDLE NewBundles[4],
|
||||||
IN VOID (*NewCallback) ()
|
IN VOID (*NewCallback) ()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Restores original IVT contents when unregistering a callback function.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
UnhookEntry (
|
UnhookEntry (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets up cache flush and calls assembly function to chain external interrupt.
|
||||||
|
|
||||||
|
Records new callback in IvtEntryTable.
|
||||||
|
|
||||||
|
@param NewCallback New Callback.
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
ChainExternalInterrupt (
|
ChainExternalInterrupt (
|
||||||
IN VOID (*NewCallback) ()
|
IN VOID (*NewCallback) ()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets up cache flush and calls assembly function to restore external interrupt.
|
||||||
|
Removes registered callback from IvtEntryTable.
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
UnchainExternalInterrupt (
|
UnchainExternalInterrupt (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Given an integer number, return the physical address of the entry point in the IFT.
|
||||||
|
|
||||||
|
@param HandlerIndex Index of the Handler
|
||||||
|
@param EntryPoint IFT Entrypoint
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
GetHandlerEntryPoint (
|
GetHandlerEntryPoint (
|
||||||
UINTN HandlerIndex,
|
UINTN HandlerIndex,
|
||||||
|
@ -85,48 +132,38 @@ UINT8 IpfContextBuf[sizeof (EFI_SYSTEM_CONTEXT_IPF) + 512];
|
||||||
UINT8 PatchSaveBuffer[0x400];
|
UINT8 PatchSaveBuffer[0x400];
|
||||||
UINTN ExternalInterruptCount;
|
UINTN ExternalInterruptCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
IPF specific DebugSupport driver initialization.
|
||||||
|
|
||||||
|
Must be public because it's referenced from DebugSupport.c
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
plInitializeDebugSupportDriver (
|
PlInitializeDebugSupportDriver (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
IPF specific DebugSupport driver initialization. Must be public because it's
|
|
||||||
referenced from DebugSupport.c
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
SetMem (IvtEntryTable, sizeof (IvtEntryTable), 0);
|
SetMem (IvtEntryTable, sizeof (IvtEntryTable), 0);
|
||||||
ExternalInterruptCount = 0;
|
ExternalInterruptCount = 0;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
EFIAPI
|
|
||||||
plUnloadDebugSupportDriver (
|
|
||||||
IN EFI_HANDLE ImageHandle
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Unload handler that is called during UnloadImage() - deallocates pool memory
|
Unload handler that is called during UnloadImage() - deallocates pool memory
|
||||||
used by the driver. Must be public because it's referenced from DebugSuport.c
|
used by the driver. Must be public because it's referenced from DebugSuport.c
|
||||||
|
|
||||||
Arguments:
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||||
ImageHandle - Image handle
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
|
**/
|
||||||
|
EFI_STATUS
|
||||||
--*/
|
EFIAPI
|
||||||
|
PlUnloadDebugSupportDriver (
|
||||||
|
IN EFI_HANDLE ImageHandle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_EXCEPTION_TYPE ExceptionType;
|
EFI_EXCEPTION_TYPE ExceptionType;
|
||||||
|
|
||||||
|
@ -137,26 +174,18 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
C routine that is called for all registered exceptions. This is the main
|
||||||
|
exception dispatcher. Must be public because it's referenced from AsmFuncs.s.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
@param Context System Context
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
CommonHandler (
|
CommonHandler (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN EFI_SYSTEM_CONTEXT Context
|
IN EFI_SYSTEM_CONTEXT Context
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
C routine that is called for all registered exceptions. This is the main
|
|
||||||
exception dispatcher. Must be public because it's referenced from AsmFuncs.s.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - Exception Type
|
|
||||||
Context - System Context
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
DEBUG_CODE_BEGIN ();
|
DEBUG_CODE_BEGIN ();
|
||||||
if (mInHandler) {
|
if (mInHandler) {
|
||||||
|
@ -189,25 +218,18 @@ Returns:
|
||||||
mInHandler = FALSE;
|
mInHandler = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Given an integer number, return the physical address of the entry point in the IFT.
|
||||||
|
|
||||||
|
@param HandlerIndex Index of the Handler
|
||||||
|
@param EntryPoint IFT Entrypoint
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
GetHandlerEntryPoint (
|
GetHandlerEntryPoint (
|
||||||
UINTN HandlerIndex,
|
UINTN HandlerIndex,
|
||||||
VOID **EntryPoint
|
VOID **EntryPoint
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Given an integer number, return the physical address of the entry point in the IFT
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
HandlerIndex - Index of the Handler
|
|
||||||
EntryPoint - IFT Entrypoint
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
UINT8 *TempPtr;
|
UINT8 *TempPtr;
|
||||||
|
|
||||||
|
@ -231,29 +253,24 @@ Returns:
|
||||||
*EntryPoint = (VOID *) TempPtr;
|
*EntryPoint = (VOID *) TempPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is the worker function that uninstalls and removes all handlers.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
@param NewBundles New Boundles
|
||||||
|
@param NewCallback New Callback
|
||||||
|
|
||||||
|
@retval EFI_ALEADY_STARTED Ivt already hooked.
|
||||||
|
@retval others Indicates the request was not satisfied.
|
||||||
|
@retval EFI_SUCCESS Successfully uninstalled.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ManageIvtEntryTable (
|
ManageIvtEntryTable (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN BUNDLE NewBundles[NUM_BUNDLES_IN_STUB],
|
IN BUNDLE NewBundles[NUM_BUNDLES_IN_STUB],
|
||||||
IN VOID (*NewCallback) ()
|
IN VOID (*NewCallback) ()
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the worker function that installs and removes all handlers
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - Exception Type
|
|
||||||
NewBundles - New Boundles
|
|
||||||
NewCallback - New Callback
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_STATUS - any return other than EFI_SUCCESS indicates the request was not
|
|
||||||
satisfied.
|
|
||||||
EFI_ALEADY_STARTED - Ivt already hooked.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
BUNDLE *B0Ptr;
|
BUNDLE *B0Ptr;
|
||||||
UINT64 InterruptFlags;
|
UINT64 InterruptFlags;
|
||||||
|
@ -313,28 +330,21 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Saves original IVT contents and inserts a few new bundles which are fixed up
|
||||||
|
to store the ExceptionType and then call the common handler.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
@param NewBundles New Boundles
|
||||||
|
@param NewCallback New Callback
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
HookEntry (
|
HookEntry (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN BUNDLE NewBundles[4],
|
IN BUNDLE NewBundles[4],
|
||||||
IN VOID (*NewCallback) ()
|
IN VOID (*NewCallback) ()
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Saves original IVT contents and inserts a few new bundles which are fixed up
|
|
||||||
to store the ExceptionType and then call the common handler.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - Exception Type
|
|
||||||
NewBundles - New Boundles
|
|
||||||
NewCallback - New Callback
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
BUNDLE *FixupBundle;
|
BUNDLE *FixupBundle;
|
||||||
BUNDLE *B0Ptr;
|
BUNDLE *B0Ptr;
|
||||||
|
@ -367,25 +377,16 @@ Returns:
|
||||||
IvtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
|
IvtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Restores original IVT contents when unregistering a callback function.
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
UnhookEntry (
|
UnhookEntry (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Restores original IVT contents when unregistering a callback function
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - Exception Type
|
|
||||||
NewBundles - New Boundles
|
|
||||||
NewCallback - New Callback
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
BUNDLE *B0Ptr;
|
BUNDLE *B0Ptr;
|
||||||
|
|
||||||
|
@ -404,24 +405,18 @@ Returns:
|
||||||
InstructionCacheFlush (B0Ptr, 5);
|
InstructionCacheFlush (B0Ptr, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets up cache flush and calls assembly function to chain external interrupt.
|
||||||
|
|
||||||
|
Records new callback in IvtEntryTable.
|
||||||
|
|
||||||
|
@param NewCallback New Callback
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
ChainExternalInterrupt (
|
ChainExternalInterrupt (
|
||||||
IN VOID (*NewCallback) ()
|
IN VOID (*NewCallback) ()
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Sets up cache flush and calls assembly function to chain external interrupt.
|
|
||||||
Records new callback in IvtEntryTable.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
NewCallback - New Callback
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
VOID *Start;
|
VOID *Start;
|
||||||
|
|
||||||
|
@ -431,24 +426,15 @@ Returns:
|
||||||
InstructionCacheFlush (Start, 0x400);
|
InstructionCacheFlush (Start, 0x400);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets up cache flush and calls assembly function to restore external interrupt.
|
||||||
|
Removes registered callback from IvtEntryTable.
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
UnchainExternalInterrupt (
|
UnchainExternalInterrupt (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Sets up cache flush and calls assembly function to restore external interrupt.
|
|
||||||
Removes registered callback from IvtEntryTable.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
VOID *Start;
|
VOID *Start;
|
||||||
|
|
||||||
|
@ -463,56 +449,61 @@ Returns:
|
||||||
// DebugSupport protocol
|
// DebugSupport protocol
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is a DebugSupport protocol member function, hard
|
||||||
|
coded to support only 1 processor for now.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param MaxProcessorIndex The maximuim supported processor index
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetMaximumProcessorIndex (
|
GetMaximumProcessorIndex (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
OUT UINTN *MaxProcessorIndex
|
OUT UINTN *MaxProcessorIndex
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function. Hard
|
|
||||||
coded to support only 1 processor for now.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
MaxProcessorIndex - The maximuim supported processor index
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
*MaxProcessorIndex = 0;
|
*MaxProcessorIndex = 0;
|
||||||
return (EFI_SUCCESS);
|
return (EFI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param PeriodicCallback Callback function
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterPeriodicCallback (
|
RegisterPeriodicCallback (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_PERIODIC_CALLBACK NewPeriodicCallback
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
DebugSupport protocol member function
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
PeriodicCallback - Callback function
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
return ManageIvtEntryTable (EXCEPT_IPF_EXTERNAL_INTERRUPT, NULL, NewPeriodicCallback);
|
return ManageIvtEntryTable (EXCEPT_IPF_EXTERNAL_INTERRUPT, NULL, PeriodicCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param NewCallback Callback function
|
||||||
|
@param ExceptionType Which exception to hook
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterExceptionCallback (
|
RegisterExceptionCallback (
|
||||||
|
@ -521,22 +512,6 @@ RegisterExceptionCallback (
|
||||||
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
DebugSupport protocol member function
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
NewCallback - Callback function
|
|
||||||
ExceptionType - Which exception to hook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
return ManageIvtEntryTable (
|
return ManageIvtEntryTable (
|
||||||
ExceptionType,
|
ExceptionType,
|
||||||
|
@ -545,6 +520,17 @@ Returns:
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param Start Physical base of the memory range to be invalidated
|
||||||
|
@param Length mininum number of bytes in instruction cache to invalidate
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always returned.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InvalidateInstructionCache (
|
InvalidateInstructionCache (
|
||||||
|
@ -553,22 +539,7 @@ InvalidateInstructionCache (
|
||||||
IN VOID *Start,
|
IN VOID *Start,
|
||||||
IN UINTN Length
|
IN UINTN Length
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
Start - Physical base of the memory range to be invalidated
|
|
||||||
Length - mininum number of bytes in instruction cache to invalidate
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
InstructionCacheFlush (Start, Length);
|
InstructionCacheFlush (Start, Length);
|
||||||
return (EFI_SUCCESS);
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/**@file
|
/** @file
|
||||||
IPF specific debugsupport types, macros, and definitions.
|
IPF specific debugsupport types, macros, and definitions.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2006 Intel Corporation
|
Copyright (c) 2004 - 2006 Intel Corporation
|
||||||
|
@ -12,8 +12,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef _PLDEBUG_SUPPORT_H
|
#ifndef _PLDEBUG_SUPPORT_H_
|
||||||
#define _PLDEBUG_SUPPORT_H
|
#define _PLDEBUG_SUPPORT_H_
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
@ -36,252 +36,167 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
//
|
//
|
||||||
#define EFI_ISA IsaIpf
|
#define EFI_ISA IsaIpf
|
||||||
|
|
||||||
//
|
/**
|
||||||
// processor specific functions that must be public
|
IPF specific DebugSupport driver initialization.
|
||||||
//
|
|
||||||
|
Must be public because it's referenced from DebugSupport.c
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
plInitializeDebugSupportDriver (
|
PlInitializeDebugSupportDriver (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
IPF specific DebugSupport driver initialization. Must be public because it's
|
|
||||||
referenced from DebugSupport.c
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
plUnloadDebugSupportDriver (
|
|
||||||
IN EFI_HANDLE ImageHandle
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Unload handler that is called during UnloadImage() - deallocates pool memory
|
Unload handler that is called during UnloadImage() - deallocates pool memory
|
||||||
used by the driver. Must be public because it's referenced from DebugSuport.c
|
used by the driver. Must be public because it's referenced from DebugSuport.c
|
||||||
|
|
||||||
Arguments:
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||||
ImageHandle - Image handle
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
PlUnloadDebugSupportDriver (
|
||||||
|
IN EFI_HANDLE ImageHandle
|
||||||
|
);
|
||||||
|
|
||||||
--*/
|
/**
|
||||||
;
|
C callable function to obtain the current value of IVA.
|
||||||
|
|
||||||
//
|
@return Current value of IVA.
|
||||||
// Assembly worker functions and data referenced from PlDebugSupport.c
|
|
||||||
//
|
**/
|
||||||
VOID *
|
VOID *
|
||||||
GetIva (
|
GetIva (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
C callable function to obtain the current value of IVA
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Current value if IVA
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
VOID
|
|
||||||
HookStub (
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
|
/**
|
||||||
HookStub will be copied from it's loaded location into the IVT when
|
HookStub will be copied from it's loaded location into the IVT when
|
||||||
an IVT entry is hooked.
|
an IVT entry is hooked.
|
||||||
|
|
||||||
Arguments:
|
**/
|
||||||
|
VOID
|
||||||
|
HookStub (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
None
|
/**
|
||||||
|
Chains an interrupt handler.
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
ChainHandler (
|
ChainHandler (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Unchains an interrupt handler.
|
||||||
Chains an interrupt handler
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
UnchainHandler (
|
UnchainHandler (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
C callable function to enable/disable interrupts.
|
||||||
|
|
||||||
Unchains an interrupt handler
|
@param NewInterruptState New Interrupt State.
|
||||||
|
|
||||||
Arguments:
|
@return Previous state of psr.ic.
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
UINT64
|
UINT64
|
||||||
ProgramInterruptFlags (
|
ProgramInterruptFlags (
|
||||||
IN UINT64 NewInterruptState
|
IN UINT64 NewInterruptState
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Flushes instruction cache for specified number of bytes.
|
||||||
|
|
||||||
C callable function to enable/disable interrupts
|
@param StartAddress Cache Start Address.
|
||||||
|
@param SizeInBytes Cache Size.
|
||||||
Arguments:
|
|
||||||
|
|
||||||
NewInterruptState - New Interrupt State
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Previous state of psr.ic
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
InstructionCacheFlush (
|
InstructionCacheFlush (
|
||||||
IN VOID *StartAddress,
|
IN VOID *StartAddress,
|
||||||
IN UINTN SizeInBytes
|
IN UINTN SizeInBytes
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
This is a DebugSupport protocol member function, hard
|
||||||
|
coded to support only 1 processor for now.
|
||||||
|
|
||||||
Flushes instruction cache for specified number of bytes
|
@param This The DebugSupport instance
|
||||||
|
@param MaxProcessorIndex The maximuim supported processor index
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
|
||||||
|
|
||||||
StartAddress - Cache Start Address
|
|
||||||
SizeInBytes - Cache Size
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetMaximumProcessorIndex (
|
GetMaximumProcessorIndex (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
OUT UINTN *MaxProcessorIndex
|
OUT UINTN *MaxProcessorIndex
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function. Hard
|
/**
|
||||||
coded to support only 1 processor for now.
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
Arguments:
|
@param This The DebugSupport instance
|
||||||
This - The DebugSupport instance
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
MaxProcessorIndex - The maximuim supported processor index
|
@param PeriodicCallback Callback function
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterPeriodicCallback (
|
RegisterPeriodicCallback (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
DebugSupport protocol member function
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
Arguments:
|
@param This The DebugSupport instance
|
||||||
This - The DebugSupport instance
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
@param NewCallback Callback function
|
||||||
PeriodicCallback - Callback function
|
@param ExceptionType Which exception to hook
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterExceptionCallback (
|
RegisterExceptionCallback (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_EXCEPTION_CALLBACK NewHandler,
|
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
DebugSupport protocol member function
|
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
||||||
|
|
||||||
Arguments:
|
@param This The DebugSupport instance
|
||||||
This - The DebugSupport instance
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
@param Start Physical base of the memory range to be invalidated
|
||||||
NewCallback - Callback function
|
@param Length mininum number of bytes in instruction cache to invalidate
|
||||||
ExceptionType - Which exception to hook
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Always returned.
|
||||||
|
|
||||||
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InvalidateInstructionCache (
|
InvalidateInstructionCache (
|
||||||
|
@ -289,44 +204,19 @@ InvalidateInstructionCache (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN VOID *Start,
|
IN VOID *Start,
|
||||||
IN UINTN Length
|
IN UINTN Length
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
C routine that is called for all registered exceptions. This is the main
|
||||||
|
exception dispatcher. Must be public because it's referenced from AsmFuncs.s.
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
Start - Physical base of the memory range to be invalidated
|
|
||||||
Length - mininum number of bytes in instruction cache to invalidate
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
@param ExceptionType Exception Type
|
||||||
|
@param Context System Context
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
CommonHandler (
|
CommonHandler (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
IN EFI_SYSTEM_CONTEXT Context
|
IN EFI_SYSTEM_CONTEXT Context
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
C routine that is called for all registered exceptions. This is the main
|
|
||||||
exception dispatcher. Must be public because it's referenced from AsmFuncs.s.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - Exception Type
|
|
||||||
Context - System Context
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/**@file
|
/** @file
|
||||||
X64 specific debug support functions
|
X64 specific debug support functions
|
||||||
|
|
||||||
Copyright (c) 2006 - 2007, Intel Corporation
|
Copyright (c) 2006 - 2007, Intel Corporation
|
||||||
|
@ -23,25 +23,24 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
IDT_ENTRY *IdtEntryTable = NULL;
|
IDT_ENTRY *IdtEntryTable = NULL;
|
||||||
DESCRIPTOR NullDesc = {0, 0};
|
DESCRIPTOR NullDesc = {0, 0};
|
||||||
|
|
||||||
|
/**
|
||||||
|
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.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CreateEntryStub (
|
CreateEntryStub (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
OUT VOID **Stub
|
OUT VOID **Stub
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: 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.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - This is the exception type that the new stub will be created
|
|
||||||
for.
|
|
||||||
Stub - On successful exit, *Stub contains the newly allocated entry stub.
|
|
||||||
Returns:
|
|
||||||
Typically EFI_SUCCESS
|
|
||||||
other possibilities are passed through from AllocatePool
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
UINT8 *StubCopy;
|
UINT8 *StubCopy;
|
||||||
|
|
||||||
|
@ -71,14 +70,7 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
HookEntry (
|
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType,
|
|
||||||
IN VOID (*NewCallback) ()
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Creates a nes entry stub. Then saves the current IDT entry and replaces it
|
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 an interrupt gate for the new entry point. The IdtEntryTable is updated
|
||||||
with the new registered function.
|
with the new registered function.
|
||||||
|
@ -86,15 +78,17 @@ Routine Description:
|
||||||
This code executes in boot services context. The stub entry executes in interrupt
|
This code executes in boot services context. The stub entry executes in interrupt
|
||||||
context.
|
context.
|
||||||
|
|
||||||
Arguments:
|
@param ExceptionType Specifies which vector to hook.
|
||||||
ExceptionType - specifies which vector to hook.
|
@param NewCallback A pointer to the new function to be registered.
|
||||||
NewCallback - a pointer to the new function to be registered.
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Always.
|
||||||
EFI_SUCCESS
|
|
||||||
Other possibilities are passed through by CreateEntryStub
|
|
||||||
|
|
||||||
--*/
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
HookEntry (
|
||||||
|
IN EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
|
IN VOID (*NewCallback) ()
|
||||||
|
)
|
||||||
{
|
{
|
||||||
BOOLEAN OldIntFlagState;
|
BOOLEAN OldIntFlagState;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
@ -102,7 +96,7 @@ Returns:
|
||||||
Status = CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);
|
Status = CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);
|
||||||
if (Status == EFI_SUCCESS) {
|
if (Status == EFI_SUCCESS) {
|
||||||
OldIntFlagState = WriteInterruptFlag (0);
|
OldIntFlagState = WriteInterruptFlag (0);
|
||||||
ReadIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
READ_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
||||||
|
|
||||||
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[0] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc.Low)[0];
|
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[0] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc.Low)[0];
|
||||||
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[1] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc.Low)[3];
|
((UINT16 *) &IdtEntryTable[ExceptionType].OrigVector)[1] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc.Low)[3];
|
||||||
|
@ -110,73 +104,64 @@ Returns:
|
||||||
|
|
||||||
Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);
|
Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);
|
||||||
IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
|
IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
|
||||||
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
|
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
|
||||||
WriteInterruptFlag (OldIntFlagState);
|
WriteInterruptFlag (OldIntFlagState);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Undoes HookEntry. This code executes in boot services context.
|
||||||
|
|
||||||
|
@param ExceptionType Specifies which entry to unhook
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UnhookEntry (
|
UnhookEntry (
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Undoes HookEntry. This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - specifies which entry to unhook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
BOOLEAN OldIntFlagState;
|
BOOLEAN OldIntFlagState;
|
||||||
|
|
||||||
OldIntFlagState = WriteInterruptFlag (0);
|
OldIntFlagState = WriteInterruptFlag (0);
|
||||||
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
|
||||||
WriteInterruptFlag (OldIntFlagState);
|
WriteInterruptFlag (OldIntFlagState);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
ManageIdtEntryTable (
|
|
||||||
VOID (*NewCallback)(),
|
|
||||||
EFI_EXCEPTION_TYPE ExceptionType
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the main worker function that manages the state of the interrupt
|
This is the main worker function that manages the state of the interrupt
|
||||||
handlers. It both installs and uninstalls interrupt handlers based on the
|
handlers. It both installs and uninstalls interrupt handlers based on the
|
||||||
value of NewCallback. If NewCallback is NULL, then uninstall is indicated.
|
value of NewCallback. If NewCallback is NULL, then uninstall is indicated.
|
||||||
If NewCallback is non-NULL, then install is indicated.
|
If NewCallback is non-NULL, then install is indicated.
|
||||||
|
|
||||||
Arguments:
|
@param NewCallback If non-NULL, NewCallback specifies the new handler to register.
|
||||||
NewCallback - If non-NULL, NewCallback specifies the new handler to register.
|
If NULL, specifies that the previously registered handler should
|
||||||
If NULL, specifies that the previously registered handler should
|
be uninstalled.
|
||||||
be uninstalled.
|
@param ExceptionType Indicates which entry to manage.
|
||||||
ExceptionType - Indicates which entry to manage
|
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Process is ok.
|
||||||
EFI_SUCCESS
|
@retval EFI_INVALID_PARAMETER Requested uninstalling a handler from a vector that has
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
no handler registered for it
|
||||||
no handler registered for it
|
@retval EFI_ALREADY_STARTED Requested install to a vector that already has a handler registered.
|
||||||
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.
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
**/
|
||||||
|
EFI_STATUS
|
||||||
--*/
|
ManageIdtEntryTable (
|
||||||
|
VOID (*NewCallback)(),
|
||||||
|
EFI_EXCEPTION_TYPE ExceptionType
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
if (CompareDescriptor (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
|
if (COMPARE_DESCRIPTOR (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
|
||||||
//
|
//
|
||||||
// we've already installed to this vector
|
// we've already installed to this vector
|
||||||
//
|
//
|
||||||
|
@ -205,29 +190,38 @@ Returns:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is a DebugSupport protocol member function, hard
|
||||||
|
coded to support only 1 processor for now.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param MaxProcessorIndex The maximuim supported processor index
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetMaximumProcessorIndex (
|
GetMaximumProcessorIndex (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
OUT UINTN *MaxProcessorIndex
|
OUT UINTN *MaxProcessorIndex
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
MaxProcessorIndex - The maximuim supported processor index
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
*MaxProcessorIndex = 0;
|
*MaxProcessorIndex = 0;
|
||||||
return (EFI_SUCCESS);
|
return (EFI_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param PeriodicCallback Callback function
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterPeriodicCallback (
|
RegisterPeriodicCallback (
|
||||||
|
@ -235,29 +229,24 @@ RegisterPeriodicCallback (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
PeriodicCallback - Callback function
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
return ManageIdtEntryTable (PeriodicCallback, SYSTEM_TIMER_VECTOR);
|
return ManageIdtEntryTable (PeriodicCallback, SYSTEM_TIMER_VECTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
|
This code executes in boot services context.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param NewCallback Callback function
|
||||||
|
@param ExceptionType Which exception to hook
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterExceptionCallback (
|
RegisterExceptionCallback (
|
||||||
|
@ -266,33 +255,21 @@ RegisterExceptionCallback (
|
||||||
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is a DebugSupport protocol member function.
|
|
||||||
|
|
||||||
This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
NewCallback - Callback function
|
|
||||||
ExceptionType - Which exception to hook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
return ManageIdtEntryTable (NewCallback, ExceptionType);
|
return ManageIdtEntryTable (NewCallback, ExceptionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
||||||
|
|
||||||
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param Start Physical base of the memory range to be invalidated
|
||||||
|
@param Length mininum number of bytes in instruction cache to invalidate
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Always returned.
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InvalidateInstructionCache (
|
InvalidateInstructionCache (
|
||||||
|
@ -301,49 +278,27 @@ InvalidateInstructionCache (
|
||||||
IN VOID *Start,
|
IN VOID *Start,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is a DebugSupport protocol member function.
|
|
||||||
Calls assembly routine to flush cache.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
Start - Physical base of the memory range to be invalidated
|
|
||||||
Length - mininum number of bytes in instruction cache to invalidate
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - always return success
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
AsmWbinvd ();
|
AsmWbinvd ();
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initializes driver's handler registration databas.
|
||||||
|
|
||||||
|
This code executes in boot services context
|
||||||
|
Must be public because it's referenced from DebugSupport.c
|
||||||
|
|
||||||
|
@retval EFI_UNSUPPORTED If x64 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
|
EFI_STATUS
|
||||||
plInitializeDebugSupportDriver (
|
PlInitializeDebugSupportDriver (
|
||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
Initializes driver's handler registration database.
|
|
||||||
|
|
||||||
This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_UNSUPPORTED - if X64 processor does not support FXSTOR/FXRSTOR instructions,
|
|
||||||
the context save will fail, so these processor's are not supported.
|
|
||||||
EFI_OUT_OF_RESOURCES - not resource to finish initialization
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
EFI_EXCEPTION_TYPE ExceptionType;
|
EFI_EXCEPTION_TYPE ExceptionType;
|
||||||
|
|
||||||
|
@ -378,28 +333,21 @@ ErrorCleanup:
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS
|
/**
|
||||||
EFIAPI
|
|
||||||
plUnloadDebugSupportDriver (
|
|
||||||
IN EFI_HANDLE ImageHandle
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the callback that is written to the LoadedImage protocol instance
|
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
|
on the image handle. It uninstalls all registered handlers and frees all entry
|
||||||
stub memory.
|
stub memory.
|
||||||
|
|
||||||
This code executes in boot services context.
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always.
|
||||||
ImageHandle - The image handle of the unload handler
|
|
||||||
|
|
||||||
Returns:
|
**/
|
||||||
|
EFI_STATUS
|
||||||
EFI_SUCCESS - always return success
|
EFIAPI
|
||||||
|
PlUnloadDebugSupportDriver (
|
||||||
--*/
|
IN EFI_HANDLE ImageHandle
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_EXCEPTION_TYPE ExceptionType;
|
EFI_EXCEPTION_TYPE ExceptionType;
|
||||||
|
|
||||||
|
@ -411,26 +359,20 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Common piece of code that invokes the registered handlers.
|
||||||
|
|
||||||
|
This code executes in exception context so no efi calls are allowed.
|
||||||
|
|
||||||
|
@param ExceptionType Exception type
|
||||||
|
@param ContextRecord System context
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
InterruptDistrubutionHub (
|
InterruptDistrubutionHub (
|
||||||
EFI_EXCEPTION_TYPE ExceptionType,
|
EFI_EXCEPTION_TYPE ExceptionType,
|
||||||
EFI_SYSTEM_CONTEXT_IA32 *ContextRecord
|
EFI_SYSTEM_CONTEXT_IA32 *ContextRecord
|
||||||
)
|
)
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: Common piece of code that invokes the registered handlers.
|
|
||||||
|
|
||||||
This code executes in exception context so no efi calls are allowed.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
ExceptionType - exception type
|
|
||||||
ContextRecord - system context
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
{
|
{
|
||||||
if (IdtEntryTable[ExceptionType].RegisteredCallback != NULL) {
|
if (IdtEntryTable[ExceptionType].RegisteredCallback != NULL) {
|
||||||
if (ExceptionType != SYSTEM_TIMER_VECTOR) {
|
if (ExceptionType != SYSTEM_TIMER_VECTOR) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**@file
|
/** @file
|
||||||
X64 specific debug support macros, typedefs and prototypes.
|
X64 specific debug support macros, typedefs and prototypes.
|
||||||
|
|
||||||
Copyright (c) 2006, Intel Corporation
|
Copyright (c) 2006 - 2008, Intel Corporation
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -12,8 +12,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef _PLDEBUG_SUPPORT_H
|
#ifndef _PLDEBUG_SUPPORT_H_
|
||||||
#define _PLDEBUG_SUPPORT_H
|
#define _PLDEBUG_SUPPORT_H_
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
@ -32,11 +32,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#define NUM_IDT_ENTRIES 0x78
|
#define NUM_IDT_ENTRIES 0x78
|
||||||
#define SYSTEM_TIMER_VECTOR 0x68
|
#define SYSTEM_TIMER_VECTOR 0x68
|
||||||
#define VECTOR_ENTRY_PAGES 1
|
#define VECTOR_ENTRY_PAGES 1
|
||||||
#define CopyDescriptor(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
|
#define COPY_DESCRIPTOR(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
|
||||||
#define ZeroDescriptor(Dest) CopyDescriptor ((Dest), &NullDesc)
|
#define READ_IDT(Vector, Dest) COPY_DESCRIPTOR ((Dest), &((GetIdtr ())[(Vector)]))
|
||||||
#define ReadIdt(Vector, Dest) CopyDescriptor ((Dest), &((GetIdtr ())[(Vector)]))
|
#define WRITE_IDT(Vector, Src) COPY_DESCRIPTOR (&((GetIdtr ())[(Vector)]), (Src))
|
||||||
#define WriteIdt(Vector, Src) CopyDescriptor (&((GetIdtr ())[(Vector)]), (Src))
|
#define COMPARE_DESCRIPTOR(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
|
||||||
#define CompareDescriptor(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
|
|
||||||
#define EFI_ISA IsaX64
|
#define EFI_ISA IsaX64
|
||||||
#define FF_FXSR (1 << 24)
|
#define FF_FXSR (1 << 24)
|
||||||
|
|
||||||
|
@ -64,214 +63,149 @@ extern UINT8 InterruptEntryStub[];
|
||||||
extern UINT32 StubSize;
|
extern UINT32 StubSize;
|
||||||
extern VOID (*OrigVector) (VOID);
|
extern VOID (*OrigVector) (VOID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Generic IDT entry.
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
CommonIdtEntry (
|
CommonIdtEntry (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Check whether FXSTOR is supported
|
||||||
Generic IDT entry
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
@retval TRUE FXSTOR is supported.
|
||||||
|
@retval FALSE FXSTOR is not supported.
|
||||||
|
|
||||||
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
FxStorSupport (
|
FxStorSupport (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Return the physical address of IDTR.
|
||||||
|
|
||||||
Check whether FXSTOR is supported
|
@return The physical address of IDTR.
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
TRUE - supported
|
|
||||||
FALSE - not supported
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
DESCRIPTOR *
|
DESCRIPTOR *
|
||||||
GetIdtr (
|
GetIdtr (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
|
Encodes an IDT descriptor with the given physical address.
|
||||||
|
|
||||||
Return the physical address of IDTR
|
@param DestDesc The IDT descriptor address.
|
||||||
|
@param Vecotr The interrupt vector entry.
|
||||||
Arguments:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
The physical address of IDTR
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
VOID
|
VOID
|
||||||
Vect2Desc (
|
Vect2Desc (
|
||||||
DESCRIPTOR * DestDesc,
|
DESCRIPTOR * DestDesc,
|
||||||
VOID (*Vector) (VOID)
|
VOID (*Vector) (VOID)
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
Encodes an IDT descriptor with the given physical address
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
|
|
||||||
DestDesc - The IDT descriptor address
|
|
||||||
Vector - The interrupt vector entry
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
WriteInterruptFlag (
|
|
||||||
BOOLEAN NewState
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
|
|
||||||
|
/**
|
||||||
Programs interrupt flag to the requested state and returns previous
|
Programs interrupt flag to the requested state and returns previous
|
||||||
state.
|
state.
|
||||||
|
|
||||||
Arguments:
|
@param NewState New interrupt status.
|
||||||
|
|
||||||
NewState - New interrupt status
|
@retval TRUE Old interrupt status is TRUE.
|
||||||
|
@retval FALSE Old interrupt status is FALSE
|
||||||
|
|
||||||
Returns:
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
WriteInterruptFlag (
|
||||||
|
BOOLEAN NewState
|
||||||
|
);
|
||||||
|
|
||||||
Old interrupt status
|
/**
|
||||||
|
Initializes driver's handler registration databas.
|
||||||
|
|
||||||
|
This code executes in boot services context
|
||||||
|
Must be public because it's referenced from DebugSupport.c
|
||||||
|
|
||||||
--*/
|
@retval EFI_UNSUPPORTED If x64 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
|
EFI_STATUS
|
||||||
plInitializeDebugSupportDriver (
|
PlInitializeDebugSupportDriver (
|
||||||
VOID
|
VOID
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
Initializes driver's handler registration database.
|
|
||||||
|
|
||||||
This code executes in boot services context.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
None
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_UNSUPPORTED - if X64 processor does not support FXSTOR/FXRSTOR instructions,
|
|
||||||
the context save will fail, so these processor's are not supported.
|
|
||||||
EFI_OUT_OF_RESOURCES - not resource to finish initialization
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
plUnloadDebugSupportDriver (
|
|
||||||
IN EFI_HANDLE ImageHandle
|
|
||||||
)
|
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is the callback that is written to the LoadedImage protocol instance
|
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
|
on the image handle. It uninstalls all registered handlers and frees all entry
|
||||||
stub memory.
|
stub memory.
|
||||||
|
|
||||||
This code executes in boot services context.
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always.
|
||||||
ImageHandle - The image handle of the unload handler
|
|
||||||
|
|
||||||
Returns:
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
PlUnloadDebugSupportDriver (
|
||||||
|
IN EFI_HANDLE ImageHandle
|
||||||
|
);
|
||||||
|
|
||||||
EFI_SUCCESS - always return success
|
/**
|
||||||
|
This is a DebugSupport protocol member function, hard
|
||||||
|
coded to support only 1 processor for now.
|
||||||
|
|
||||||
--*/
|
@param This The DebugSupport instance
|
||||||
;
|
@param MaxProcessorIndex The maximuim supported processor index
|
||||||
|
|
||||||
//
|
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
|
||||||
// DebugSupport protocol member functions
|
|
||||||
//
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetMaximumProcessorIndex (
|
GetMaximumProcessorIndex (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
OUT UINTN *MaxProcessorIndex
|
OUT UINTN *MaxProcessorIndex
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
Arguments:
|
@param This The DebugSupport instance
|
||||||
This - The DebugSupport instance
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
MaxProcessorIndex - The maximuim supported processor index
|
@param PeriodicCallback Callback function
|
||||||
|
|
||||||
Returns:
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
|
@retval others Callback was not registered.
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterPeriodicCallback (
|
RegisterPeriodicCallback (
|
||||||
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
IN EFI_PERIODIC_CALLBACK PeriodicCallback
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description: This is a DebugSupport protocol member function.
|
/**
|
||||||
|
DebugSupport protocol member function.
|
||||||
|
|
||||||
Arguments:
|
This code executes in boot services context.
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
PeriodicCallback - Callback function
|
|
||||||
|
|
||||||
Returns:
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param NewCallback Callback function
|
||||||
|
@param ExceptionType Which exception to hook
|
||||||
|
|
||||||
EFI_SUCCESS
|
@retval EFI_SUCCESS Indicates the callback was registered.
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
@retval others Callback was not registered.
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
RegisterExceptionCallback (
|
RegisterExceptionCallback (
|
||||||
|
@ -279,32 +213,19 @@ RegisterExceptionCallback (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
IN EFI_EXCEPTION_CALLBACK NewCallback,
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType
|
IN EFI_EXCEPTION_TYPE ExceptionType
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
/**
|
||||||
This is a DebugSupport protocol member function.
|
DebugSupport protocol member function. Calls assembly routine to flush cache.
|
||||||
|
|
||||||
This code executes in boot services context.
|
@param This The DebugSupport instance
|
||||||
|
@param ProcessorIndex Which processor the callback applies to.
|
||||||
|
@param Start Physical base of the memory range to be invalidated
|
||||||
|
@param Length mininum number of bytes in instruction cache to invalidate
|
||||||
|
|
||||||
Arguments:
|
@retval EFI_SUCCESS Always returned.
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
NewCallback - Callback function
|
|
||||||
ExceptionType - Which exception to hook
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS
|
|
||||||
EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
|
|
||||||
no handler registered for it
|
|
||||||
EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered.
|
|
||||||
|
|
||||||
Other possible return values are passed through from UnHookEntry and HookEntry.
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InvalidateInstructionCache (
|
InvalidateInstructionCache (
|
||||||
|
@ -312,24 +233,6 @@ InvalidateInstructionCache (
|
||||||
IN UINTN ProcessorIndex,
|
IN UINTN ProcessorIndex,
|
||||||
IN VOID *Start,
|
IN VOID *Start,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
);
|
||||||
/*++
|
|
||||||
|
|
||||||
Routine Description:
|
|
||||||
This is a DebugSupport protocol member function.
|
|
||||||
Calls assembly routine to flush cache.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
This - The DebugSupport instance
|
|
||||||
ProcessorIndex - Which processor the callback applies to.
|
|
||||||
Start - Physical base of the memory range to be invalidated
|
|
||||||
Length - mininum number of bytes in instruction cache to invalidate
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
EFI_SUCCESS - always return success
|
|
||||||
|
|
||||||
--*/
|
|
||||||
;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue