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 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 (

View File

@ -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.

View File

@ -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 (

View File

@ -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 (

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 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

View File

@ -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;

View File

@ -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) {

View File

@ -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

View File

@ -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;
} }

View File

@ -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

View File

@ -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) {

View File

@ -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