- 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