]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
UefiCpuPkg/MpInitLib: Move save/restore interrupt to SwitchBSPWorker()
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / DxeException.c
index c38f0e10ddb3d9f102918d93bf877c0183dfb85f..a61a52b19ab0ce526122190314a4aca304148b58 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   CPU exception handler library implemenation for DXE modules.\r
 \r
-  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
 \r
 CONST UINTN    mDoFarReturnFlag  = 0;\r
 \r
-extern SPIN_LOCK                   mDisplayMessageSpinLock;\r
-extern EFI_CPU_INTERRUPT_HANDLER   *mExternalInterruptHandler;\r
+//\r
+// Image align size for DXE/SMM\r
+//\r
+CONST UINTN      mImageAlignSize = SIZE_4KB;\r
+\r
+RESERVED_VECTORS_DATA       mReservedVectorsData[CPU_EXCEPTION_NUM];\r
+EFI_CPU_INTERRUPT_HANDLER   mExternalInterruptHandlerTable[CPU_EXCEPTION_NUM];\r
+UINTN                       mEnabledInterruptNum = 0;\r
+\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
@@ -44,7 +68,10 @@ InitializeCpuExceptionHandlers (
   IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL\r
   )\r
 {\r
-  return InitializeCpuExceptionHandlersWorker (VectorInfo);\r
+  mExceptionHandlerData.ReservedVectors          = mReservedVectorsData;\r
+  mExceptionHandlerData.ExternalInterruptHandler = mExternalInterruptHandlerTable;\r
+  InitializeSpinLock (&mExceptionHandlerData.DisplayMessageSpinLock);\r
+  return InitializeCpuExceptionHandlersWorker (VectorInfo, &mExceptionHandlerData);\r
 }\r
 \r
 /**\r
@@ -77,20 +104,22 @@ InitializeCpuInterruptHandlers (
   UINTN                              Index;\r
   UINTN                              InterruptEntry;\r
   UINT8                              *InterruptEntryCode;\r
+  RESERVED_VECTORS_DATA              *ReservedVectors;\r
+  EFI_CPU_INTERRUPT_HANDLER          *ExternalInterruptHandler;\r
 \r
-  mReservedVectors = AllocatePool (sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM);\r
-  ASSERT (mReservedVectors != NULL);\r
-  SetMem ((VOID *) mReservedVectors, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
+  ReservedVectors = AllocatePool (sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM);\r
+  ASSERT (ReservedVectors != NULL);\r
+  SetMem ((VOID *) ReservedVectors, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
   if (VectorInfo != NULL) {\r
-    Status = ReadAndVerifyVectorInfo (VectorInfo, mReservedVectors, CPU_INTERRUPT_NUM);\r
+    Status = ReadAndVerifyVectorInfo (VectorInfo, ReservedVectors, CPU_INTERRUPT_NUM);\r
     if (EFI_ERROR (Status)) {\r
-      FreePool (mReservedVectors);\r
+      FreePool (ReservedVectors);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
-  InitializeSpinLock (&mDisplayMessageSpinLock);\r
-  mExternalInterruptHandler = AllocateZeroPool (sizeof (EFI_CPU_INTERRUPT_HANDLER) * CPU_INTERRUPT_NUM);\r
-  ASSERT (mExternalInterruptHandler != NULL);\r
+\r
+  ExternalInterruptHandler = AllocateZeroPool (sizeof (EFI_CPU_INTERRUPT_HANDLER) * CPU_INTERRUPT_NUM);\r
+  ASSERT (ExternalInterruptHandler != NULL);\r
 \r
   //\r
   // Read IDT descriptor and calculate IDT size\r
@@ -119,12 +148,17 @@ InitializeCpuInterruptHandlers (
       (VOID *) TemplateMap.ExceptionStart,\r
       TemplateMap.ExceptionStubHeaderSize\r
       );\r
-    AsmVectorNumFixup ((VOID *) InterruptEntry, (UINT8) Index);\r
+    AsmVectorNumFixup ((VOID *) InterruptEntry,  (UINT8) Index, (VOID *) TemplateMap.ExceptionStart);\r
     InterruptEntry += TemplateMap.ExceptionStubHeaderSize;\r
   }\r
 \r
   TemplateMap.ExceptionStart = (UINTN) InterruptEntryCode;\r
-  UpdateIdtTable (IdtTable, &TemplateMap, CPU_INTERRUPT_NUM);\r
+  mExceptionHandlerData.IdtEntryCount            = CPU_INTERRUPT_NUM;\r
+  mExceptionHandlerData.ReservedVectors          = ReservedVectors;\r
+  mExceptionHandlerData.ExternalInterruptHandler = ExternalInterruptHandler;\r
+  InitializeSpinLock (&mExceptionHandlerData.DisplayMessageSpinLock);\r
+\r
+  UpdateIdtTable (IdtTable, &TemplateMap, &mExceptionHandlerData);\r
 \r
   //\r
   // Load Interrupt Descriptor Table\r
@@ -166,5 +200,5 @@ RegisterCpuInterruptHandler (
   IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler\r
   )\r
 {\r
-  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler);\r
+  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler, &mExceptionHandlerData);\r
 }\r