From: Kuo, Ted Date: Tue, 12 Jul 2022 09:30:58 +0000 (-0700) Subject: IntelFsp2Pkg: Update SEC_IDT_TABLE struct X-Git-Tag: edk2-stable202208~115 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=470206ba7f118aaa1153d66689cf3ee4d17051b7 IntelFsp2Pkg: Update SEC_IDT_TABLE struct 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 Cc: Nate DeSimone Cc: Star Zeng Cc: Ashraf Ali S Signed-off-by: Ted Kuo Reviewed-by: Chasel Chiu --- diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.c b/IntelFsp2Pkg/FspSecCore/SecFsp.c index 7fde6e7f41..d9085ef51f 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); @@ -200,11 +201,11 @@ FspGlobalDataInit ( (PeiFspData->FspInfoHeader->ImageRevision >> 24) & 0xFF, \ (PeiFspData->FspInfoHeader->ImageRevision >> 16) & 0xFF, \ (PeiFspData->FspInfoHeader->HeaderRevision >= 6) ? \ - (((PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF) | (PeiFspData->FspInfoHeader->ExtendedImageRevision & 0xFF00)) :\ - ((PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF), \ + (((PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF) | (PeiFspData->FspInfoHeader->ExtendedImageRevision & 0xFF00)) : \ + ((PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF), \ (PeiFspData->FspInfoHeader->HeaderRevision >= 6) ? \ - ((PeiFspData->FspInfoHeader->ImageRevision & 0xFF) | ((PeiFspData->FspInfoHeader->ExtendedImageRevision & 0xFF) << 8)): \ - (PeiFspData->FspInfoHeader->ImageRevision & 0xFF) + ((PeiFspData->FspInfoHeader->ImageRevision & 0xFF) | ((PeiFspData->FspInfoHeader->ExtendedImageRevision & 0xFF) << 8)) : \ + (PeiFspData->FspInfoHeader->ImageRevision & 0xFF) )); } 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..a09653da96 100644 --- a/IntelFsp2Pkg/FspSecCore/SecMain.h +++ b/IntelFsp2Pkg/FspSecCore/SecMain.h @@ -26,7 +26,7 @@ typedef VOID -(EFIAPI *PEI_CORE_ENTRY) ( +(EFIAPI *PEI_CORE_ENTRY)( IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList ); @@ -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; /**