REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3957 The reserved IDT table size in SecCore is too small for X64. Changed the type of IdtTable in SEC_IDT_TABLE from UINT64 to IA32_IDT_GATE_DESCRIPTOR to have sufficient size reserved in IdtTable for X64.
Cc: Chasel Chiu <chasel.c...@intel.com> Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> Cc: Star Zeng <star.z...@intel.com> Cc: Ashraf Ali S <ashraf.al...@intel.com> Signed-off-by: Ted Kuo <ted....@intel.com> --- IntelFsp2Pkg/FspSecCore/SecMain.c | 19 ++++++++++--------- IntelFsp2Pkg/FspSecCore/SecMain.h | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.c b/IntelFsp2Pkg/FspSecCore/SecMain.c index 8effe2225c..6a23275afa 100644 --- a/IntelFsp2Pkg/FspSecCore/SecMain.c +++ b/IntelFsp2Pkg/FspSecCore/SecMain.c @@ -58,13 +58,13 @@ SecStartup ( IN UINT32 ApiIdx ) { - EFI_SEC_PEI_HAND_OFF SecCoreData; - IA32_DESCRIPTOR IdtDescriptor; - SEC_IDT_TABLE IdtTableInStack; - UINT32 Index; - FSP_GLOBAL_DATA PeiFspData; - UINT64 ExceptionHandler; - UINTN IdtSize; + EFI_SEC_PEI_HAND_OFF SecCoreData; + IA32_DESCRIPTOR IdtDescriptor; + SEC_IDT_TABLE IdtTableInStack; + UINT32 Index; + FSP_GLOBAL_DATA PeiFspData; + IA32_IDT_GATE_DESCRIPTOR ExceptionHandler; + UINTN IdtSize; // // Process all libraries constructor function linked to SecCore. @@ -117,9 +117,10 @@ SecStartup ( IdtTableInStack.PeiService = 0; AsmReadIdtr (&IdtDescriptor); if (IdtDescriptor.Base == 0) { - ExceptionHandler = FspGetExceptionHandler (mIdtEntryTemplate); + ZeroMem ((VOID *)&ExceptionHandler, sizeof (IA32_IDT_GATE_DESCRIPTOR)); + *((UINT64 *) &ExceptionHandler) = FspGetExceptionHandler (mIdtEntryTemplate); for (Index = 0; Index < FixedPcdGet8 (PcdFspMaxInterruptSupported); Index++) { - CopyMem ((VOID *)&IdtTableInStack.IdtTable[Index], (VOID *)&ExceptionHandler, sizeof (UINT64)); + CopyMem ((VOID *)&IdtTableInStack.IdtTable[Index], (VOID *)&ExceptionHandler, sizeof (IA32_IDT_GATE_DESCRIPTOR)); } IdtSize = sizeof (IdtTableInStack.IdtTable); diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.h b/IntelFsp2Pkg/FspSecCore/SecMain.h index 7c2642ad48..1fe7c15aeb 100644 --- a/IntelFsp2Pkg/FspSecCore/SecMain.h +++ b/IntelFsp2Pkg/FspSecCore/SecMain.h @@ -38,8 +38,8 @@ typedef struct _SEC_IDT_TABLE { // Note: For IA32, only the 4 bytes immediately preceding IDT is used to store // EFI_PEI_SERVICES** // - UINT64 PeiService; - UINT64 IdtTable[FixedPcdGet8 (PcdFspMaxInterruptSupported)]; + UINT64 PeiService; + IA32_IDT_GATE_DESCRIPTOR IdtTable[FixedPcdGet8 (PcdFspMaxInterruptSupported)]; } SEC_IDT_TABLE; /** -- 2.26.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#90786): https://edk2.groups.io/g/devel/message/90786 Mute This Topic: https://groups.io/mt/92015982/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-