From patchwork Thu May 12 13:52:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 67675 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp767722qge; Thu, 12 May 2016 06:53:08 -0700 (PDT) X-Received: by 10.66.152.201 with SMTP id va9mr13953607pab.73.1463061188534; Thu, 12 May 2016 06:53:08 -0700 (PDT) Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id a3si17607834pfb.217.2016.05.12.06.53.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 May 2016 06:53:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id EF92A1A1E80; Thu, 12 May 2016 06:53:08 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wm0-x235.google.com (mail-wm0-x235.google.com [IPv6:2a00:1450:400c:c09::235]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 861931A1E78 for ; Thu, 12 May 2016 06:53:07 -0700 (PDT) Received: by mail-wm0-x235.google.com with SMTP id a17so137497929wme.0 for ; Thu, 12 May 2016 06:53:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=LqYLBC1XABqfGqin1gyHUzbuaOVzksqpjAqCy9puhyo=; b=PFW9SrbbYvRbXIgGO/xZDNCy/47rRchG9+3FKYEU6HiIYgyi7hhM5SoAMMurFvB47B Df7lAu5orm/HKrvbjQ+ti3zTZuKSuRLn6zYjK1yIpj+nY/+ibAUlRSW2kBonyelUGvCP 6DF5/weo0VXnAaRo3eUD2VMJ0CphjVo8E2xEg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=LqYLBC1XABqfGqin1gyHUzbuaOVzksqpjAqCy9puhyo=; b=bf0R2ECz0y/NCMq1iyD6DgkHPXEiXCMHleoVOBanvg6Liw8skz9p68q+vZaPmrscrh L/YlBCA+4I0oUabNQyRCoQIN2Va2wsdifqlsZEY4ZQxCiZqNDfJYo/j9+f1Yju2eGeWB qpwJoCdkzp+ie5pUyr1zGVPtIjO2TkxIjXzVB8O1Hf1A4E50CCXzwFkhcsBzLMTfbKMQ Kx0lnn/LyC5chUSnzVIozuGGIfrYmkRh08FLg/qRnVd367tzaUJrOMvbKkeTBqmM/tgi PcznMaf25KRawAV1NdERwmhOrNwaWi/1yJfUdE/rUTzohJCUWXwUQz8OyclZsmUNtSKD 48bg== X-Gm-Message-State: AOPr4FUZr58o1lF11d9WZN8uASH2HSHKjnvjV2UA9ZthlNddPlR7IJgh391WorQ2TWmKtaNZ X-Received: by 10.194.75.197 with SMTP id e5mr11377671wjw.154.1463061185099; Thu, 12 May 2016 06:53:05 -0700 (PDT) Received: from localhost.localdomain ([195.55.142.58]) by smtp.gmail.com with ESMTPSA id hm7sm4186255wjb.41.2016.05.12.06.53.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 12 May 2016 06:53:04 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, heyi.guo@linaro.org Date: Thu, 12 May 2016 15:52:59 +0200 Message-Id: <1463061179-23197-1-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.7.4 Subject: [edk2] [PATCH] ArmPkg/ArmLib: avoid cache maintenance in PEIMs when executing in place X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: leif.lindholm@linaro.org, Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" On some platforms, performing cache maintenance on regions that are backed by NOR flash result in SErrors. Since cache maintenance is unnecessary in that case, create a PEIM specific version that only performs said cache maintenance in its constructor if the module is shadowed in RAM. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel --- Heyi: please try adding this to your platform DSC +[LibraryClasses.AARCH64.PEIM] + ArmLib|ArmPkg/Library/ArmLib/AArch64/AArch64LibPei.inf to switch to this new version of ArmLib that avoids the cache maintenance on the NOR regions ArmPkg/Library/ArmLib/AArch64/{AArch64LibConstructor.c => AArch64BaseLibConstructor.c} | 0 ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf | 2 +- ArmPkg/Library/ArmLib/AArch64/AArch64LibPei.inf | 43 +++++++++++++++ ArmPkg/Library/ArmLib/AArch64/AArch64PeiLibConstructor.c | 57 ++++++++++++++++++++ 4 files changed, 101 insertions(+), 1 deletion(-) -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64LibConstructor.c b/ArmPkg/Library/ArmLib/AArch64/AArch64BaseLibConstructor.c similarity index 100% rename from ArmPkg/Library/ArmLib/AArch64/AArch64LibConstructor.c rename to ArmPkg/Library/ArmLib/AArch64/AArch64BaseLibConstructor.c diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf index 58684e8492f2..ef9d261b910d 100644 --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf @@ -32,7 +32,7 @@ [Sources.AARCH64] ../Common/AArch64/ArmLibSupport.S ../Common/ArmLib.c - AArch64LibConstructor.c + AArch64BaseLibConstructor.c [Packages] ArmPkg/ArmPkg.dec diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64LibPei.inf b/ArmPkg/Library/ArmLib/AArch64/AArch64LibPei.inf new file mode 100644 index 000000000000..96517f5c167d --- /dev/null +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64LibPei.inf @@ -0,0 +1,43 @@ +#/** @file +# +# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
+# Portions copyright (c) 2011 - 2014, ARM Limited. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AArch64Lib + FILE_GUID = ef20ddf5-b334-47b3-94cf-52ff44c29138 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmLib|PEIM + CONSTRUCTOR = AArch64LibConstructor + +[Sources.AARCH64] + AArch64Lib.c + AArch64Mmu.c + AArch64ArchTimer.c + ArmLibSupportV8.S + AArch64Support.S + AArch64ArchTimerSupport.S + + ../Common/AArch64/ArmLibSupport.S + ../Common/ArmLib.c + AArch64PeiLibConstructor.c + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + MemoryAllocationLib + CacheMaintenanceLib diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64PeiLibConstructor.c b/ArmPkg/Library/ArmLib/AArch64/AArch64PeiLibConstructor.c new file mode 100644 index 000000000000..db93212b3f05 --- /dev/null +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64PeiLibConstructor.c @@ -0,0 +1,57 @@ +#/* @file +# +# Copyright (c) 2016, Linaro Limited. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#*/ + +#include + +#include +#include +#include + +EFI_STATUS +EFIAPI +AArch64LibConstructor ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + extern UINT32 ArmReplaceLiveTranslationEntrySize; + + EFI_FV_FILE_INFO FileInfo; + EFI_STATUS Status; + + Status = (*PeiServices)->FfsGetFileInfo (FileHandle, &FileInfo); + ASSERT_EFI_ERROR (Status); + + // + // Some platforms do not cope very well with cache maintenance being + // performed on regions backed by NOR flash. Since the cache maintenance + // is unnecessary to begin with in that case, perform it only when not + // executing in place. + // + if ((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry && + ((UINTN)FileInfo.Buffer + FileInfo.BufferSize >= + (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize)) { + DEBUG ((EFI_D_INFO, "ArmLib: skipping cache maintence on XIP PEIM\n")); + } else { + DEBUG ((EFI_D_INFO, "ArmLib: performing cache maintence on shadowed PEIM\n")); + // + // The ArmReplaceLiveTranslationEntry () helper function may be invoked + // with the MMU off so we have to ensure that it gets cleaned to the PoC + // + WriteBackDataCacheRange (ArmReplaceLiveTranslationEntry, + ArmReplaceLiveTranslationEntrySize); + } + + return RETURN_SUCCESS; +}