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 <[email protected]> Cc: Nate DeSimone <[email protected]> Cc: Star Zeng <[email protected]> Cc: Ashraf Ali S <[email protected]> Signed-off-by: Ted Kuo <[email protected]> --- IntelFsp2Pkg/FspSecCore/SecFsp.c | 9 +++++---- IntelFsp2Pkg/FspSecCore/SecFsp.h | 2 +- IntelFsp2Pkg/FspSecCore/SecMain.c | 16 ++++++++-------- IntelFsp2Pkg/FspSecCore/SecMain.h | 4 ++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.c b/IntelFsp2Pkg/FspSecCore/SecFsp.c index 7fde6e7f41..e9b4091b20 100644 --- a/IntelFsp2Pkg/FspSecCore/SecFsp.c +++ b/IntelFsp2Pkg/FspSecCore/SecFsp.c @@ -16,19 +16,20 @@ @return FSP specific IDT gate descriptor. **/ -UINT64 +IA32_IDT_GATE_DESCRIPTOR FspGetExceptionHandler ( IN UINT64 IdtEntryTemplate ) { UINT32 Entry; - UINT64 ExceptionHandler; + IA32_IDT_GATE_DESCRIPTOR ExceptionHandler; IA32_IDT_GATE_DESCRIPTOR *IdtGateDescriptor; FSP_INFO_HEADER *FspInfoHeader; + ZeroMem ((VOID *)&ExceptionHandler, sizeof (IA32_IDT_GATE_DESCRIPTOR)); FspInfoHeader = (FSP_INFO_HEADER *)(UINTN)AsmGetFspInfoHeader (); - ExceptionHandler = IdtEntryTemplate; - IdtGateDescriptor = (IA32_IDT_GATE_DESCRIPTOR *)&ExceptionHandler; + *(UINT64 *)&ExceptionHandler = IdtEntryTemplate; + IdtGateDescriptor = &ExceptionHandler; Entry = (IdtGateDescriptor->Bits.OffsetHigh << 16) | IdtGateDescriptor->Bits.OffsetLow; Entry = FspInfoHeader->ImageBase + FspInfoHeader->ImageSize - (~Entry + 1); IdtGateDescriptor->Bits.OffsetHigh = (UINT16)(Entry >> 16); diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.h b/IntelFsp2Pkg/FspSecCore/SecFsp.h index 41931a33dd..e84528b378 100644 --- a/IntelFsp2Pkg/FspSecCore/SecFsp.h +++ b/IntelFsp2Pkg/FspSecCore/SecFsp.h @@ -30,7 +30,7 @@ @return FSP specific IDT gate descriptor. **/ -UINT64 +IA32_IDT_GATE_DESCRIPTOR FspGetExceptionHandler ( IN UINT64 IdtEntryTemplate ); diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.c b/IntelFsp2Pkg/FspSecCore/SecMain.c index 8effe2225c..94ea3865b4 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. @@ -119,7 +119,7 @@ SecStartup ( if (IdtDescriptor.Base == 0) { 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.35.3.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#91235): https://edk2.groups.io/g/devel/message/91235 Mute This Topic: https://groups.io/mt/92329473/21656 Group Owner: [email protected] Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
