]> 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 fd59f09ecd082e21bd563b59cc9aee8bfe39fcc9..f139131a7c7d7b2a14503f53d16937970566b951 100644 (file)
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 \r
-CONST UINTN    mDoFarReturnFlag  = 0;\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
+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
-EXCEPTION_HANDLER_DATA      mExceptionHandlerData;\r
-\r
-UINT8                       mNewStack[CPU_STACK_SWITCH_EXCEPTION_NUMBER *\r
-                                      CPU_KNOWN_GOOD_STACK_SIZE];\r
-UINT8                       mNewGdt[CPU_TSS_GDT_SIZE];\r
+UINT8  mNewStack[CPU_STACK_SWITCH_EXCEPTION_NUMBER *\r
+                 CPU_KNOWN_GOOD_STACK_SIZE];\r
+UINT8  mNewGdt[CPU_TSS_GDT_SIZE];\r
 \r
 /**\r
   Common exception handler.\r
@@ -33,8 +36,8 @@ UINT8                       mNewGdt[CPU_TSS_GDT_SIZE];
 VOID\r
 EFIAPI\r
 CommonExceptionHandler (\r
-  IN EFI_EXCEPTION_TYPE          ExceptionType,\r
-  IN EFI_SYSTEM_CONTEXT          SystemContext\r
+  IN EFI_EXCEPTION_TYPE  ExceptionType,\r
+  IN EFI_SYSTEM_CONTEXT  SystemContext\r
   )\r
 {\r
   CommonExceptionHandlerWorker (ExceptionType, SystemContext, &mExceptionHandlerData);\r
@@ -59,11 +62,9 @@ CommonExceptionHandler (
 EFI_STATUS\r
 EFIAPI\r
 InitializeCpuExceptionHandlers (\r
-  IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL\r
+  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
@@ -87,38 +88,23 @@ InitializeCpuExceptionHandlers (
 EFI_STATUS\r
 EFIAPI\r
 InitializeCpuInterruptHandlers (\r
-  IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL\r
+  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS                         Status;\r
-  IA32_IDT_GATE_DESCRIPTOR           *IdtTable;\r
-  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
+  EFI_STATUS                      Status;\r
+  IA32_IDT_GATE_DESCRIPTOR        *IdtTable;\r
+  IA32_DESCRIPTOR                 IdtDescriptor;\r
+  UINTN                           IdtEntryCount;\r
+  EXCEPTION_HANDLER_TEMPLATE_MAP  TemplateMap;\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
@@ -127,6 +113,7 @@ InitializeCpuInterruptHandlers (
   if (IdtEntryCount > CPU_INTERRUPT_NUM) {\r
     IdtEntryCount = CPU_INTERRUPT_NUM;\r
   }\r
+\r
   //\r
   // Create Interrupt Descriptor Table and Copy the old IDT table in\r
   //\r
@@ -137,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
@@ -166,9 +132,9 @@ InitializeCpuInterruptHandlers (
   //\r
   // Load Interrupt Descriptor Table\r
   //\r
-  IdtDescriptor.Base  = (UINTN) IdtTable;\r
-  IdtDescriptor.Limit = (UINT16) (sizeof (IA32_IDT_GATE_DESCRIPTOR) * CPU_INTERRUPT_NUM - 1);\r
-  AsmWriteIdtr ((IA32_DESCRIPTOR *) &IdtDescriptor);\r
+  IdtDescriptor.Base  = (UINTN)IdtTable;\r
+  IdtDescriptor.Limit = (UINT16)(sizeof (IA32_IDT_GATE_DESCRIPTOR) * CPU_INTERRUPT_NUM - 1);\r
+  AsmWriteIdtr ((IA32_DESCRIPTOR *)&IdtDescriptor);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -199,8 +165,8 @@ InitializeCpuInterruptHandlers (
 EFI_STATUS\r
 EFIAPI\r
 RegisterCpuInterruptHandler (\r
-  IN EFI_EXCEPTION_TYPE            InterruptType,\r
-  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler\r
+  IN EFI_EXCEPTION_TYPE         InterruptType,\r
+  IN EFI_CPU_INTERRUPT_HANDLER  InterruptHandler\r
   )\r
 {\r
   return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler, &mExceptionHandlerData);\r
@@ -230,14 +196,14 @@ RegisterCpuInterruptHandler (
 EFI_STATUS\r
 EFIAPI\r
 InitializeCpuExceptionHandlersEx (\r
-  IN EFI_VECTOR_HANDOFF_INFO            *VectorInfo OPTIONAL,\r
-  IN CPU_EXCEPTION_INIT_DATA            *InitData OPTIONAL\r
+  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL,\r
+  IN CPU_EXCEPTION_INIT_DATA  *InitData OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS                        Status;\r
-  CPU_EXCEPTION_INIT_DATA           EssData;\r
-  IA32_DESCRIPTOR                   Idtr;\r
-  IA32_DESCRIPTOR                   Gdtr;\r
+  EFI_STATUS               Status;\r
+  CPU_EXCEPTION_INIT_DATA  EssData;\r
+  IA32_DESCRIPTOR          Idtr;\r
+  IA32_DESCRIPTOR          Gdtr;\r
 \r
   //\r
   // To avoid repeat initialization of default handlers, the caller should pass\r
@@ -246,7 +212,7 @@ InitializeCpuExceptionHandlersEx (
   // version instead; or this method must be implemented as a simple wrapper of\r
   // non-ex version of it, if this version has to be called.\r
   //\r
-  if (InitData == NULL || InitData->X64.InitDefaultHandlers) {\r
+  if ((InitData == NULL) || InitData->X64.InitDefaultHandlers) {\r
     Status = InitializeCpuExceptionHandlers (VectorInfo);\r
   } else {\r
     Status = EFI_SUCCESS;\r
@@ -263,25 +229,26 @@ InitializeCpuExceptionHandlersEx (
         AsmReadIdtr (&Idtr);\r
         AsmReadGdtr (&Gdtr);\r
 \r
-        EssData.X64.Revision = CPU_EXCEPTION_INIT_DATA_REV;\r
-        EssData.X64.KnownGoodStackTop = (UINTN)mNewStack + sizeof (mNewStack);\r
-        EssData.X64.KnownGoodStackSize = CPU_KNOWN_GOOD_STACK_SIZE;\r
-        EssData.X64.StackSwitchExceptions = CPU_STACK_SWITCH_EXCEPTION_LIST;\r
+        EssData.X64.Revision                   = CPU_EXCEPTION_INIT_DATA_REV;\r
+        EssData.X64.KnownGoodStackTop          = (UINTN)mNewStack + sizeof (mNewStack);\r
+        EssData.X64.KnownGoodStackSize         = CPU_KNOWN_GOOD_STACK_SIZE;\r
+        EssData.X64.StackSwitchExceptions      = CPU_STACK_SWITCH_EXCEPTION_LIST;\r
         EssData.X64.StackSwitchExceptionNumber = CPU_STACK_SWITCH_EXCEPTION_NUMBER;\r
-        EssData.X64.IdtTable = (VOID *)Idtr.Base;\r
-        EssData.X64.IdtTableSize = Idtr.Limit + 1;\r
-        EssData.X64.GdtTable = mNewGdt;\r
-        EssData.X64.GdtTableSize = sizeof (mNewGdt);\r
-        EssData.X64.ExceptionTssDesc = mNewGdt + Gdtr.Limit + 1;\r
-        EssData.X64.ExceptionTssDescSize = CPU_TSS_DESC_SIZE;\r
-        EssData.X64.ExceptionTss = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE;\r
-        EssData.X64.ExceptionTssSize = CPU_TSS_SIZE;\r
+        EssData.X64.IdtTable                   = (VOID *)Idtr.Base;\r
+        EssData.X64.IdtTableSize               = Idtr.Limit + 1;\r
+        EssData.X64.GdtTable                   = mNewGdt;\r
+        EssData.X64.GdtTableSize               = sizeof (mNewGdt);\r
+        EssData.X64.ExceptionTssDesc           = mNewGdt + Gdtr.Limit + 1;\r
+        EssData.X64.ExceptionTssDescSize       = CPU_TSS_DESC_SIZE;\r
+        EssData.X64.ExceptionTss               = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE;\r
+        EssData.X64.ExceptionTssSize           = CPU_TSS_SIZE;\r
 \r
         InitData = &EssData;\r
       }\r
+\r
       Status = ArchSetupExceptionStack (InitData);\r
     }\r
   }\r
 \r
-  return  Status;\r
+  return Status;\r
 }\r