]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
UefiCpuPkg/ExceptionLib: Update RegisterCpuInterruptHandlerWorker()
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / DxeException.c
index 6739a2cc3cfb559e63a9482e2443534156572f1f..5c4ee2a1ed558a5e7e835b672a0d32ce51f52dcd 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
@@ -21,6 +21,9 @@ CONST UINTN    mDoFarReturnFlag  = 0;
 \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
   Initializes all CPU exceptions entries and provides the default exception handlers.\r
@@ -44,7 +47,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 +83,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
+  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
@@ -124,7 +132,12 @@ InitializeCpuInterruptHandlers (
   }\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 +179,5 @@ RegisterCpuInterruptHandler (
   IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler\r
   )\r
 {\r
-  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler);\r
+  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler, &mExceptionHandlerData);\r
 }\r