Reviewed-by: Ray Ni <ray...@intel.com>

> -----Original Message-----
> From: Wu, Hao A <hao.a...@intel.com>
> Sent: Thursday, February 6, 2020 1:24 PM
> To: devel@edk2.groups.io
> Cc: Wu, Hao A <hao.a...@intel.com>; Kubacki, Michael A
> <michael.a.kuba...@intel.com>; Kinney, Michael D
> <michael.d.kin...@intel.com>; Dong, Eric <eric.d...@intel.com>; Ni, Ray
> <ray...@intel.com>; Laszlo Ersek <ler...@redhat.com>
> Subject: [PATCH v1 2/2] UefiCpuPkg/MpInitLib: Not pass microcode info
> between archs in CPU_MP_DATA
> 
> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2465
> 
> Commit 89164babec:
> UefiCpuPkg/MpInitLib: don't shadow the microcode patch twice.
> 
> attempted to use 'MicrocodePatchRegionSize' and 'MicrocodePatchAddress'
> fields to avoid loading the microcode patches data into memory again in
> the DXE phase.
> 
> However, the CPU_MP_DATA structure has members with type 'UINTN' or
> pointer before the microcode patch related fields. This may cause issues
> when PEI and DXE are of different archs (e.g. PEI - IA32, DXE - x64),
> since the microcode patch related fields will have different offsets in
> the CPU_MP_DATA structure.
> 
> Commit 88bd066166:
> UefiCpuPkg/MpInitLib: Relocate microcode patch fields in CPU_MP_DATA
> 
> tried to resolve the above-mentioned issue by relocating the fields
> 'MicrocodePatchRegionSize' and 'MicrocodePatchAddress' before members with
> different size between different archs. But it failed to take the case of
> pre-built binaries (e.g. FSP) into consideration.
> 
> Binaries can be built when the code base had a different version of the
> CPU_MP_DATA structure definition. This may cause issues when accessing
> these microcode patch related fields, since their offsets are different
> (between PEI phase in the binaries and DXE phase in current code
> implementation).
> 
> This commit will use the newly introduced EDKII microcode patch HOB
> instead for the DXE phase to get the information of the loaded microcode
> patches data done in the PEI phase. And the 'MicrocodePatchRegionSize' and
> 'MicrocodePatchAddress' fields in CPU_MP_DATA will not be used to pass
> information between phases.
> 
> For pre-built binaries, they can be classified into 3 types with regard to
> the time when they are being built:
> 
> A. Before commit 89164babec
>    (In other words, 'MicrocodePatchRegionSize' and 'MicrocodePatchAddress'
>     were not being used to skip microcode load in DXE)
> 
> For this case, the EDKII microcode patch HOB will not be produced. This
> commit will load the microcode patches data again in DXE. Such behavior is
> the same with the code base back then.
> 
> B. After commit 89164babec, before commit e1ed55738e
>    (In other words, 'MicrocodePatchRegionSize' and 'MicrocodePatchAddress'
>     being used to skip microcode load in DXE, but failed to work properly
>     between differnt archs.)
> 
> For this case, the EDKII microcode patch HOB will not be produced as well.
> This commit will also load the microcode patches data again in DXE.
> 
> But since commit 89164babec failed to keep the detection and application
> of microcode patches working properly in DXE after skipping the load, we
> fall back to the origin behavior (that is to load the microcode patches
> data again in DXE).
> 
> C. After commit e1ed55738e
>    (In other words, EDKII microcode patch HOB will be produced.)
> 
> For this case, it will have the same behavior with the BIOS built from
> the current source codes.
> 
> Cc: Michael Kubacki <michael.a.kuba...@intel.com>
> Cc: Michael D Kinney <michael.d.kin...@intel.com>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Ray Ni <ray...@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> Signed-off-by: Hao A Wu <hao.a...@intel.com>
> ---
>  UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf |  3 +-
>  UefiCpuPkg/Library/MpInitLib/MpLib.h          | 23 +++++++++++
>  UefiCpuPkg/Library/MpInitLib/Microcode.c      | 43 ++++++++++++++++++++
>  UefiCpuPkg/Library/MpInitLib/MpLib.c          | 20 +++++----
>  UefiCpuPkg/Library/MpInitLib/PeiMpLib.c       |  3 +-
>  5 files changed, 80 insertions(+), 12 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
> b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
> index bf5d18d521..9e6cce0895 100644
> --- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
> +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
> @@ -1,7 +1,7 @@
>  ## @file
>  #  MP Initialize Library instance for DXE driver.
>  #
> -#  Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
>  ##
> @@ -58,6 +58,7 @@ [Protocols]
>  [Guids]
>    gEfiEventExitBootServicesGuid                 ## CONSUMES  ## Event
>    gEfiEventLegacyBootGuid                       ## SOMETIMES_CONSUMES  ## 
> Event
> +  gEdkiiMicrocodePatchHobGuid                   ## SOMETIMES_CONSUMES  ##
> HOB
> 
>  [Pcd]
>    gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber        ##
> CONSUMES
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index d7e20f0b74..a6eab5f3d7 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -29,6 +29,8 @@
>  #include <Library/MtrrLib.h>
>  #include <Library/HobLib.h>
> 
> +#include <Guid/MicrocodePatchHob.h>
> +
>  #include <IndustryStandard/FirmwareInterfaceTable.h>
> 
> 
> @@ -600,6 +602,27 @@ ShadowMicrocodeUpdatePatch (
>    );
> 
>  /**
> +  Get the cached microcode patch base address and size from the microcode
> patch
> +  information cache HOB.
> +
> +  @param[out] Address       Base address of the microcode patches data.
> +                            It will be updated if the microcode patch
> +                            information cache HOB is found.
> +  @param[out] RegionSize    Size of the microcode patches data.
> +                            It will be updated if the microcode patch
> +                            information cache HOB is found.
> +
> +  @retval  TRUE     The microcode patch information cache HOB is found.
> +  @retval  FALSE    The microcode patch information cache HOB is not found.
> +
> +**/
> +BOOLEAN
> +GetMicrocodePatchInfoFromHob (
> +  UINT64                         *Address,
> +  UINT64                         *RegionSize
> +  );
> +
> +/**
>    Detect whether Mwait-monitor feature is supported.
> 
>    @retval TRUE    Mwait-monitor feature is supported.
> diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c
> b/UefiCpuPkg/Library/MpInitLib/Microcode.c
> index 247f835b09..67e214d463 100644
> --- a/UefiCpuPkg/Library/MpInitLib/Microcode.c
> +++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c
> @@ -739,3 +739,46 @@ ShadowMicrocodeUpdatePatch (
>      ShadowMicrocodePatchByPcd (CpuMpData);
>    }
>  }
> +
> +/**
> +  Get the cached microcode patch base address and size from the microcode
> patch
> +  information cache HOB.
> +
> +  @param[out] Address       Base address of the microcode patches data.
> +                            It will be updated if the microcode patch
> +                            information cache HOB is found.
> +  @param[out] RegionSize    Size of the microcode patches data.
> +                            It will be updated if the microcode patch
> +                            information cache HOB is found.
> +
> +  @retval  TRUE     The microcode patch information cache HOB is found.
> +  @retval  FALSE    The microcode patch information cache HOB is not found.
> +
> +**/
> +BOOLEAN
> +GetMicrocodePatchInfoFromHob (
> +  UINT64                         *Address,
> +  UINT64                         *RegionSize
> +  )
> +{
> +  EFI_HOB_GUID_TYPE            *GuidHob;
> +  EDKII_MICROCODE_PATCH_HOB    *MicrocodePathHob;
> +
> +  GuidHob = GetFirstGuidHob (&gEdkiiMicrocodePatchHobGuid);
> +  if (GuidHob == NULL) {
> +    DEBUG((DEBUG_INFO, "%a: Microcode patch cache HOB is not found.\n",
> __FUNCTION__));
> +    return FALSE;
> +  }
> +
> +  MicrocodePathHob = GET_GUID_HOB_DATA (GuidHob);
> +
> +  *Address    = MicrocodePathHob->MicrocodePatchAddress;
> +  *RegionSize = MicrocodePathHob->MicrocodePatchRegionSize;
> +
> +  DEBUG((
> +    DEBUG_INFO, "%a: MicrocodeBase = 0x%lx, MicrocodeSize = 0x%lx\n",
> +    __FUNCTION__, *Address, *RegionSize
> +    ));
> +
> +  return TRUE;
> +}
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> index 855d37ba3e..d0fbc17ce5 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> @@ -1682,10 +1682,6 @@ MpInitLibInitialize (
>    CpuMpData->SwitchBspFlag    = FALSE;
>    CpuMpData->CpuData          = (CPU_AP_DATA *) (CpuMpData + 1);
>    CpuMpData->CpuInfoInHob     = (UINT64) (UINTN) (CpuMpData->CpuData +
> MaxLogicalProcessorNumber);
> -  if (OldCpuMpData != NULL) {
> -    CpuMpData->MicrocodePatchRegionSize = OldCpuMpData-
> >MicrocodePatchRegionSize;
> -    CpuMpData->MicrocodePatchAddress    = OldCpuMpData-
> >MicrocodePatchAddress;
> -  }
>    InitializeSpinLock(&CpuMpData->MpLock);
> 
>    //
> @@ -1740,11 +1736,6 @@ MpInitLibInitialize (
>        //
>        CollectProcessorCount (CpuMpData);
>      }
> -
> -    //
> -    // Load required microcode patches data into memory
> -    //
> -    ShadowMicrocodeUpdatePatch (CpuMpData);
>    } else {
>      //
>      // APs have been wakeup before, just get the CPU Information
> @@ -1762,6 +1753,17 @@ MpInitLibInitialize (
>      }
>    }
> 
> +  if (!GetMicrocodePatchInfoFromHob (
> +         &CpuMpData->MicrocodePatchAddress,
> +         &CpuMpData->MicrocodePatchRegionSize
> +         )) {
> +    //
> +    // The microcode patch information cache HOB does not exist, which means
> +    // the microcode patches data has not been loaded into memory yet
> +    //
> +    ShadowMicrocodeUpdatePatch (CpuMpData);
> +  }
> +
>    //
>    // Detect and apply Microcode on BSP
>    //
> diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> index 06e3f5d0d3..6ecbed39ec 100644
> --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
> @@ -1,7 +1,7 @@
>  /** @file
>    MP initialize support functions for PEI phase.
> 
> -  Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -9,7 +9,6 @@
>  #include "MpLib.h"
>  #include <Library/PeiServicesLib.h>
>  #include <Guid/S3SmmInitDone.h>
> -#include <Guid/MicrocodePatchHob.h>
> 
>  /**
>    S3 SMM Init Done notification function.
> --
> 2.12.0.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#54171): https://edk2.groups.io/g/devel/message/54171
Mute This Topic: https://groups.io/mt/71015996/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to