From nobody Sun Apr 28 10:57:28 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 15301761644011023.3452534567929; Thu, 28 Jun 2018 01:56:04 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 5B1ED21A02937; Thu, 28 Jun 2018 01:56:03 -0700 (PDT) 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) 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 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 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; 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 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,282,1526367600"; d="scan'208";a="240997009" From: Star Zeng To: edk2-devel@lists.01.org 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: [edk2] [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: , Cc: Liming Gao , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Liming Gao --- 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/Pp= i.c index 139cfeda0575..d8ba2dd42b59 100644 --- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c +++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c @@ -38,9 +38,9 @@ InitializePpiServices ( =20 /** =20 - Migrate Single PPI Pointer from the temporary memory to PEI installed me= mory. + Migrate Pointer from the temporary memory to PEI installed memory. =20 - @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 ( =20 **/ 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 >=3D TempBottom)) { - // - // Convert the pointer to the PPI descriptor from the old TempRam - // to the relocated physical memory. - // + if (((UINTN) *Pointer < TempTop) && + ((UINTN) *Pointer >=3D TempBottom)) { if (OffsetPositive) { - PpiPointer->Raw =3D (VOID *) ((UINTN)PpiPointer->Raw + Offset); + *Pointer =3D (VOID *) ((UINTN) *Pointer + Offset); } else { - PpiPointer->Raw =3D (VOID *) ((UINTN)PpiPointer->Raw - Offset); + *Pointer =3D (VOID *) ((UINTN) *Pointer - Offset); } + } +} =20 - // - // Only when the PEIM descriptor is in the old TempRam should it be ne= cessary - // to try to convert the pointers in the PEIM descriptor - // +/** =20 - if (((UINTN)PpiPointer->Ppi->Guid < TempTop) && - ((UINTN)PpiPointer->Ppi->Guid >=3D 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 =3D (VOID *) ((UINTN)PpiPointer->Ppi->Guid += Offset); - } else { - PpiPointer->Ppi->Guid =3D (VOID *) ((UINTN)PpiPointer->Ppi->Guid -= Offset); - } - } + Migrate Pointer in ranges of the temporary memory to PEI installed memor= y. + + @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; =20 + if (PrivateData->MemoryPages.Size !=3D 0) { // - // Convert the pointer to the PPI interface structure in the PPI descr= iptor - // 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 >=3D TempBottom) { - if (OffsetPositive) { - PpiPointer->Ppi->Ppi =3D (VOID *) ((UINTN)PpiPointer->Ppi->Ppi + O= ffset); - } else { - PpiPointer->Ppi->Ppi =3D (VOID *) ((UINTN)PpiPointer->Ppi->Ppi - O= ffset); - } + 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->PeiTemporaryRam= Size, + 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 =3D 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) { + if (PrivateData->HoleData[IndexHole].Size =3D=3D 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 + ); } } =20 /** =20 + Migrate Single PPI Pointer from the temporary memory to PEI installed me= mory. + + @param SecCoreData Points to a data structure containing SEC to PEI = handoff data, such as the size=20 + 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 desc= riptor + // 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. =20 - @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=20 and location of temporary RAM, the stack location= and the BFV location. @param PrivateData Pointer to PeiCore's private data structure. =20 @@ -117,62 +191,14 @@ ConvertPpiPointers ( ) { UINT8 Index; - UINT8 IndexHole; =20 for (Index =3D 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++)= { if (Index < PrivateData->PpiData.PpiListEnd || Index > PrivateData->Pp= iData.NotifyListEnd) { - if (PrivateData->MemoryPages.Size !=3D 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->PeiTemporar= yRamSize, - 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 =3D 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) { - if (PrivateData->HoleData[IndexHole].Size =3D=3D 0) { - continue; - } - - ConvertSinglePpiPointer ( - &PrivateData->PpiData.PpiListPtrs[Index], - (UINTN)PrivateData->HoleData[IndexHole].Base, - (UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->Hole= Data[IndexHole].Size, - PrivateData->HoleData[IndexHole].Offset, - PrivateData->HoleData[IndexHole].OffsetPositive - ); - } } } } --=20 2.7.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel