\r
CONST UINTN mDoFarReturnFlag = 0;\r
\r
-extern SPIN_LOCK mDisplayMessageSpinLock;\r
extern EFI_CPU_INTERRUPT_HANDLER *mExternalInterruptHandler;\r
extern RESERVED_VECTORS_DATA mReservedVectorsData[CPU_EXCEPTION_NUM];\r
extern EFI_CPU_INTERRUPT_HANDLER mExternalInterruptHandlerTable[CPU_EXCEPTION_NUM];\r
EXCEPTION_HANDLER_DATA mExceptionHandlerData;\r
\r
+/**\r
+ Common exception handler.\r
+\r
+ @param ExceptionType Exception type.\r
+ @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
+**/\r
+VOID\r
+EFIAPI\r
+CommonExceptionHandler (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType, \r
+ IN EFI_SYSTEM_CONTEXT SystemContext\r
+ )\r
+{\r
+ CommonExceptionHandlerWorker (ExceptionType, SystemContext, &mExceptionHandlerData);\r
+}\r
+\r
/**\r
Initializes all CPU exceptions entries and provides the default exception handlers.\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
- InitializeSpinLock (&mDisplayMessageSpinLock);\r
+\r
ExternalInterruptHandler = AllocateZeroPool (sizeof (EFI_CPU_INTERRUPT_HANDLER) * CPU_INTERRUPT_NUM);\r
ASSERT (ExternalInterruptHandler != NULL);\r
\r
#include "CpuExceptionCommon.h"\r
#include <Library/DebugLib.h>\r
\r
-//\r
-// Spinlock for CPU information display\r
-//\r
-SPIN_LOCK mDisplayMessageSpinLock;\r
\r
//\r
// Image align size for DXE/SMM\r
UINTN mEnabledInterruptNum = 0;\r
\r
/**\r
- Common exception handler.\r
+ Internal worker function for common exception handler.\r
\r
- @param ExceptionType Exception type.\r
- @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
+ @param ExceptionType Exception type.\r
+ @param SystemContext Pointer to EFI_SYSTEM_CONTEXT.\r
+ @param ExceptionHandlerData Pointer to exception handler data.\r
**/\r
VOID\r
-EFIAPI\r
-CommonExceptionHandler (\r
+CommonExceptionHandlerWorker (\r
IN EFI_EXCEPTION_TYPE ExceptionType, \r
- IN EFI_SYSTEM_CONTEXT SystemContext\r
+ IN EFI_SYSTEM_CONTEXT SystemContext,\r
+ IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData\r
)\r
{\r
EXCEPTION_HANDLER_CONTEXT *ExceptionHandlerContext;\r
+ RESERVED_VECTORS_DATA *ReservedVectors;\r
+ EFI_CPU_INTERRUPT_HANDLER *ExternalInterruptHandler;\r
\r
- ExceptionHandlerContext = (EXCEPTION_HANDLER_CONTEXT *) (UINTN) (SystemContext.SystemContextIa32);\r
+ ExceptionHandlerContext = (EXCEPTION_HANDLER_CONTEXT *) (UINTN) (SystemContext.SystemContextIa32);\r
+ ReservedVectors = ExceptionHandlerData->ReservedVectors;\r
+ ExternalInterruptHandler = ExceptionHandlerData->ExternalInterruptHandler;\r
\r
- switch (mReservedVectors[ExceptionType].Attribute) {\r
+ switch (ReservedVectors[ExceptionType].Attribute) {\r
case EFI_VECTOR_HANDOFF_HOOK_BEFORE:\r
//\r
// Need to jmp to old IDT handler after this exception handler\r
//\r
ExceptionHandlerContext->ExceptionDataFlag = (mErrorCodeFlag & (1 << ExceptionType)) ? TRUE : FALSE;\r
- ExceptionHandlerContext->OldIdtHandler = mReservedVectors[ExceptionType].ExceptonHandler;\r
+ ExceptionHandlerContext->OldIdtHandler = ReservedVectors[ExceptionType].ExceptonHandler;\r
break;\r
case EFI_VECTOR_HANDOFF_HOOK_AFTER:\r
while (TRUE) {\r
//\r
// If if anyone has gotten SPIN_LOCK for owner running hook after\r
//\r
- if (AcquireSpinLockOrFail (&mReservedVectors[ExceptionType].SpinLock)) {\r
+ if (AcquireSpinLockOrFail (&ReservedVectors[ExceptionType].SpinLock)) {\r
//\r
// Need to execute old IDT handler before running this exception handler\r
//\r
- mReservedVectors[ExceptionType].ApicId = GetApicId ();\r
+ ReservedVectors[ExceptionType].ApicId = GetApicId ();\r
ArchSaveExceptionContext (ExceptionType, SystemContext);\r
ExceptionHandlerContext->ExceptionDataFlag = (mErrorCodeFlag & (1 << ExceptionType)) ? TRUE : FALSE;\r
- ExceptionHandlerContext->OldIdtHandler = mReservedVectors[ExceptionType].ExceptonHandler;\r
+ ExceptionHandlerContext->OldIdtHandler = ReservedVectors[ExceptionType].ExceptonHandler;\r
return;\r
}\r
//\r
// If failed to acquire SPIN_LOCK, check if it was locked by processor itself\r
//\r
- if (mReservedVectors[ExceptionType].ApicId == GetApicId ()) {\r
+ if (ReservedVectors[ExceptionType].ApicId == GetApicId ()) {\r
//\r
// Old IDT handler has been executed, then retore CPU exception content to\r
// run new exception handler.\r
//\r
// Rlease spin lock for ApicId\r
//\r
- ReleaseSpinLock (&mReservedVectors[ExceptionType].SpinLock);\r
+ ReleaseSpinLock (&ReservedVectors[ExceptionType].SpinLock);\r
break;\r
}\r
CpuPause ();\r
break;\r
}\r
\r
- if (mExternalInterruptHandler[ExceptionType] != NULL) {\r
- (mExternalInterruptHandler[ExceptionType]) (ExceptionType, SystemContext);\r
+ if (ExternalInterruptHandler != NULL &&\r
+ ExternalInterruptHandler[ExceptionType] != NULL) {\r
+ (ExternalInterruptHandler[ExceptionType]) (ExceptionType, SystemContext);\r
} else if (ExceptionType < CPU_EXCEPTION_NUM) {\r
//\r
// Get Spinlock to display CPU information\r
//\r
- while (!AcquireSpinLockOrFail (&mDisplayMessageSpinLock)) {\r
+ while (!AcquireSpinLockOrFail (&ExceptionHandlerData->DisplayMessageSpinLock)) {\r
CpuPause ();\r
}\r
//\r
//\r
// Release Spinlock of output message\r
//\r
- ReleaseSpinLock (&mDisplayMessageSpinLock);\r
+ ReleaseSpinLock (&ExceptionHandlerData->DisplayMessageSpinLock);\r
//\r
// Enter a dead loop if needn't to execute old IDT handler further\r
//\r
- if (mReservedVectors[ExceptionType].Attribute != EFI_VECTOR_HANDOFF_HOOK_BEFORE) {\r
+ if (ReservedVectors[ExceptionType].Attribute != EFI_VECTOR_HANDOFF_HOOK_BEFORE) {\r
CpuDeadLoop ();\r
}\r
}\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
- InitializeSpinLock (&mDisplayMessageSpinLock);\r
\r
mExternalInterruptHandler = mExternalInterruptHandlerTable;\r
//\r