]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2Pkg/FspSecCore/SecMain.c
IntelFsp2Pkg: FSP should not override IDT
[mirror_edk2.git] / IntelFsp2Pkg / FspSecCore / SecMain.c
index 37fd4dfdeb0d311608452d99f66f315840921c8c..ddbfc4fcdf0b5a14abf47a3546f9977785ec0410 100644 (file)
@@ -70,6 +70,7 @@ SecStartup (
   UINT32                      Index;\r
   FSP_GLOBAL_DATA             PeiFspData;\r
   UINT64                      ExceptionHandler;\r
+  UINTN                       IdtSize;\r
 \r
   //\r
   // Process all libraries constructor function linked to SecCore.\r
@@ -98,13 +99,26 @@ SecStartup (
   // |                   |\r
   // |-------------------|---->  TempRamBase\r
   IdtTableInStack.PeiService  = NULL;\r
-  ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate);\r
-  for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {\r
-    CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64));\r
+  AsmReadIdtr (&IdtDescriptor);\r
+  if ((IdtDescriptor.Base == 0) && (IdtDescriptor.Limit == 0xFFFF)) {\r
+    ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate);\r
+    for (Index = 0; Index < FixedPcdGet8(PcdFspMaxInterruptSupported); Index ++) {\r
+      CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64));\r
+    }\r
+    IdtSize = sizeof (IdtTableInStack.IdtTable);\r
+  } else {\r
+    if (IdtDescriptor.Limit + 1 > sizeof (IdtTableInStack.IdtTable)) {\r
+      //\r
+      // ERROR: IDT table size from boot loader is larger than FSP can support, DeadLoop here!\r
+      //\r
+      CpuDeadLoop();\r
+    } else {\r
+      IdtSize = IdtDescriptor.Limit + 1;\r
+    }\r
+    CopyMem ((VOID *) (UINTN) &IdtTableInStack.IdtTable, (VOID *) IdtDescriptor.Base, IdtSize);\r
   }\r
-\r
   IdtDescriptor.Base  = (UINTN) &IdtTableInStack.IdtTable;\r
-  IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);\r
+  IdtDescriptor.Limit = (UINT16)(IdtSize - 1);\r
 \r
   AsmWriteIdtr (&IdtDescriptor);\r
 \r