From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Zhichao Gao <zhichao.gao@intel.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
Hao Wu <hao.a.wu@intel.com>, Liming Gao <liming.gao@intel.com>,
Star Zeng <star.zeng@intel.com>
Subject: Re: [PATCH 1/2] MdeModulePkg/CapsuleRuntimeDxe: Merge changes form arm to all ARCH
Date: Wed, 20 Mar 2019 10:48:41 +0100 [thread overview]
Message-ID: <CAKv+Gu-bCHtpnQ2=AxYrXgv-JvmUhvR5TmvoMwxQhsFNeh+X0Q@mail.gmail.com> (raw)
In-Reply-To: <20190320014256.1224-2-zhichao.gao@intel.com>
On Wed, 20 Mar 2019 at 02:43, Zhichao Gao <zhichao.gao@intel.com> wrote:
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1462
>
> The arm ARCH has already to add a function CapsuleCacheWriteBack to
> flush the cache data to DRAM. That is also required in IA32 ARCH. So
> merge the changes. And this function do not support in runtime phase.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Hao Wu <hao.a.wu@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
After this patch, platforms may return TRUE from
QueryCapsuleCapabilities() while they returned FALSE before, i.e., at
runtime. This behavior change will surely break ARM, but I don't see
how it doesn't break IA32 as well if it now relies on this cache
maintenance to occur in the context of UpdateCapsule().
> ---
> .../Universal/CapsuleRuntimeDxe/CapsuleReset.c | 21 ++++++++++++++++
> .../{Arm/CapsuleReset.c => CapsuleResetNull.c} | 29 +++-------------------
> .../CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf | 14 +++++------
> 3 files changed, 30 insertions(+), 34 deletions(-)
> rename MdeModulePkg/Universal/CapsuleRuntimeDxe/{Arm/CapsuleReset.c => CapsuleResetNull.c} (51%)
>
> diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleReset.c b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleReset.c
> index 353f6f2090..8c45f6665e 100644
> --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleReset.c
> +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleReset.c
> @@ -16,6 +16,8 @@
>
> #include "CapsuleService.h"
>
> +#include <Library/CacheMaintenanceLib.h>
> +
> /**
> Whether the platform supports capsules that persist across reset. Note that
> some platforms only support such capsules at boot time.
> @@ -46,4 +48,23 @@ CapsuleCacheWriteBack (
> IN EFI_PHYSICAL_ADDRESS ScatterGatherList
> )
> {
> + EFI_CAPSULE_BLOCK_DESCRIPTOR *Desc;
> +
> + if (!EfiAtRuntime()) {
> + Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)ScatterGatherList;
> + do {
> + WriteBackDataCacheRange (Desc, sizeof *Desc);
> +
> + if (Desc->Length > 0) {
> + WriteBackDataCacheRange ((VOID *)(UINTN)Desc->Union.DataBlock,
> + Desc->Length
> + );
> + Desc++;
> + } else if (Desc->Union.ContinuationPointer > 0) {
> + Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)Desc->Union.ContinuationPointer;
> + }
> + } while (Desc->Length > 0 || Desc->Union.ContinuationPointer > 0);
> +
> + WriteBackDataCacheRange (Desc, sizeof *Desc);
> + }
> }
> diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/Arm/CapsuleReset.c b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleResetNull.c
> similarity index 51%
> rename from MdeModulePkg/Universal/CapsuleRuntimeDxe/Arm/CapsuleReset.c
> rename to MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleResetNull.c
> index d79d2fc693..3c5cfc1a16 100644
> --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/Arm/CapsuleReset.c
> +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleResetNull.c
> @@ -1,8 +1,9 @@
> /** @file
> - ARM implementation of architecture specific routines related to
> + Default implementation of architecture specific routines related to
> PersistAcrossReset capsules
>
> Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>
> + Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
>
> This program and the accompanying materials are licensed and made available
> under the terms and conditions of the BSD License which accompanies this
> @@ -31,14 +32,7 @@ IsPersistAcrossResetCapsuleSupported (
> VOID
> )
> {
> - //
> - // ARM requires the capsule payload to be cleaned to the point of coherency
> - // (PoC), but only permits doing so using cache maintenance instructions that
> - // operate on virtual addresses. Since at runtime, we don't know the virtual
> - // addresses of the data structures that make up the scatter/gather list, we
> - // cannot perform the maintenance, and all we can do is give up.
> - //
> - return FeaturePcdGet (PcdSupportUpdateCapsuleReset) && !EfiAtRuntime ();
> + return FeaturePcdGet (PcdSupportUpdateCapsuleReset);
> }
>
> /**
> @@ -55,21 +49,4 @@ CapsuleCacheWriteBack (
> IN EFI_PHYSICAL_ADDRESS ScatterGatherList
> )
> {
> - EFI_CAPSULE_BLOCK_DESCRIPTOR *Desc;
> -
> - Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)ScatterGatherList;
> - do {
> - WriteBackDataCacheRange (Desc, sizeof *Desc);
> -
> - if (Desc->Length > 0) {
> - WriteBackDataCacheRange ((VOID *)(UINTN)Desc->Union.DataBlock,
> - Desc->Length
> - );
> - Desc++;
> - } else if (Desc->Union.ContinuationPointer > 0) {
> - Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)Desc->Union.ContinuationPointer;
> - }
> - } while (Desc->Length > 0 || Desc->Union.ContinuationPointer > 0);
> -
> - WriteBackDataCacheRange (Desc, sizeof *Desc);
> }
> diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> index ad7af5fe62..c0bdf6db3d 100644
> --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> @@ -36,15 +36,15 @@
>
> [Sources.Ia32, Sources.EBC, Sources.ARM, Sources.AARCH64]
> SaveLongModeContext.c
> +
> +[Sources.Ia32, Sources.X64, Sources.ARM, Sources.AARCH64]
> CapsuleReset.c
>
> +[Sources.EBC]
> + CapsuleResetNull.c
> +
> [Sources.X64]
> X64/SaveLongModeContext.c
> - CapsuleReset.c
> -
> -[Sources.ARM, Sources.AARCH64]
> - SaveLongModeContext.c
> - Arm/CapsuleReset.c
>
> [Packages]
> MdePkg/MdePkg.dec
> @@ -61,14 +61,12 @@
> BaseLib
> PrintLib
> BaseMemoryLib
> + CacheMaintenanceLib
>
> [LibraryClasses.X64]
> UefiLib
> BaseMemoryLib
>
> -[LibraryClasses.ARM, LibraryClasses.AARCH64]
> - CacheMaintenanceLib
> -
> [Guids]
> ## SOMETIMES_PRODUCES ## Variable:L"CapsuleUpdateData" # (Process across reset capsule image) for capsule updated data
> ## SOMETIMES_PRODUCES ## Variable:L"CapsuleLongModeBuffer" # The long mode buffer used by IA32 Capsule PEIM to call X64 CapsuleCoalesce code to handle >4GB capsule blocks
> --
> 2.16.2.windows.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2019-03-20 9:48 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-20 1:42 [PATCH 0/2] Change reset logic related on capsule Zhichao Gao
2019-03-20 1:42 ` [PATCH 1/2] MdeModulePkg/CapsuleRuntimeDxe: Merge changes form arm to all ARCH Zhichao Gao
2019-03-20 9:48 ` Ard Biesheuvel [this message]
2019-03-21 7:41 ` Gao, Zhichao
2019-03-20 1:42 ` [PATCH 2/2] MdeModulePkg/ResetSystemRuntimeDxe: Remove DoS3 in warm reset Zhichao Gao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAKv+Gu-bCHtpnQ2=AxYrXgv-JvmUhvR5TmvoMwxQhsFNeh+X0Q@mail.gmail.com' \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox