]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
CpuException: Avoid allocating page but using global variables
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / DxeException.c
index 61f11e98f8dc6ecdd9561b8d506c72da28a30958..f139131a7c7d7b2a14503f53d16937970566b951 100644 (file)
 \r
 CONST UINTN  mDoFarReturnFlag = 0;\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
+RESERVED_VECTORS_DATA      mReservedVectorsData[CPU_INTERRUPT_NUM];\r
+EFI_CPU_INTERRUPT_HANDLER  mExternalInterruptHandlerTable[CPU_INTERRUPT_NUM];\r
+EXCEPTION_HANDLER_DATA     mExceptionHandlerData = {\r
+  0,   // To be fixed\r
+  0,   // To be fixed\r
+  mReservedVectorsData,\r
+  mExternalInterruptHandlerTable\r
+};\r
 \r
 UINT8  mNewStack[CPU_STACK_SWITCH_EXCEPTION_NUMBER *\r
                  CPU_KNOWN_GOOD_STACK_SIZE];\r
@@ -62,8 +65,6 @@ InitializeCpuExceptionHandlers (
   IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL\r
   )\r
 {\r
-  mExceptionHandlerData.ReservedVectors          = mReservedVectorsData;\r
-  mExceptionHandlerData.ExternalInterruptHandler = mExternalInterruptHandlerTable;\r
   InitializeSpinLock (&mExceptionHandlerData.DisplayMessageSpinLock);\r
   return InitializeCpuExceptionHandlersWorker (VectorInfo, &mExceptionHandlerData);\r
 }\r
@@ -95,30 +96,15 @@ InitializeCpuInterruptHandlers (
   IA32_DESCRIPTOR                 IdtDescriptor;\r
   UINTN                           IdtEntryCount;\r
   EXCEPTION_HANDLER_TEMPLATE_MAP  TemplateMap;\r
-  UINTN                           Index;\r
-  UINTN                           InterruptEntry;\r
-  UINT8                           *InterruptEntryCode;\r
-  RESERVED_VECTORS_DATA           *ReservedVectors;\r
-  EFI_CPU_INTERRUPT_HANDLER       *ExternalInterruptHandler;\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesCode,\r
-                  sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM,\r
-                  (VOID **)&ReservedVectors\r
-                  );\r
-  ASSERT (!EFI_ERROR (Status) && ReservedVectors != NULL);\r
-  SetMem ((VOID *)ReservedVectors, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
+\r
+  SetMem ((VOID *)mReservedVectorsData, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
   if (VectorInfo != NULL) {\r
-    Status = ReadAndVerifyVectorInfo (VectorInfo, ReservedVectors, CPU_INTERRUPT_NUM);\r
+    Status = ReadAndVerifyVectorInfo (VectorInfo, mReservedVectorsData, CPU_INTERRUPT_NUM);\r
     if (EFI_ERROR (Status)) {\r
-      FreePool (ReservedVectors);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\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
   //\r
@@ -138,28 +124,7 @@ InitializeCpuInterruptHandlers (
   AsmGetTemplateAddressMap (&TemplateMap);\r
   ASSERT (TemplateMap.ExceptionStubHeaderSize <= HOOKAFTER_STUB_SIZE);\r
 \r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesCode,\r
-                  TemplateMap.ExceptionStubHeaderSize * CPU_INTERRUPT_NUM,\r
-                  (VOID **)&InterruptEntryCode\r
-                  );\r
-  ASSERT (!EFI_ERROR (Status) && InterruptEntryCode != NULL);\r
-\r
-  InterruptEntry = (UINTN)InterruptEntryCode;\r
-  for (Index = 0; Index < CPU_INTERRUPT_NUM; Index++) {\r
-    CopyMem (\r
-      (VOID *)InterruptEntry,\r
-      (VOID *)TemplateMap.ExceptionStart,\r
-      TemplateMap.ExceptionStubHeaderSize\r
-      );\r
-    AsmVectorNumFixup ((VOID *)InterruptEntry, (UINT8)Index, (VOID *)TemplateMap.ExceptionStart);\r
-    InterruptEntry += TemplateMap.ExceptionStubHeaderSize;\r
-  }\r
-\r
-  TemplateMap.ExceptionStart                     = (UINTN)InterruptEntryCode;\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