From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=star.zeng@intel.com; receiver=edk2-devel@lists.01.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 8175021BADAB2 for ; Thu, 28 Jun 2018 01:56:02 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Jun 2018 01:56:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,282,1526367600"; d="scan'208";a="240997009" Received: from shwdeopenpsi068.ccr.corp.intel.com ([10.239.158.46]) by fmsmga005.fm.intel.com with ESMTP; 28 Jun 2018 01:55:59 -0700 From: Star Zeng To: edk2-devel@lists.01.org Cc: Star Zeng , Liming Gao , Qing Huang Date: Thu, 28 Jun 2018 16:55:57 +0800 Message-Id: <1530176157-157512-1-git-send-email-star.zeng@intel.com> X-Mailer: git-send-email 2.7.0.windows.1 Subject: [PATCH] MdeModulePkg PeiCore: Not assume PpiDescriptor and Ppi in same range X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Jun 2018 08:56:02 -0000 Current code assumes PpiDescriptor and Ppi are in same range (heap/stack/hole). This patch removes the assumption. Descriptor needs to be converted first. It is also handled by this patch. Cc: Liming Gao Cc: Qing Huang Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng --- MdeModulePkg/Core/Pei/Ppi/Ppi.c | 204 ++++++++++++++++++++++------------------ 1 file changed, 115 insertions(+), 89 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Ppi/Ppi.c b/MdeModulePkg/Core/Pei/Ppi/Ppi.c index 139cfeda0575..d8ba2dd42b59 100644 --- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c +++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c @@ -38,9 +38,9 @@ InitializePpiServices ( /** - Migrate Single PPI Pointer from the temporary memory to PEI installed memory. + Migrate Pointer from the temporary memory to PEI installed memory. - @param PpiPointer Pointer to Ppi + @param Pointer Pointer to the Pointer needs to be converted. @param TempBottom Base of old temporary memory @param TempTop Top of old temporary memory @param Offset Offset of new memory to old temporary memory. @@ -48,64 +48,138 @@ InitializePpiServices ( **/ VOID -ConvertSinglePpiPointer ( - IN PEI_PPI_LIST_POINTERS *PpiPointer, +ConvertPointer ( + IN OUT VOID **Pointer, IN UINTN TempBottom, IN UINTN TempTop, IN UINTN Offset, IN BOOLEAN OffsetPositive ) { - if (((UINTN)PpiPointer->Raw < TempTop) && - ((UINTN)PpiPointer->Raw >= TempBottom)) { - // - // Convert the pointer to the PPI descriptor from the old TempRam - // to the relocated physical memory. - // + if (((UINTN) *Pointer < TempTop) && + ((UINTN) *Pointer >= TempBottom)) { if (OffsetPositive) { - PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Offset); + *Pointer = (VOID *) ((UINTN) *Pointer + Offset); } else { - PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - Offset); + *Pointer = (VOID *) ((UINTN) *Pointer - Offset); } + } +} - // - // Only when the PEIM descriptor is in the old TempRam should it be necessary - // to try to convert the pointers in the PEIM descriptor - // +/** - if (((UINTN)PpiPointer->Ppi->Guid < TempTop) && - ((UINTN)PpiPointer->Ppi->Guid >= TempBottom)) { - // - // Convert the pointer to the GUID in the PPI or NOTIFY descriptor - // from the old TempRam to the relocated physical memory. - // - if (OffsetPositive) { - PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid + Offset); - } else { - PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid - Offset); - } - } + Migrate Pointer in ranges of the temporary memory to PEI installed memory. + + @param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size + and location of temporary RAM, the stack location and the BFV location. + @param PrivateData Pointer to PeiCore's private data structure. + @param Pointer Pointer to the Pointer needs to be converted. + +**/ +VOID +ConvertPointerInRanges ( + IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, + IN PEI_CORE_INSTANCE *PrivateData, + IN OUT VOID **Pointer + ) +{ + UINT8 IndexHole; + if (PrivateData->MemoryPages.Size != 0) { // - // Convert the pointer to the PPI interface structure in the PPI descriptor - // from the old TempRam to the relocated physical memory. + // Convert PPI pointer in old memory pages + // It needs to be done before Convert PPI pointer in old Heap // - if ((UINTN)PpiPointer->Ppi->Ppi < TempTop && - (UINTN)PpiPointer->Ppi->Ppi >= TempBottom) { - if (OffsetPositive) { - PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi + Offset); - } else { - PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi - Offset); - } + ConvertPointer ( + Pointer, + (UINTN)PrivateData->MemoryPages.Base, + (UINTN)PrivateData->MemoryPages.Base + PrivateData->MemoryPages.Size, + PrivateData->MemoryPages.Offset, + PrivateData->MemoryPages.OffsetPositive + ); + } + + // + // Convert PPI pointer in old Heap + // + ConvertPointer ( + Pointer, + (UINTN)SecCoreData->PeiTemporaryRamBase, + (UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize, + PrivateData->HeapOffset, + PrivateData->HeapOffsetPositive + ); + + // + // Convert PPI pointer in old Stack + // + ConvertPointer ( + Pointer, + (UINTN)SecCoreData->StackBase, + (UINTN)SecCoreData->StackBase + SecCoreData->StackSize, + PrivateData->StackOffset, + PrivateData->StackOffsetPositive + ); + + // + // Convert PPI pointer in old TempRam Hole + // + for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) { + if (PrivateData->HoleData[IndexHole].Size == 0) { + continue; } + + ConvertPointer ( + Pointer, + (UINTN)PrivateData->HoleData[IndexHole].Base, + (UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->HoleData[IndexHole].Size, + PrivateData->HoleData[IndexHole].Offset, + PrivateData->HoleData[IndexHole].OffsetPositive + ); } } /** + Migrate Single PPI Pointer from the temporary memory to PEI installed memory. + + @param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size + and location of temporary RAM, the stack location and the BFV location. + @param PrivateData Pointer to PeiCore's private data structure. + @param PpiPointer Pointer to Ppi + +**/ +VOID +ConvertSinglePpiPointer ( + IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, + IN PEI_CORE_INSTANCE *PrivateData, + IN PEI_PPI_LIST_POINTERS *PpiPointer + ) +{ + // + // 1. Convert the pointer to the PPI descriptor from the old TempRam + // to the relocated physical memory. + // It (for the pointer to the PPI descriptor) needs to be done before 2 (for + // the pointer to the GUID) and 3 (for the pointer to the PPI interface structure). + // + ConvertPointerInRanges (SecCoreData, PrivateData, &PpiPointer->Raw); + // + // 2. Convert the pointer to the GUID in the PPI or NOTIFY descriptor + // from the old TempRam to the relocated physical memory. + // + ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Guid); + // + // 3. Convert the pointer to the PPI interface structure in the PPI descriptor + // from the old TempRam to the relocated physical memory. + // + ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Ppi); +} + +/** + Migrate PPI Pointers from the temporary memory to PEI installed memory. - @param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size + @param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size and location of temporary RAM, the stack location and the BFV location. @param PrivateData Pointer to PeiCore's private data structure. @@ -117,62 +191,14 @@ ConvertPpiPointers ( ) { UINT8 Index; - UINT8 IndexHole; for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) { if (Index < PrivateData->PpiData.PpiListEnd || Index > PrivateData->PpiData.NotifyListEnd) { - if (PrivateData->MemoryPages.Size != 0) { - // - // Convert PPI pointer in old memory pages - // It needs to be done before Convert PPI pointer in old Heap - // - ConvertSinglePpiPointer ( - &PrivateData->PpiData.PpiListPtrs[Index], - (UINTN)PrivateData->MemoryPages.Base, - (UINTN)PrivateData->MemoryPages.Base + PrivateData->MemoryPages.Size, - PrivateData->MemoryPages.Offset, - PrivateData->MemoryPages.OffsetPositive - ); - } - - // - // Convert PPI pointer in old Heap - // ConvertSinglePpiPointer ( - &PrivateData->PpiData.PpiListPtrs[Index], - (UINTN)SecCoreData->PeiTemporaryRamBase, - (UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize, - PrivateData->HeapOffset, - PrivateData->HeapOffsetPositive - ); - - // - // Convert PPI pointer in old Stack - // - ConvertSinglePpiPointer ( - &PrivateData->PpiData.PpiListPtrs[Index], - (UINTN)SecCoreData->StackBase, - (UINTN)SecCoreData->StackBase + SecCoreData->StackSize, - PrivateData->StackOffset, - PrivateData->StackOffsetPositive + SecCoreData, + PrivateData, + &PrivateData->PpiData.PpiListPtrs[Index] ); - - // - // Convert PPI pointer in old TempRam Hole - // - for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) { - if (PrivateData->HoleData[IndexHole].Size == 0) { - continue; - } - - ConvertSinglePpiPointer ( - &PrivateData->PpiData.PpiListPtrs[Index], - (UINTN)PrivateData->HoleData[IndexHole].Base, - (UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->HoleData[IndexHole].Size, - PrivateData->HoleData[IndexHole].Offset, - PrivateData->HoleData[IndexHole].OffsetPositive - ); - } } } } -- 2.7.0.windows.1