On Thu, 23 Nov 2023 at 05:49, Nhi Pham <n...@os.amperecomputing.com> wrote:
>
> If the SetVirtualAddressMap() is not called, mIsVirtualAddrConverted
> is FALSE and the kernel crash occurs in IsNestedFmpCapsule() when
> executing gBS->LocateProtocol () in the else case.
>
> To serve the omitted SetVirtualAddressMap() call, we could just check
> mEsrtTable presence instead of relying on mIsVirtualAddrConverted.
>
> Signed-off-by: Nhi Pham <n...@os.amperecomputing.com>

Agreed: SetVirtualAddressMap() is optional, so whether it has been
called or not should not be used as a proxy to decide whether or not
we are still running in the boot services context.

Reviewed-by: Ard Biesheuvel <a...@kernel.org>


> ---
>  MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c     | 17 
> +++++++----------
>  MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c |  2 --
>  2 files changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c 
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> index 197af267aff3..2433c76a8c6f 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
> @@ -41,8 +41,7 @@
>  #include <Protocol/FirmwareManagementProgress.h>
>  #include <Protocol/DevicePath.h>
>
> -EFI_SYSTEM_RESOURCE_TABLE  *mEsrtTable             = NULL;
> -BOOLEAN                    mIsVirtualAddrConverted = FALSE;
> +EFI_SYSTEM_RESOURCE_TABLE  *mEsrtTable = NULL;
>
>  BOOLEAN    mDxeCapsuleLibEndOfDxe      = FALSE;
>  EFI_EVENT  mDxeCapsuleLibEndOfDxeEvent = NULL;
> @@ -1394,14 +1393,12 @@ IsNestedFmpCapsule (
>    EFI_SYSTEM_RESOURCE_ENTRY  Entry;
>
>    EsrtGuidFound = FALSE;
> -  if (mIsVirtualAddrConverted) {
> -    if (mEsrtTable != NULL) {
> -      EsrtEntry = (EFI_SYSTEM_RESOURCE_ENTRY *)(mEsrtTable + 1);
> -      for (Index = 0; Index < mEsrtTable->FwResourceCount; Index++, 
> EsrtEntry++) {
> -        if (CompareGuid (&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {
> -          EsrtGuidFound = TRUE;
> -          break;
> -        }
> +  if (mEsrtTable != NULL) {
> +    EsrtEntry = (EFI_SYSTEM_RESOURCE_ENTRY *)(mEsrtTable + 1);
> +    for (Index = 0; Index < mEsrtTable->FwResourceCount; Index++, 
> EsrtEntry++) {
> +      if (CompareGuid (&EsrtEntry->FwClass, &CapsuleHeader->CapsuleGuid)) {
> +        EsrtGuidFound = TRUE;
> +        break;
>        }
>      }
>    } else {
> diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c 
> b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
> index 9ceb44fe4d79..44f30c16c284 100644
> --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
> +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
> @@ -21,7 +21,6 @@
>  #include <Library/MemoryAllocationLib.h>
>
>  extern EFI_SYSTEM_RESOURCE_TABLE  *mEsrtTable;
> -extern BOOLEAN                    mIsVirtualAddrConverted;
>  EFI_EVENT                         
> mDxeRuntimeCapsuleLibVirtualAddressChangeEvent = NULL;
>  EFI_EVENT                         mDxeRuntimeCapsuleLibReadyToBootEvent      
>     = NULL;
>
> @@ -40,7 +39,6 @@ DxeCapsuleLibVirtualAddressChangeEvent (
>    )
>  {
>    gRT->ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mEsrtTable);
> -  mIsVirtualAddrConverted = TRUE;
>  }
>
>  /**
> --
> 2.25.1
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#111664): https://edk2.groups.io/g/devel/message/111664
Mute This Topic: https://groups.io/mt/102762290/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to