REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1265
FSP should not override IDT table when it is initialized by boot loader. IDT should be re-initialized in FSP only when it is invalid. Test: Verified on internal platform and boots successfully. Cc: Jiewen Yao <jiewen....@intel.com> Cc: Desimone Nathaniel L <nathaniel.l.desim...@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Chasel Chiu <chasel.c...@intel.com> --- IntelFsp2Pkg/FspSecCore/SecMain.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.c b/IntelFsp2Pkg/FspSecCore/SecMain.c index 37fd4dfdeb..5912221204 100644 --- a/IntelFsp2Pkg/FspSecCore/SecMain.c +++ b/IntelFsp2Pkg/FspSecCore/SecMain.c @@ -70,6 +70,7 @@ SecStartup ( UINT32 Index; FSP_GLOBAL_DATA PeiFspData; UINT64 ExceptionHandler; + UINTN IdtSize; // // Process all libraries constructor function linked to SecCore. @@ -98,13 +99,24 @@ SecStartup ( // | | // |-------------------|----> TempRamBase IdtTableInStack.PeiService = NULL; - ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate); - for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) { - CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64)); + AsmReadIdtr (&IdtDescriptor); + if ((IdtDescriptor.Base == 0) && (IdtDescriptor.Limit == 0xFFFF)) { + ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate); + for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) { + CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64)); + } + IdtSize = sizeof (IdtTableInStack.IdtTable); + } else { + // Get minimum size + if (IdtDescriptor.Limit + 1 > sizeof (IdtTableInStack.IdtTable)) { + IdtSize = sizeof (IdtTableInStack.IdtTable); + } else { + IdtSize = IdtDescriptor.Limit + 1; + } + CopyMem ((VOID *) (UINTN) &IdtTableInStack.IdtTable, (VOID *) IdtDescriptor.Base, IdtSize); } - IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable; - IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1); + IdtDescriptor.Limit = (UINT16)(IdtSize - 1); AsmWriteIdtr (&IdtDescriptor); -- 2.13.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel