]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/ExceptionLib: Add CommonExceptionHandlerWorker()
authorJeff Fan <jeff.fan@intel.com>
Tue, 24 May 2016 13:31:11 +0000 (21:31 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 1 Jun 2016 07:31:53 +0000 (15:31 +0800)
Add internal worker function RegisterCpuInterruptHandlerWorker().

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c

index f2c44f013f5509d54d38c2cf56ea875eb39aff5e..bbf8004882fd4e3bad2c6b24262ba154884740cf 100644 (file)
@@ -261,5 +261,19 @@ GetExceptionNameStr (
   IN EFI_EXCEPTION_TYPE          ExceptionType\r
   );\r
 \r
   IN EFI_EXCEPTION_TYPE          ExceptionType\r
   );\r
 \r
+/**\r
+  Internal worker function for common exception handler.\r
+\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
+CommonExceptionHandlerWorker (\r
+  IN EFI_EXCEPTION_TYPE          ExceptionType, \r
+  IN EFI_SYSTEM_CONTEXT          SystemContext,\r
+  IN EXCEPTION_HANDLER_DATA      *ExceptionHandlerData\r
+  );\r
+\r
 #endif\r
 \r
 #endif\r
 \r
index 5c4ee2a1ed558a5e7e835b672a0d32ce51f52dcd..3320066564c35e48df5c10e8b0bc3d14133b2a6f 100644 (file)
 \r
 CONST UINTN    mDoFarReturnFlag  = 0;\r
 \r
 \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
 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
 /**\r
   Initializes all CPU exceptions entries and provides the default exception handlers.\r
   \r
@@ -96,7 +111,7 @@ InitializeCpuInterruptHandlers (
       return EFI_INVALID_PARAMETER;\r
     }\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
   ExternalInterruptHandler = AllocateZeroPool (sizeof (EFI_CPU_INTERRUPT_HANDLER) * CPU_INTERRUPT_NUM);\r
   ASSERT (ExternalInterruptHandler != NULL);\r
 \r
index c7382804134ff7d5c76751616968c569b93e323c..d4bc293db073121eb18019d68864088cd9724202 100644 (file)
@@ -15,10 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "CpuExceptionCommon.h"\r
 #include <Library/DebugLib.h>\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
 \r
 //\r
 // Image align size for DXE/SMM\r
@@ -31,49 +27,54 @@ EFI_CPU_INTERRUPT_HANDLER   *mExternalInterruptHandler = NULL;
 UINTN                       mEnabledInterruptNum = 0;\r
 \r
 /**\r
 UINTN                       mEnabledInterruptNum = 0;\r
 \r
 /**\r
-  Common exception handler.\r
+  Internal worker function for common exception handler.\r
 \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
 **/\r
 VOID\r
-EFIAPI\r
-CommonExceptionHandler (\r
+CommonExceptionHandlerWorker (\r
   IN EFI_EXCEPTION_TYPE          ExceptionType, \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
   )\r
 {\r
   EXCEPTION_HANDLER_CONTEXT      *ExceptionHandlerContext;\r
+  RESERVED_VECTORS_DATA          *ReservedVectors;\r
+  EFI_CPU_INTERRUPT_HANDLER      *ExternalInterruptHandler;\r
 \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
 \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
   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
     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
         //\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
         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
         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
         // Old IDT handler has been executed, then retore CPU exception content to\r
         // run new exception handler.\r
@@ -82,7 +83,7 @@ CommonExceptionHandler (
         //\r
         // Rlease spin lock for ApicId\r
         //\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
       CpuPause ();\r
@@ -98,13 +99,14 @@ CommonExceptionHandler (
     break;\r
   }\r
   \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
   } 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
       CpuPause ();\r
     }\r
     //\r
@@ -114,11 +116,11 @@ CommonExceptionHandler (
     //\r
     // Release Spinlock of output message\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
     //\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
       CpuDeadLoop ();\r
     }\r
   }\r
@@ -234,7 +236,6 @@ InitializeCpuExceptionHandlersWorker (
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
-  InitializeSpinLock (&mDisplayMessageSpinLock);\r
 \r
   mExternalInterruptHandler = mExternalInterruptHandlerTable;\r
   //\r
 \r
   mExternalInterruptHandler = mExternalInterruptHandlerTable;\r
   //\r
index c3af4d48db05c3ab2616bd5b477edf6f226a1e9a..3528c8cc7518829b0bc3a829a529a0b2edba01cd 100644 (file)
@@ -20,6 +20,22 @@ CONST UINTN   mDoFarReturnFlag   = 1;
 extern RESERVED_VECTORS_DATA       mReservedVectorsData[CPU_EXCEPTION_NUM];\r
 extern EFI_CPU_INTERRUPT_HANDLER   mExternalInterruptHandlerTable[CPU_EXCEPTION_NUM];\r
 EXCEPTION_HANDLER_DATA      mExceptionHandlerData;\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
+  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
 /**\r
   Initializes all CPU exceptions entries and provides the default exception handlers.\r
   \r