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
// | |\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