public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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


  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