From nobody Tue Feb 10 23:01:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+94330+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94330+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1664180731; cv=none; d=zohomail.com; s=zohoarc; b=RJH9+WVh7/tOJZjgGSZH9/bfbz5wLNq0MMpUPF68PeLmNCuwd8xDVpgy47Tn0vlwwgtodC571Qki2G8OwZCq13DXTJNnztTzvzzwHQ4jCKSVEnfRKiYjAoEuCokucrtTUeiPeslVoyR7gV3YTT860piMeBtV09S4+3A6pAFvyQQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1664180731; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=sT8RV6ibQMLjv/zT3TtykwZ5acqv0O5dUM4X7UFEPl8=; b=kV3oTuwxQc5829PShDbGz5VhpPnbwA6XDZj16MVlG1HQ9DIwkNPPlKu8n4Z/gQyGc+OBRhvRVPsHiGaXMcGhNu5K501KX25buA4Z+ixXlqk1EEfuHYBOQSmNYmtmIG+swTpqadaLj46xRfGnu7eT1p8kWGh2XlQ8mykaDrECpE4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94330+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 166418073183290.21561768865797; Mon, 26 Sep 2022 01:25:31 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id LhNCYY1788612x4GuThHRmjg; Mon, 26 Sep 2022 01:25:31 -0700 X-Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by mx.groups.io with SMTP id smtpd.web11.26076.1664180730285594418 for ; Mon, 26 Sep 2022 01:25:30 -0700 X-Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 9ED756190C; Mon, 26 Sep 2022 08:25:29 +0000 (UTC) X-Received: by smtp.kernel.org (Postfix) with ESMTPSA id 736F8C433D7; Mon, 26 Sep 2022 08:25:28 +0000 (UTC) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Leif Lindholm , Alexander Graf Subject: [edk2-devel] [PATCH v3 08/16] ArmPkg/ArmMmuLib: Reuse XIP MMU routines when splitting entries Date: Mon, 26 Sep 2022 10:25:03 +0200 Message-Id: <20220926082511.2110797-9-ardb@kernel.org> In-Reply-To: <20220926082511.2110797-1-ardb@kernel.org> References: <20220926082511.2110797-1-ardb@kernel.org> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ardb@kernel.org X-Gm-Message-State: IdcV5Gdy0lbotyjnPcYSf8lxx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1664180731; bh=YzZehkBL1FTiwvcJvExynaMKp9rU6j/ox387hSsw27o=; h=Cc:Date:From:Reply-To:Subject:To; b=WmoUmsJseAFL+YtCFdjvhKwbNu9bxygemAR9lHCjVzUafg4lluu8aNyL2EM5FnNP9jF XwBpzOrQJsCTg7jgSmkMMtrJMAHrVou1khVGseDS18eNJsf/Kb1jfi5QrqBZZG2nTWSOu vfACzPwgno2W1zYbe89v/60pUqwv940Jo18= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1664180732368100006 Content-Type: text/plain; charset="utf-8" In order to reduce the likelihood that we will need to rely on the logic that disables and re-enables the MMU for updating a page table entry safely, expose the XIP version of the helper routine via a HOB and use it instead of the one that is copied into DRAM. Since the XIP copy is already clean to the PoC, and will never end up getting unmapped during a block entry split, we can use it safely without any cache maintenance, and without running the risk of pulling the rug from under our feet when updating an entry by going through an invalid mapping. Signed-off-by: Ard Biesheuvel Acked-by: Leif Lindholm --- ArmPkg/ArmPkg.dec | 2 ++ ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 27 ++++++++++= ++-------- ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c | 17 ++++++++++= ++ ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf | 4 +++ ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf | 4 +++ 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 9da1bbc9f216..cfb6fe602485 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -99,6 +99,8 @@ [Guids.common] # Include/Guid/ArmMpCoreInfo.h gArmMpCoreInfoGuid =3D { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65,= 0x8e, 0xd8, 0x57, 0xe8, 0x34} } =20 + gArmMmuReplaceLiveTranslationEntryFuncGuid =3D { 0xa8b50ff3, 0x08ec, 0x4= dd3, {0xbf, 0x04, 0x28, 0xbf, 0x71, 0x75, 0xc7, 0x4a} } + [Protocols.common] ## Arm System Control and Management Interface(SCMI) Base protocol ## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/ArmPkg/Libr= ary/ArmMmuLib/AArch64/ArmMmuLibCore.c index ae59e9a7d04e..764c7d362e2e 100644 --- a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -10,6 +10,7 @@ **/ =20 #include +#include #include #include #include @@ -120,14 +121,14 @@ ReplaceTableEntry ( // use an ordinary break before make. Otherwise, we will need to // temporarily disable the MMU. DisableMmu =3D FALSE; - if ((((RegionStart ^ (UINTN)ArmReplaceLiveTranslationEntry) & ~BlockMa= sk) =3D=3D 0) || + if ((((RegionStart ^ (UINTN)mReplaceLiveEntryFunc) & ~BlockMask) =3D= =3D 0) || (((RegionStart ^ (UINTN)Entry) & ~BlockMask) =3D=3D 0)) { DisableMmu =3D TRUE; DEBUG ((DEBUG_WARN, "%a: splitting block entry with MMU disabled\n",= __FUNCTION__)); } =20 - ArmReplaceLiveTranslationEntry (Entry, Value, RegionStart, DisableMmu); + mReplaceLiveEntryFunc (Entry, Value, RegionStart, DisableMmu); } } =20 @@ -747,15 +748,21 @@ ArmMmuBaseLibConstructor ( ) { extern UINT32 ArmReplaceLiveTranslationEntrySize; + VOID *Hob; =20 - // - // The ArmReplaceLiveTranslationEntry () helper function may be invoked - // with the MMU off so we have to ensure that it gets cleaned to the PoC - // - WriteBackDataCacheRange ( - (VOID *)(UINTN)ArmReplaceLiveTranslationEntry, - ArmReplaceLiveTranslationEntrySize - ); + Hob =3D GetFirstGuidHob (&gArmMmuReplaceLiveTranslationEntryFuncGuid); + if (Hob !=3D NULL) { + mReplaceLiveEntryFunc =3D *(VOID **)GET_GUID_HOB_DATA (Hob); + } else { + // + // The ArmReplaceLiveTranslationEntry () helper function may be invoked + // with the MMU off so we have to ensure that it gets cleaned to the P= oC + // + WriteBackDataCacheRange ( + (VOID *)(UINTN)ArmReplaceLiveTranslationEntry, + ArmReplaceLiveTranslationEntrySize + ); + } =20 return RETURN_SUCCESS; } diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c b/A= rmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c index caace2c17cdc..5f50a605a338 100644 --- a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c +++ b/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c @@ -12,6 +12,7 @@ #include #include #include +#include =20 EFI_STATUS EFIAPI @@ -21,6 +22,8 @@ ArmMmuPeiLibConstructor ( ) { extern UINT32 ArmReplaceLiveTranslationEntrySize; + VOID *ArmReplaceLiveTranslationEntryFunc; + VOID *Hob; =20 EFI_FV_FILE_INFO FileInfo; EFI_STATUS Status; @@ -42,6 +45,20 @@ ArmMmuPeiLibConstructor ( (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEn= trySize)) { DEBUG ((DEBUG_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM= \n")); + + // + // Expose the XIP version of the ArmReplaceLiveTranslationEntry() rout= ine + // via a HOB so we can fall back to it later when we need to split blo= ck + // mappings in a way that adheres to break-before-make requirements. + // + ArmReplaceLiveTranslationEntryFunc =3D ArmReplaceLiveTranslationEntry; + + Hob =3D BuildGuidDataHob ( + &gArmMmuReplaceLiveTranslationEntryFuncGuid, + &ArmReplaceLiveTranslationEntryFunc, + sizeof ArmReplaceLiveTranslationEntryFunc + ); + ASSERT (Hob !=3D NULL); } else { DEBUG ((DEBUG_INFO, "ArmMmuLib: performing cache maintenance on shadow= ed PEIM\n")); // diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf b/ArmPkg/Library/Ar= mMmuLib/ArmMmuBaseLib.inf index 3d78e7dabf47..57cb71f90ee3 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf +++ b/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf @@ -36,7 +36,11 @@ [Packages] [LibraryClasses] ArmLib CacheMaintenanceLib + HobLib MemoryAllocationLib =20 +[Guids] + gArmMmuReplaceLiveTranslationEntryFuncGuid + [Pcd.ARM] gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf b/ArmPkg/Library/Arm= MmuLib/ArmMmuPeiLib.inf index ce9674ea99ef..02f874a1a994 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf +++ b/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf @@ -29,4 +29,8 @@ [Packages] [LibraryClasses] ArmLib CacheMaintenanceLib + HobLib MemoryAllocationLib + +[Guids] + gArmMmuReplaceLiveTranslationEntryFuncGuid --=20 2.35.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#94330): https://edk2.groups.io/g/devel/message/94330 Mute This Topic: https://groups.io/mt/93922696/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-