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:
vanjeff 2008-11-05 08:44:03 +00:00
parent e1a590c3e7
commit 9e604fe42d
12 changed files with 744 additions and 1204 deletions

View File

@ -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
of modes for all console out devices. Because EFI/UEFI spec require
@ -2256,8 +2256,6 @@ ConSplitterAddOutputMode (
@param MaxMode Current max text mode
@param CurrentMode Current text mode
@retval None
**/
VOID
ConSplitterGetIntersection (

View File

@ -30,7 +30,7 @@ CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };
@param This Protocol instance pointer.
@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
@retval EFI_SUCCESS Mode information returned.

View File

@ -586,7 +586,7 @@ TerminalConOutEnableCursor (
Test to see if this driver supports Controller.
@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
device to start.
@ -1305,8 +1305,6 @@ UnicodeToUtf8 (
@param ValidBytes The count of returned VT-VTF8 characters.
If ValidBytes is zero, no valid VT-UTF8 returned.
@retval None.
**/
VOID
GetOneValidUtf8Char (

View File

@ -60,8 +60,6 @@ VTUTF8RawDataToUnicode (
@param ValidBytes The count of returned VT-VTF8 characters.
If ValidBytes is zero, no valid VT-UTF8 returned.
@retval None.
**/
VOID
GetOneValidUtf8Char (

View File

@ -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
debug port. Binds exclusively to SerialIo. Reverts to defaults if no variable

View File

@ -28,31 +28,26 @@ EFI_DEBUG_SUPPORT_PROTOCOL gDebugSupportProtocolInterface = {
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
InitializeDebugSupportDriver (
IN EFI_HANDLE ImageHandle,
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_STATUS Status;
@ -111,12 +106,12 @@ Returns:
goto ErrExit;
}
LoadedImageProtocolPtr->Unload = plUnloadDebugSupportDriver;
LoadedImageProtocolPtr->Unload = PlUnloadDebugSupportDriver;
//
// Call hook for platform specific initialization
//
Status = plInitializeDebugSupportDriver ();
Status = PlInitializeDebugSupportDriver ();
ASSERT (!EFI_ERROR (Status));
if (Status != EFI_SUCCESS) {
goto ErrExit;

View File

@ -1,7 +1,7 @@
/**@file
/** @file
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
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
@ -23,25 +23,24 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
IDT_ENTRY *IdtEntryTable = NULL;
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
CreateEntryStub (
IN EFI_EXCEPTION_TYPE ExceptionType,
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;
@ -73,14 +72,7 @@ Returns:
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
with an interrupt gate for the new entry point. The IdtEntryTable is updated
with the new registered function.
@ -88,15 +80,17 @@ Routine Description:
This code executes in boot services context. The stub entry executes in interrupt
context.
Arguments:
ExceptionType - specifies which vector to hook.
NewCallback - a pointer to the new function to be registered.
@param ExceptionType Specifies which vector to hook.
@param NewCallback A pointer to the new function to be registered.
Returns:
EFI_SUCCESS
Other possibilities are passed through by CreateEntryStub
@retval EFI_SUCCESS Always.
--*/
**/
EFI_STATUS
HookEntry (
IN EFI_EXCEPTION_TYPE ExceptionType,
IN VOID (*NewCallback) ()
)
{
BOOLEAN OldIntFlagState;
EFI_STATUS Status;
@ -104,81 +98,72 @@ Returns:
Status = CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);
if (Status == EFI_SUCCESS) {
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)[1] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc)[3];
Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);
IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
WriteInterruptFlag (OldIntFlagState);
}
return Status;
}
/**
Undoes HookEntry. This code executes in boot services context.
@param ExceptionType Specifies which entry to unhook
@retval EFI_SUCCESS Always.
**/
EFI_STATUS
UnhookEntry (
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;
OldIntFlagState = WriteInterruptFlag (0);
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
WriteInterruptFlag (OldIntFlagState);
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
handlers. It both installs and uninstalls interrupt handlers based on the
value of NewCallback. If NewCallback is NULL, then uninstall is indicated.
If NewCallback is non-NULL, then install is indicated.
Arguments:
NewCallback - If non-NULL, NewCallback specifies the new handler to register.
If NULL, specifies that the previously registered handler should
be uninstalled.
ExceptionType - Indicates which entry to manage
@param NewCallback If non-NULL, NewCallback specifies the new handler to register.
If NULL, specifies that the previously registered handler should
be uninstalled.
@param ExceptionType Indicates which entry to manage.
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.
@retval EFI_SUCCESS Process is ok.
@retval EFI_INVALID_PARAMETER Requested uninstalling a handler from a vector that has
no handler registered for it
@retval EFI_ALREADY_STARTED Requested install to a vector that already has a handler registered.
@retval others Possible return values are passed through from UnHookEntry and HookEntry.
Other possible return values are passed through from UnHookEntry and HookEntry.
--*/
**/
EFI_STATUS
ManageIdtEntryTable (
VOID (*NewCallback)(),
EFI_EXCEPTION_TYPE ExceptionType
)
{
EFI_STATUS Status;
Status = EFI_SUCCESS;
if (!FeaturePcdGet (PcdNtEmulatorEnable)) {
if (CompareDescriptor (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
if (COMPARE_DESCRIPTOR (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
//
// we've already installed to this vector
//
@ -208,29 +193,38 @@ Returns:
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
EFIAPI
GetMaximumProcessorIndex (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
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;
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
EFIAPI
RegisterPeriodicCallback (
@ -238,29 +232,24 @@ RegisterPeriodicCallback (
IN UINTN ProcessorIndex,
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);
}
/**
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
EFIAPI
RegisterExceptionCallback (
@ -269,33 +258,21 @@ RegisterExceptionCallback (
IN EFI_EXCEPTION_CALLBACK NewCallback,
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);
}
/**
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
EFIAPI
InvalidateInstructionCache (
@ -304,49 +281,27 @@ InvalidateInstructionCache (
IN VOID *Start,
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 ();
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
plInitializeDebugSupportDriver (
PlInitializeDebugSupportDriver (
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;
@ -381,28 +336,21 @@ ErrorCleanup:
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
on the image handle. It uninstalls all registered handlers and frees all entry
stub memory.
This code executes in boot services context.
@param ImageHandle The firmware allocated handle for the EFI image.
Arguments:
ImageHandle - The image handle of the unload handler
@retval EFI_SUCCESS Always.
Returns:
EFI_SUCCESS - always return success
--*/
**/
EFI_STATUS
EFIAPI
PlUnloadDebugSupportDriver (
IN EFI_HANDLE ImageHandle
)
{
EFI_EXCEPTION_TYPE ExceptionType;
@ -414,26 +362,20 @@ Returns:
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
InterruptDistrubutionHub (
EFI_EXCEPTION_TYPE ExceptionType,
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 (ExceptionType != SYSTEM_TIMER_VECTOR) {

View File

@ -1,7 +1,7 @@
/**@file
/** @file
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
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
@ -12,8 +12,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _PLDEBUG_SUPPORT_H
#define _PLDEBUG_SUPPORT_H
#ifndef _PLDEBUG_SUPPORT_H_
#define _PLDEBUG_SUPPORT_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 SYSTEM_TIMER_VECTOR 0x68
#define VECTOR_ENTRY_PAGES 1
#define CopyDescriptor(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
#define ZeroDescriptor(Dest) CopyDescriptor ((Dest), &NullDesc)
#define ReadIdt(Vector, Dest) CopyDescriptor ((Dest), &((GetIdtr ())[(Vector)]))
#define WriteIdt(Vector, Src) CopyDescriptor (&((GetIdtr ())[(Vector)]), (Src))
#define CompareDescriptor(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
#define COPY_DESCRIPTOR(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
#define READ_IDT(Vector, Dest) COPY_DESCRIPTOR ((Dest), &((GetIdtr ())[(Vector)]))
#define WRITE_IDT(Vector, Src) COPY_DESCRIPTOR (&((GetIdtr ())[(Vector)]), (Src))
#define COMPARE_DESCRIPTOR(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
#define EFI_ISA IsaIa32
#define FF_FXSR (1 << 24)
@ -61,214 +60,149 @@ extern UINT8 InterruptEntryStub[];
extern UINT32 StubSize;
extern VOID (*OrigVector) (VOID);
/**
Generic IDT entry.
**/
VOID
CommonIdtEntry (
VOID
)
/*++
);
Routine Description:
Generic IDT entry
Arguments:
None
Returns:
None
--*/
;
/**
Check whether FXSTOR is supported
@retval TRUE FXSTOR is supported.
@retval FALSE FXSTOR is not supported.
**/
BOOLEAN
FxStorSupport (
VOID
)
/*++
);
Routine Description:
/**
Return the physical address of IDTR.
Check whether FXSTOR is supported
Arguments:
None
Returns:
TRUE - supported
FALSE - not supported
--*/
;
@return The physical address of IDTR.
**/
DESCRIPTOR *
GetIdtr (
VOID
)
/*++
);
Routine Description:
/**
Encodes an IDT descriptor with the given physical address.
Return the physical address of IDTR
Arguments:
None
Returns:
The physical address of IDTR
--*/
;
@param DestDesc The IDT descriptor address.
@param Vecotr The interrupt vector entry.
**/
VOID
Vect2Desc (
DESCRIPTOR * DestDesc,
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
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
plInitializeDebugSupportDriver (
PlInitializeDebugSupportDriver (
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
on the image handle. It uninstalls all registered handlers and frees all entry
stub memory.
This code executes in boot services context.
@param ImageHandle The firmware allocated handle for the EFI image.
Arguments:
ImageHandle - The image handle of the unload handler
@retval EFI_SUCCESS Always.
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
//
// DebugSupport protocol member functions
//
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
**/
EFI_STATUS
EFIAPI
GetMaximumProcessorIndex (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
OUT UINTN *MaxProcessorIndex
)
/*++
);
Routine Description: This is a DebugSupport protocol member function.
/**
DebugSupport protocol member function.
Arguments:
This - The DebugSupport instance
MaxProcessorIndex - The maximuim supported processor index
@param This The DebugSupport instance
@param ProcessorIndex Which processor the callback applies to.
@param PeriodicCallback Callback function
Returns:
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
--*/
;
@retval EFI_SUCCESS Indicates the callback was registered.
@retval others Callback was not registered.
**/
EFI_STATUS
EFIAPI
RegisterPeriodicCallback (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
IN UINTN ProcessorIndex,
IN EFI_PERIODIC_CALLBACK PeriodicCallback
)
/*++
);
Routine Description: This is a DebugSupport protocol member function.
/**
DebugSupport protocol member function.
Arguments:
This - The DebugSupport instance
ProcessorIndex - Which processor the callback applies to.
PeriodicCallback - Callback function
This code executes in boot services context.
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
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.
--*/
;
@retval EFI_SUCCESS Indicates the callback was registered.
@retval others Callback was not registered.
**/
EFI_STATUS
EFIAPI
RegisterExceptionCallback (
@ -276,32 +210,19 @@ RegisterExceptionCallback (
IN UINTN ProcessorIndex,
IN EFI_EXCEPTION_CALLBACK NewCallback,
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:
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.
--*/
;
@retval EFI_SUCCESS Always returned.
**/
EFI_STATUS
EFIAPI
InvalidateInstructionCache (
@ -309,24 +230,6 @@ InvalidateInstructionCache (
IN UINTN ProcessorIndex,
IN VOID *Start,
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

View File

@ -1,4 +1,4 @@
/**@file
/** @file
IPF specific debug support functions
Copyright (c) 2006 - 2008, Intel Corporation
@ -35,35 +35,82 @@ typedef struct {
VOID (*RegisteredCallback) ();
} 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
ManageIvtEntryTable (
IN EFI_EXCEPTION_TYPE ExceptionType,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN BUNDLE NewBundles[4],
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
HookEntry (
IN EFI_EXCEPTION_TYPE ExceptionType,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN BUNDLE NewBundles[4],
IN VOID (*NewCallback) ()
);
/**
Restores original IVT contents when unregistering a callback function.
@param ExceptionType Exception Type
**/
VOID
UnhookEntry (
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
ChainExternalInterrupt (
IN VOID (*NewCallback) ()
);
/**
Sets up cache flush and calls assembly function to restore external interrupt.
Removes registered callback from IvtEntryTable.
**/
VOID
UnchainExternalInterrupt (
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
GetHandlerEntryPoint (
UINTN HandlerIndex,
@ -85,48 +132,38 @@ UINT8 IpfContextBuf[sizeof (EFI_SYSTEM_CONTEXT_IPF) + 512];
UINT8 PatchSaveBuffer[0x400];
UINTN ExternalInterruptCount;
/**
IPF specific DebugSupport driver initialization.
Must be public because it's referenced from DebugSupport.c
@retval EFI_SUCCESS Always.
**/
EFI_STATUS
plInitializeDebugSupportDriver (
PlInitializeDebugSupportDriver (
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);
ExternalInterruptCount = 0;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
plUnloadDebugSupportDriver (
IN EFI_HANDLE ImageHandle
)
/*++
Routine Description:
/**
Unload handler that is called during UnloadImage() - deallocates pool memory
used by the driver. Must be public because it's referenced from DebugSuport.c
Arguments:
ImageHandle - Image handle
@param ImageHandle The firmware allocated handle for the EFI image.
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;
@ -137,26 +174,18 @@ Returns:
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
CommonHandler (
IN EFI_EXCEPTION_TYPE ExceptionType,
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 ();
if (mInHandler) {
@ -189,25 +218,18 @@ Returns:
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
GetHandlerEntryPoint (
UINTN HandlerIndex,
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;
@ -231,29 +253,24 @@ Returns:
*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
ManageIvtEntryTable (
IN EFI_EXCEPTION_TYPE ExceptionType,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN BUNDLE NewBundles[NUM_BUNDLES_IN_STUB],
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;
UINT64 InterruptFlags;
@ -313,28 +330,21 @@ Returns:
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
HookEntry (
IN EFI_EXCEPTION_TYPE ExceptionType,
IN BUNDLE NewBundles[4],
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 *B0Ptr;
@ -367,25 +377,16 @@ Returns:
IvtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
}
/**
Restores original IVT contents when unregistering a callback function.
@param ExceptionType Exception Type
**/
VOID
UnhookEntry (
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;
@ -404,24 +405,18 @@ Returns:
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
ChainExternalInterrupt (
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;
@ -431,24 +426,15 @@ Returns:
InstructionCacheFlush (Start, 0x400);
}
/**
Sets up cache flush and calls assembly function to restore external interrupt.
Removes registered callback from IvtEntryTable.
**/
VOID
UnchainExternalInterrupt (
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;
@ -463,56 +449,61 @@ Returns:
// 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
EFIAPI
GetMaximumProcessorIndex (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
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;
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
EFIAPI
RegisterPeriodicCallback (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
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
EFIAPI
RegisterExceptionCallback (
@ -521,22 +512,6 @@ RegisterExceptionCallback (
IN EFI_EXCEPTION_CALLBACK NewCallback,
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 (
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
EFIAPI
InvalidateInstructionCache (
@ -553,22 +539,7 @@ InvalidateInstructionCache (
IN VOID *Start,
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);
return (EFI_SUCCESS);
return EFI_SUCCESS;
}

View File

@ -1,4 +1,4 @@
/**@file
/** @file
IPF specific debugsupport types, macros, and definitions.
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
#define _PLDEBUG_SUPPORT_H
#ifndef _PLDEBUG_SUPPORT_H_
#define _PLDEBUG_SUPPORT_H_
#include <Uefi.h>
@ -36,252 +36,167 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
#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
plInitializeDebugSupportDriver (
PlInitializeDebugSupportDriver (
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
used by the driver. Must be public because it's referenced from DebugSuport.c
Arguments:
ImageHandle - Image handle
@param ImageHandle The firmware allocated handle for the EFI image.
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.
//
// Assembly worker functions and data referenced from PlDebugSupport.c
//
@return Current value of IVA.
**/
VOID *
GetIva (
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
an IVT entry is hooked.
Arguments:
**/
VOID
HookStub (
VOID
);
None
Returns:
None
--*/
;
/**
Chains an interrupt handler.
**/
VOID
ChainHandler (
VOID
)
/*++
);
Routine Description:
Chains an interrupt handler
Arguments:
None
Returns:
None
--*/
;
/**
Unchains an interrupt handler.
**/
VOID
UnchainHandler (
VOID
)
/*++
);
Routine Description:
/**
C callable function to enable/disable interrupts.
Unchains an interrupt handler
@param NewInterruptState New Interrupt State.
Arguments:
None
Returns:
None
--*/
;
@return Previous state of psr.ic.
**/
UINT64
ProgramInterruptFlags (
IN UINT64 NewInterruptState
)
/*++
);
Routine Description:
/**
Flushes instruction cache for specified number of bytes.
C callable function to enable/disable interrupts
Arguments:
NewInterruptState - New Interrupt State
Returns:
Previous state of psr.ic
--*/
;
@param StartAddress Cache Start Address.
@param SizeInBytes Cache Size.
**/
VOID
InstructionCacheFlush (
IN VOID *StartAddress,
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:
StartAddress - Cache Start Address
SizeInBytes - Cache Size
Returns:
None
--*/
;
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
**/
EFI_STATUS
EFIAPI
GetMaximumProcessorIndex (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
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:
This - The DebugSupport instance
MaxProcessorIndex - The maximuim supported processor index
@param This The DebugSupport instance
@param ProcessorIndex Which processor the callback applies to.
@param PeriodicCallback Callback function
Returns:
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
--*/
;
@retval EFI_SUCCESS Indicates the callback was registered.
@retval others Callback was not registered.
**/
EFI_STATUS
EFIAPI
RegisterPeriodicCallback (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
IN UINTN ProcessorIndex,
IN EFI_PERIODIC_CALLBACK PeriodicCallback
)
/*++
);
Routine Description:
DebugSupport protocol member function
/**
DebugSupport protocol member function.
Arguments:
This - The DebugSupport instance
ProcessorIndex - Which processor the callback applies to.
PeriodicCallback - Callback function
@param This The DebugSupport instance
@param ProcessorIndex Which processor the callback applies to.
@param NewCallback Callback function
@param ExceptionType Which exception to hook
Returns:
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
--*/
;
@retval EFI_SUCCESS Indicates the callback was registered.
@retval others Callback was not registered.
**/
EFI_STATUS
EFIAPI
RegisterExceptionCallback (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
IN UINTN ProcessorIndex,
IN EFI_EXCEPTION_CALLBACK NewHandler,
IN EFI_EXCEPTION_CALLBACK NewCallback,
IN EFI_EXCEPTION_TYPE ExceptionType
)
/*++
);
Routine Description:
DebugSupport protocol member function
/**
DebugSupport protocol member function. Calls assembly routine to flush cache.
Arguments:
This - The DebugSupport instance
ProcessorIndex - Which processor the callback applies to.
NewCallback - Callback function
ExceptionType - Which exception to hook
@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
Returns:
EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.
--*/
;
@retval EFI_SUCCESS Always returned.
**/
EFI_STATUS
EFIAPI
InvalidateInstructionCache (
@ -289,44 +204,19 @@ InvalidateInstructionCache (
IN UINTN ProcessorIndex,
IN VOID *Start,
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
--*/
;
/**
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
CommonHandler (
IN EFI_EXCEPTION_TYPE ExceptionType,
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

View File

@ -1,4 +1,4 @@
/**@file
/** @file
X64 specific debug support functions
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;
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
CreateEntryStub (
IN EFI_EXCEPTION_TYPE ExceptionType,
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;
@ -71,14 +70,7 @@ Returns:
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
with an interrupt gate for the new entry point. The IdtEntryTable is updated
with the new registered function.
@ -86,15 +78,17 @@ Routine Description:
This code executes in boot services context. The stub entry executes in interrupt
context.
Arguments:
ExceptionType - specifies which vector to hook.
NewCallback - a pointer to the new function to be registered.
@param ExceptionType Specifies which vector to hook.
@param NewCallback A pointer to the new function to be registered.
Returns:
EFI_SUCCESS
Other possibilities are passed through by CreateEntryStub
@retval EFI_SUCCESS Always.
--*/
**/
EFI_STATUS
HookEntry (
IN EFI_EXCEPTION_TYPE ExceptionType,
IN VOID (*NewCallback) ()
)
{
BOOLEAN OldIntFlagState;
EFI_STATUS Status;
@ -102,7 +96,7 @@ Returns:
Status = CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);
if (Status == EFI_SUCCESS) {
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)[1] = ((UINT16 *) &IdtEntryTable[ExceptionType].OrigDesc.Low)[3];
@ -110,73 +104,64 @@ Returns:
Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);
IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));
WriteInterruptFlag (OldIntFlagState);
}
return Status;
}
/**
Undoes HookEntry. This code executes in boot services context.
@param ExceptionType Specifies which entry to unhook
@retval EFI_SUCCESS Always.
**/
EFI_STATUS
UnhookEntry (
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;
OldIntFlagState = WriteInterruptFlag (0);
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
WRITE_IDT (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
WriteInterruptFlag (OldIntFlagState);
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
handlers. It both installs and uninstalls interrupt handlers based on the
value of NewCallback. If NewCallback is NULL, then uninstall is indicated.
If NewCallback is non-NULL, then install is indicated.
Arguments:
NewCallback - If non-NULL, NewCallback specifies the new handler to register.
If NULL, specifies that the previously registered handler should
be uninstalled.
ExceptionType - Indicates which entry to manage
@param NewCallback If non-NULL, NewCallback specifies the new handler to register.
If NULL, specifies that the previously registered handler should
be uninstalled.
@param ExceptionType Indicates which entry to manage.
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.
@retval EFI_SUCCESS Process is ok.
@retval EFI_INVALID_PARAMETER Requested uninstalling a handler from a vector that has
no handler registered for it
@retval EFI_ALREADY_STARTED Requested install to a vector that already has a handler registered.
@retval others Possible return values are passed through from UnHookEntry and HookEntry.
Other possible return values are passed through from UnHookEntry and HookEntry.
--*/
**/
EFI_STATUS
ManageIdtEntryTable (
VOID (*NewCallback)(),
EFI_EXCEPTION_TYPE ExceptionType
)
{
EFI_STATUS Status;
Status = EFI_SUCCESS;
if (CompareDescriptor (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
if (COMPARE_DESCRIPTOR (&IdtEntryTable[ExceptionType].NewDesc, &NullDesc)) {
//
// we've already installed to this vector
//
@ -205,29 +190,38 @@ Returns:
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
EFIAPI
GetMaximumProcessorIndex (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
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;
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
EFIAPI
RegisterPeriodicCallback (
@ -235,29 +229,24 @@ RegisterPeriodicCallback (
IN UINTN ProcessorIndex,
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);
}
/**
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
EFIAPI
RegisterExceptionCallback (
@ -266,33 +255,21 @@ RegisterExceptionCallback (
IN EFI_EXCEPTION_CALLBACK NewCallback,
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);
}
/**
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
EFIAPI
InvalidateInstructionCache (
@ -301,49 +278,27 @@ InvalidateInstructionCache (
IN VOID *Start,
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 ();
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
plInitializeDebugSupportDriver (
PlInitializeDebugSupportDriver (
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;
@ -378,28 +333,21 @@ ErrorCleanup:
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
on the image handle. It uninstalls all registered handlers and frees all entry
stub memory.
This code executes in boot services context.
@param ImageHandle The firmware allocated handle for the EFI image.
Arguments:
ImageHandle - The image handle of the unload handler
@retval EFI_SUCCESS Always.
Returns:
EFI_SUCCESS - always return success
--*/
**/
EFI_STATUS
EFIAPI
PlUnloadDebugSupportDriver (
IN EFI_HANDLE ImageHandle
)
{
EFI_EXCEPTION_TYPE ExceptionType;
@ -411,26 +359,20 @@ Returns:
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
InterruptDistrubutionHub (
EFI_EXCEPTION_TYPE ExceptionType,
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 (ExceptionType != SYSTEM_TIMER_VECTOR) {

View File

@ -1,7 +1,7 @@
/**@file
/** @file
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
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
@ -12,8 +12,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _PLDEBUG_SUPPORT_H
#define _PLDEBUG_SUPPORT_H
#ifndef _PLDEBUG_SUPPORT_H_
#define _PLDEBUG_SUPPORT_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 SYSTEM_TIMER_VECTOR 0x68
#define VECTOR_ENTRY_PAGES 1
#define CopyDescriptor(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
#define ZeroDescriptor(Dest) CopyDescriptor ((Dest), &NullDesc)
#define ReadIdt(Vector, Dest) CopyDescriptor ((Dest), &((GetIdtr ())[(Vector)]))
#define WriteIdt(Vector, Src) CopyDescriptor (&((GetIdtr ())[(Vector)]), (Src))
#define CompareDescriptor(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
#define COPY_DESCRIPTOR(Dest, Src) CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
#define READ_IDT(Vector, Dest) COPY_DESCRIPTOR ((Dest), &((GetIdtr ())[(Vector)]))
#define WRITE_IDT(Vector, Src) COPY_DESCRIPTOR (&((GetIdtr ())[(Vector)]), (Src))
#define COMPARE_DESCRIPTOR(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
#define EFI_ISA IsaX64
#define FF_FXSR (1 << 24)
@ -64,214 +63,149 @@ extern UINT8 InterruptEntryStub[];
extern UINT32 StubSize;
extern VOID (*OrigVector) (VOID);
/**
Generic IDT entry.
**/
VOID
CommonIdtEntry (
VOID
)
/*++
);
Routine Description:
Generic IDT entry
Arguments:
None
Returns:
None
--*/
;
/**
Check whether FXSTOR is supported
@retval TRUE FXSTOR is supported.
@retval FALSE FXSTOR is not supported.
**/
BOOLEAN
FxStorSupport (
VOID
)
/*++
);
Routine Description:
/**
Return the physical address of IDTR.
Check whether FXSTOR is supported
Arguments:
None
Returns:
TRUE - supported
FALSE - not supported
--*/
;
@return The physical address of IDTR.
**/
DESCRIPTOR *
GetIdtr (
VOID
)
/*++
);
Routine Description:
/**
Encodes an IDT descriptor with the given physical address.
Return the physical address of IDTR
Arguments:
None
Returns:
The physical address of IDTR
--*/
;
@param DestDesc The IDT descriptor address.
@param Vecotr The interrupt vector entry.
**/
VOID
Vect2Desc (
DESCRIPTOR * DestDesc,
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
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
plInitializeDebugSupportDriver (
PlInitializeDebugSupportDriver (
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
on the image handle. It uninstalls all registered handlers and frees all entry
stub memory.
This code executes in boot services context.
@param ImageHandle The firmware allocated handle for the EFI image.
Arguments:
ImageHandle - The image handle of the unload handler
@retval EFI_SUCCESS Always.
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
//
// DebugSupport protocol member functions
//
@retval EFI_SUCCESS Always returned with **MaxProcessorIndex set to 0.
**/
EFI_STATUS
EFIAPI
GetMaximumProcessorIndex (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
OUT UINTN *MaxProcessorIndex
)
/*++
);
Routine Description: This is a DebugSupport protocol member function.
/**
DebugSupport protocol member function.
Arguments:
This - The DebugSupport instance
MaxProcessorIndex - The maximuim supported processor index
@param This The DebugSupport instance
@param ProcessorIndex Which processor the callback applies to.
@param PeriodicCallback Callback function
Returns:
Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0
--*/
;
@retval EFI_SUCCESS Indicates the callback was registered.
@retval others Callback was not registered.
**/
EFI_STATUS
EFIAPI
RegisterPeriodicCallback (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
IN UINTN ProcessorIndex,
IN EFI_PERIODIC_CALLBACK PeriodicCallback
)
/*++
);
Routine Description: This is a DebugSupport protocol member function.
/**
DebugSupport protocol member function.
Arguments:
This - The DebugSupport instance
ProcessorIndex - Which processor the callback applies to.
PeriodicCallback - Callback function
This code executes in boot services context.
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
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.
--*/
;
@retval EFI_SUCCESS Indicates the callback was registered.
@retval others Callback was not registered.
**/
EFI_STATUS
EFIAPI
RegisterExceptionCallback (
@ -279,32 +213,19 @@ RegisterExceptionCallback (
IN UINTN ProcessorIndex,
IN EFI_EXCEPTION_CALLBACK NewCallback,
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:
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.
--*/
;
@retval EFI_SUCCESS Always returned.
**/
EFI_STATUS
EFIAPI
InvalidateInstructionCache (
@ -312,24 +233,6 @@ InvalidateInstructionCache (
IN UINTN ProcessorIndex,
IN VOID *Start,
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