]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/ExceptionLib: Update UpdateIdtTable()
authorJeff Fan <jeff.fan@intel.com>
Tue, 24 May 2016 13:09:22 +0000 (21:09 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 1 Jun 2016 07:31:44 +0000 (15:31 +0800)
Add parameter CpuExceptionData for UpdateIdtTable().

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

index 812469babe7ce95d1c0a26cd6788f04abdd5412e..99be61f860b4931357787dc28d2c4bbfcacfef8e 100644 (file)
@@ -174,16 +174,17 @@ RegisterCpuInterruptHandlerWorker (
 /**\r
   Internal worker function to update IDT entries accordling to vector attributes.\r
 \r
-  @param[in] IdtTable       Pointer to IDT table.\r
-  @param[in] TemplateMap    Pointer to a buffer where the address map is returned.\r
-  @param[in] IdtEntryCount  IDT entries number to be updated.\r
+  @param[in] IdtTable              Pointer to IDT table.\r
+  @param[in] TemplateMap           Pointer to a buffer where the address map is\r
+                                   returned.\r
+  @param[in] ExceptionHandlerData  Pointer to exception handler data.\r
 \r
 **/\r
 VOID\r
 UpdateIdtTable (\r
   IN IA32_IDT_GATE_DESCRIPTOR        *IdtTable,\r
   IN EXCEPTION_HANDLER_TEMPLATE_MAP  *TemplateMap,\r
-  IN UINTN                           IdtEntryCount\r
+  IN EXCEPTION_HANDLER_DATA          *ExceptionHandlerData\r
   );\r
 \r
 /**\r
index 92de04ce08d879c9311cf3c54dca6cb6660a3285..cffb13aea98423d9b080c0a8955b39fd0fc2ea06 100644 (file)
@@ -83,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
@@ -130,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
index 0b12b6d84fedff2f01c8697e06e5765c2726e7d3..4a3aad896d2464f833f1a8a492759e17bb501223 100644 (file)
@@ -127,47 +127,50 @@ CommonExceptionHandler (
 /**\r
   Internal worker function to update IDT entries accordling to vector attributes.\r
 \r
-  @param[in] IdtTable       Pointer to IDT table.\r
-  @param[in] TemplateMap    Pointer to a buffer where the address map is returned.\r
-  @param[in] IdtEntryCount  IDT entries number to be updated.\r
+  @param[in] IdtTable              Pointer to IDT table.\r
+  @param[in] TemplateMap           Pointer to a buffer where the address map is\r
+                                   returned.\r
+  @param[in] ExceptionHandlerData  Pointer to exception handler data.\r
 \r
 **/\r
 VOID\r
 UpdateIdtTable (\r
   IN IA32_IDT_GATE_DESCRIPTOR        *IdtTable,\r
   IN EXCEPTION_HANDLER_TEMPLATE_MAP  *TemplateMap,\r
-  IN UINTN                           IdtEntryCount\r
+  IN EXCEPTION_HANDLER_DATA          *ExceptionHandlerData\r
   )\r
 {\r
   UINT16                             CodeSegment;\r
   UINTN                              Index;\r
   UINTN                              InterruptHandler;\r
+  RESERVED_VECTORS_DATA              *ReservedVectors;\r
 \r
+  ReservedVectors = ExceptionHandlerData->ReservedVectors;\r
   //\r
   // Use current CS as the segment selector of interrupt gate in IDT\r
   //\r
   CodeSegment = AsmReadCs ();\r
 \r
-  for (Index = 0; Index < IdtEntryCount; Index ++) {\r
+  for (Index = 0; Index < ExceptionHandlerData->IdtEntryCount; Index ++) {\r
     IdtTable[Index].Bits.Selector = CodeSegment;\r
     //\r
     // Check reserved vectors attributes\r
     //\r
-    switch (mReservedVectors[Index].Attribute) {\r
+    switch (ReservedVectors[Index].Attribute) {\r
     case EFI_VECTOR_HANDOFF_DO_NOT_HOOK:\r
       //\r
       // Keep original IDT entry\r
       //\r
       continue;\r
     case EFI_VECTOR_HANDOFF_HOOK_AFTER:\r
-      InitializeSpinLock (&mReservedVectors[Index].SpinLock);\r
+      InitializeSpinLock (&ReservedVectors[Index].SpinLock);\r
       CopyMem (\r
-        (VOID *) mReservedVectors[Index].HookAfterStubHeaderCode,\r
+        (VOID *) ReservedVectors[Index].HookAfterStubHeaderCode,\r
         (VOID *) TemplateMap->HookAfterStubHeaderStart,\r
         TemplateMap->ExceptionStubHeaderSize\r
         );\r
       AsmVectorNumFixup (\r
-        (VOID *) mReservedVectors[Index].HookAfterStubHeaderCode,\r
+        (VOID *) ReservedVectors[Index].HookAfterStubHeaderCode,\r
         (UINT8) Index,\r
         (VOID *) TemplateMap->HookAfterStubHeaderStart\r
         );\r
@@ -178,7 +181,7 @@ UpdateIdtTable (
       //\r
       // Save original IDT handler address\r
       //\r
-      mReservedVectors[Index].ExceptonHandler = ArchGetIdtHandler (&IdtTable[Index]);\r
+      ReservedVectors[Index].ExceptonHandler = ArchGetIdtHandler (&IdtTable[Index]);\r
       //\r
       // Go on the following code\r
       //\r
@@ -195,7 +198,7 @@ UpdateIdtTable (
   //\r
   // Save Interrupt number to global variable used for RegisterCpuInterruptHandler ()\r
   //\r
-  mEnabledInterruptNum = IdtEntryCount;\r
+  mEnabledInterruptNum = ExceptionHandlerData->IdtEntryCount;\r
 }\r
 \r
 /**\r
@@ -249,7 +252,9 @@ InitializeCpuExceptionHandlersWorker (
   IdtTable = (IA32_IDT_GATE_DESCRIPTOR *) IdtDescriptor.Base;\r
   AsmGetTemplateAddressMap (&TemplateMap);\r
   ASSERT (TemplateMap.ExceptionStubHeaderSize <= HOOKAFTER_STUB_SIZE);\r
-  UpdateIdtTable (IdtTable, &TemplateMap, IdtEntryCount);\r
+\r
+  ExceptionHandlerData->IdtEntryCount = IdtEntryCount;\r
+  UpdateIdtTable (IdtTable, &TemplateMap, ExceptionHandlerData);\r
   mEnabledInterruptNum = IdtEntryCount;\r
   return EFI_SUCCESS;\r
 }\r