From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.126, mailfrom: ray.ni@intel.com) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by groups.io with SMTP; Sat, 04 May 2019 19:41:04 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 May 2019 19:41:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,431,1549958400"; d="scan'208";a="343693754" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga006.fm.intel.com with ESMTP; 04 May 2019 19:41:03 -0700 Received: from fmsmsx121.amr.corp.intel.com (10.18.125.36) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sat, 4 May 2019 19:41:03 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx121.amr.corp.intel.com (10.18.125.36) with Microsoft SMTP Server (TLS) id 14.3.408.0; Sat, 4 May 2019 19:41:02 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.33]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.70]) with mapi id 14.03.0415.000; Sun, 5 May 2019 10:41:01 +0800 From: "Ni, Ray" To: "devel@edk2.groups.io" , "Kinney, Michael D" CC: "Dong, Eric" , Laszlo Ersek Subject: Re: [edk2-devel] [Patch V3 4/8] UefiCpuPkg/MpInitLibUp: Add uniprocessor MpInitLib Thread-Topic: [edk2-devel] [Patch V3 4/8] UefiCpuPkg/MpInitLibUp: Add uniprocessor MpInitLib Thread-Index: AQHU/4tJhyUI6kCd/k+I/VPZnyQLCKZb2JoA Date: Sun, 5 May 2019 02:36:42 +0000 Deferred-Delivery: Sun, 5 May 2019 02:41:00 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C125C7B@SHSMSX104.ccr.corp.intel.com> References: <20190430193108.8544-1-michael.d.kinney@intel.com> <20190430193108.8544-5-michael.d.kinney@intel.com> In-Reply-To: <20190430193108.8544-5-michael.d.kinney@intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Ray Ni > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Michael > D Kinney > Sent: Wednesday, May 1, 2019 3:31 AM > To: devel@edk2.groups.io > Cc: Dong, Eric ; Ni, Ray ; Laszlo > Ersek > Subject: [edk2-devel] [Patch V3 4/8] UefiCpuPkg/MpInitLibUp: Add > uniprocessor MpInitLib >=20 > Add a new instance of the MpInitLib that is designed for uniprocessor > platforms that require the use of modules that depend on the > MP_SERVICES_PROTOCOL for dispatch or to retrieve information about the > boot processor. >=20 > Cc: Eric Dong > Cc: Ray Ni > Cc: Laszlo Ersek > Signed-off-by: Michael D Kinney > --- > UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c | 407 > ++++++++++++++++++ > .../Library/MpInitLibUp/MpInitLibUp.inf | 37 ++ > .../Library/MpInitLibUp/MpInitLibUp.uni | 14 + > UefiCpuPkg/UefiCpuPkg.dsc | 3 +- > 4 files changed, 460 insertions(+), 1 deletion(-) create mode 100644 > UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c > create mode 100644 UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf > create mode 100644 UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.uni >=20 > diff --git a/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c > b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c > new file mode 100644 > index 0000000000..36c2bb5326 > --- /dev/null > +++ b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c > @@ -0,0 +1,407 @@ > +/** @file > + Multiple-Processor initialization Library for uniprocessor platforms. > + > + Copyright (c) 2019, Intel Corporation. All rights reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include #include > +#include #include > +#include > + > +/** > + MP Initialize Library initialization. > + > + This service will allocate AP reset vector and wakeup all APs to do > + APs initialization. > + > + This service must be invoked before all other MP Initialize Library > + service are invoked. > + > + @retval EFI_SUCCESS MP initialization succeeds. > + @retval Others MP initialization fails. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibInitialize ( > + VOID > + ) > +{ > + // > + // Enable the local APIC for Virtual Wire Mode. > + // > + ProgramVirtualWireMode (); > + > + return EFI_SUCCESS; > +} > + > +/** > + Retrieves the number of logical processor in the platform and the > +number of > + those logical processors that are enabled on this boot. This service > +may only > + be called from the BSP. > + > + @param[out] NumberOfProcessors Pointer to the total number o= f > logical > + processors in the system, inc= luding the BSP > + and disabled APs. > + @param[out] NumberOfEnabledProcessors Pointer to the number of > enabled logical > + processors that exist in syst= em, including > + the BSP. > + > + @retval EFI_SUCCESS The number of logical processors and = enabled > + logical processors was retrieved. > + @retval EFI_DEVICE_ERROR The calling processor is an AP. > + @retval EFI_INVALID_PARAMETER NumberOfProcessors is NULL and > NumberOfEnabledProcessors > + is NULL. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibGetNumberOfProcessors ( > + OUT UINTN *NumberOfProcessors, OPTIONAL > + OUT UINTN *NumberOfEnabledProcessors OPTIONAL > + ) > +{ > + *NumberOfProcessors =3D 1; > + *NumberOfEnabledProcessors =3D 1; > + return EFI_SUCCESS; > +} > + > +/** > + Gets detailed MP-related information on the requested processor at > +the > + instant this call is made. This service may only be called from the B= SP. > + > + @param[in] ProcessorNumber The handle number of processor. > + @param[out] ProcessorInfoBuffer A pointer to the buffer where > information for > + the requested processor is deposite= d. > + @param[out] HealthData Return processor health data. > + > + @retval EFI_SUCCESS Processor information was returned. > + @retval EFI_DEVICE_ERROR The calling processor is an AP. > + @retval EFI_INVALID_PARAMETER ProcessorInfoBuffer is NULL. > + @retval EFI_NOT_FOUND The processor with the handle specifi= ed by > + ProcessorNumber does not exist in the= platform. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibGetProcessorInfo ( > + IN UINTN ProcessorNumber, > + OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer, > + OUT EFI_HEALTH_FLAGS *HealthData OPTIONAL > + ) > +{ > + EFI_HOB_GUID_TYPE *GuidHob; > + EFI_SEC_PLATFORM_INFORMATION_RECORD *SecPlatformInformation; > + > + if (ProcessorInfoBuffer =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + if (ProcessorNumber !=3D 0) { > + return EFI_NOT_FOUND; > + } > + ProcessorInfoBuffer->ProcessorId =3D 0; > + ProcessorInfoBuffer->StatusFlag =3D PROCESSOR_AS_BSP_BIT | > + PROCESSOR_ENABLED_BIT | > + PROCESSOR_HEALTH_STATUS_BIT; > + ProcessorInfoBuffer->Location.Package =3D 0; > + ProcessorInfoBuffer->Location.Core =3D 0; > + ProcessorInfoBuffer->Location.Thread =3D 0; > + if (HealthData !=3D NULL) { > + GuidHob =3D GetFirstGuidHob (&gEfiSecPlatformInformationPpiGuid); > + if (GuidHob !=3D NULL) { > + SecPlatformInformation =3D GET_GUID_HOB_DATA (GuidHob); > + HealthData->Uint32 =3D SecPlatformInformation->IA32HealthFlags.Ui= nt32; > + } else { > + DEBUG ((DEBUG_INFO, "Does not find any HOB stored CPU BIST > information!\n")); > + HealthData->Uint32 =3D 0; > + } > + } > + return EFI_SUCCESS; > +} > + > +/** > + This service executes a caller provided function on all enabled APs. > + > + @param[in] Procedure A pointer to the function to be r= un on > + enabled APs of the system. See ty= pe > + EFI_AP_PROCEDURE. > + @param[in] SingleThread If TRUE, then all the enabled APs= execute > + the function specified by Procedu= re one by > + one, in ascending order of proces= sor handle > + number. If FALSE, then all the e= nabled APs > + execute the function specified by= Procedure > + simultaneously. > + @param[in] WaitEvent The event created by the caller w= ith > CreateEvent() > + service. If it is NULL, then exe= cute in > + blocking mode. BSP waits until al= l APs finish > + or TimeoutInMicroSeconds expires.= If it's > + not NULL, then execute in non-blo= cking mode. > + BSP requests the function specifi= ed by > + Procedure to be started on all th= e enabled > + APs, and go on executing immediat= ely. If > + all return from Procedure, or Tim= eoutInMicroSeconds > + expires, this event is signaled. = The BSP > + can use the CheckEvent() or WaitF= orEvent() > + services to check the state of ev= ent. Type > + EFI_EVENT is defined in CreateEve= nt() in > + the Unified Extensible Firmware I= nterface > + Specification. > + @param[in] TimeoutInMicroseconds Indicates the time limit in > microseconds for > + APs to return from Procedure, eit= her for > + blocking or non-blocking mode. Ze= ro means > + infinity. If the timeout expires= before > + all APs return from Procedure, th= en Procedure > + on the failed APs is terminated. = All enabled > + APs are available for next functi= on assigned > + by MpInitLibStartupAllAPs() or > + MPInitLibStartupThisAP(). > + If the timeout expires in blockin= g mode, > + BSP returns EFI_TIMEOUT. If the = timeout > + expires in non-blocking mode, Wai= tEvent > + is signaled with SignalEvent(). > + @param[in] ProcedureArgument The parameter passed into > Procedure for > + all APs. > + @param[out] FailedCpuList If NULL, this parameter is ignore= d. > Otherwise, > + if all APs finish successfully, t= hen its > + content is set to NULL. If not al= l APs > + finish before timeout expires, th= en its > + content is set to address of the = buffer > + holding handle numbers of the fai= led APs. > + The buffer is allocated by MP Ini= tialization > + library, and it's the caller's re= sponsibility to > + free the buffer with FreePool() s= ervice. > + In blocking mode, it is ready for= consumption > + when the call returns. In non-blo= cking mode, > + it is ready when WaitEvent is sig= naled. The > + list of failed CPU is terminated = by > + END_OF_CPU_LIST. > + > + @retval EFI_SUCCESS In blocking mode, all APs have finish= ed before > + the timeout expired. > + @retval EFI_SUCCESS In non-blocking mode, function has be= en > dispatched > + to all enabled APs. > + @retval EFI_UNSUPPORTED A non-blocking mode request was made > after the > + UEFI event EFI_EVENT_GROUP_READY_TO_B= OOT was > + signaled. > + @retval EFI_UNSUPPORTED WaitEvent is not NULL if non-blocking > mode is not > + supported. > + @retval EFI_DEVICE_ERROR Caller processor is AP. > + @retval EFI_NOT_STARTED No enabled APs exist in the system. > + @retval EFI_NOT_READY Any enabled APs are busy. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + @retval EFI_TIMEOUT In blocking mode, the timeout expired= before > + all enabled APs have finished. > + @retval EFI_INVALID_PARAMETER Procedure is NULL. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibStartupAllAPs ( > + IN EFI_AP_PROCEDURE Procedure, > + IN BOOLEAN SingleThread, > + IN EFI_EVENT WaitEvent OPTIONAL, > + IN UINTN TimeoutInMicroseconds, > + IN VOID *ProcedureArgument OPTIONAL, > + OUT UINTN **FailedCpuList OPTIONAL > + ) > +{ > + return EFI_NOT_STARTED; > +} > + > +/** > + This service lets the caller get one enabled AP to execute a > +caller-provided > + function. > + > + @param[in] Procedure A pointer to the function to be r= un on the > + designated AP of the system. See = type > + EFI_AP_PROCEDURE. > + @param[in] ProcessorNumber The handle number of the AP. The > range is > + from 0 to the total number of log= ical > + processors minus 1. The total num= ber of > + logical processors can be retriev= ed by > + MpInitLibGetNumberOfProcessors(). > + @param[in] WaitEvent The event created by the caller w= ith > CreateEvent() > + service. If it is NULL, then exe= cute in > + blocking mode. BSP waits until th= is AP finish > + or TimeoutInMicroSeconds expires.= If it's > + not NULL, then execute in non-blo= cking mode. > + BSP requests the function specifi= ed by > + Procedure to be started on this A= P, > + and go on executing immediately. = If this AP > + return from Procedure or TimeoutI= nMicroSeconds > + expires, this event is signaled. = The BSP > + can use the CheckEvent() or WaitF= orEvent() > + services to check the state of ev= ent. Type > + EFI_EVENT is defined in CreateEve= nt() in > + the Unified Extensible Firmware I= nterface > + Specification. > + @param[in] TimeoutInMicroseconds Indicates the time limit in > microseconds for > + this AP to finish this Procedure,= either for > + blocking or non-blocking mode. Ze= ro means > + infinity. If the timeout expires= before > + this AP returns from Procedure, t= hen Procedure > + on the AP is terminated. The > + AP is available for next function= assigned > + by MpInitLibStartupAllAPs() or > + MpInitLibStartupThisAP(). > + If the timeout expires in blockin= g mode, > + BSP returns EFI_TIMEOUT. If the = timeout > + expires in non-blocking mode, Wai= tEvent > + is signaled with SignalEvent(). > + @param[in] ProcedureArgument The parameter passed into > Procedure on the > + specified AP. > + @param[out] Finished If NULL, this parameter is ignore= d. In > + blocking mode, this parameter is = ignored. > + In non-blocking mode, if AP retur= ns from > + Procedure before the timeout expi= res, its > + content is set to TRUE. Otherwise= , the > + value is set to FALSE. The caller= can > + determine if the AP returned from= Procedure > + by evaluating this value. > + > + @retval EFI_SUCCESS In blocking mode, specified AP finish= ed before > + the timeout expires. > + @retval EFI_SUCCESS In non-blocking mode, the function ha= s been > + dispatched to specified AP. > + @retval EFI_UNSUPPORTED A non-blocking mode request was made > after the > + UEFI event EFI_EVENT_GROUP_READY_TO_B= OOT was > + signaled. > + @retval EFI_UNSUPPORTED WaitEvent is not NULL if non-blocking > mode is not > + supported. > + @retval EFI_DEVICE_ERROR The calling processor is an AP. > + @retval EFI_TIMEOUT In blocking mode, the timeout expired= before > + the specified AP has finished. > + @retval EFI_NOT_READY The specified AP is busy. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + @retval EFI_NOT_FOUND The processor with the handle specifi= ed by > + ProcessorNumber does not exist. > + @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP or > disabled AP. > + @retval EFI_INVALID_PARAMETER Procedure is NULL. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibStartupThisAP ( > + IN EFI_AP_PROCEDURE Procedure, > + IN UINTN ProcessorNumber, > + IN EFI_EVENT WaitEvent OPTIONAL, > + IN UINTN TimeoutInMicroseconds, > + IN VOID *ProcedureArgument OPTIONAL, > + OUT BOOLEAN *Finished OPTIONAL > + ) > +{ > + return EFI_INVALID_PARAMETER; > +} > + > +/** > + This service switches the requested AP to be the BSP from that point > onward. > + This service changes the BSP for all purposes. This call can only be > +performed > + by the current BSP. > + > + @param[in] ProcessorNumber The handle number of AP that is to > become the new > + BSP. The range is from 0 to the total nu= mber of > + logical processors minus 1. The total nu= mber of > + logical processors can be retrieved by > + MpInitLibGetNumberOfProcessors(). > + @param[in] EnableOldBSP If TRUE, then the old BSP will be listed= as an > + enabled AP. Otherwise, it will be disabl= ed. > + > + @retval EFI_SUCCESS BSP successfully switched. > + @retval EFI_UNSUPPORTED Switching the BSP cannot be completed > prior to > + this service returning. > + @retval EFI_UNSUPPORTED Switching the BSP is not supported. > + @retval EFI_DEVICE_ERROR The calling processor is an AP. > + @retval EFI_NOT_FOUND The processor with the handle specifi= ed by > + ProcessorNumber does not exist. > + @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the > current BSP or > + a disabled AP. > + @retval EFI_NOT_READY The specified AP is busy. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibSwitchBSP ( > + IN UINTN ProcessorNumber, > + IN BOOLEAN EnableOldBSP > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + This service lets the caller enable or disable an AP from this point = onward. > + This service may only be called from the BSP. > + > + @param[in] ProcessorNumber The handle number of AP. > + The range is from 0 to the total number = of > + logical processors minus 1. The total nu= mber of > + logical processors can be retrieved by > + MpInitLibGetNumberOfProcessors(). > + @param[in] EnableAP Specifies the new state for the processo= r for > + enabled, FALSE for disabled. > + @param[in] HealthFlag If not NULL, a pointer to a value that s= pecifies > + the new health status of the AP. This fl= ag > + corresponds to StatusFlag defined in > + EFI_MP_SERVICES_PROTOCOL.GetProcessorInf= o(). Only > + the PROCESSOR_HEALTH_STATUS_BIT is used.= All other > + bits are ignored. If it is NULL, this p= arameter > + is ignored. > + > + @retval EFI_SUCCESS The specified AP was enabled or disab= led > successfully. > + @retval EFI_UNSUPPORTED Enabling or disabling an AP cannot be > completed > + prior to this service returning. > + @retval EFI_UNSUPPORTED Enabling or disabling an AP is not > supported. > + @retval EFI_DEVICE_ERROR The calling processor is an AP. > + @retval EFI_NOT_FOUND Processor with the handle specified b= y > ProcessorNumber > + does not exist. > + @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibEnableDisableAP ( > + IN UINTN ProcessorNumber, > + IN BOOLEAN EnableAP, > + IN UINT32 *HealthFlag OPTIONAL > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + This return the handle number for the calling processor. This > +service may be > + called from the BSP and APs. > + > + @param[out] ProcessorNumber Pointer to the handle number of AP. > + The range is from 0 to the total number = of > + logical processors minus 1. The total nu= mber of > + logical processors can be retrieved by > + MpInitLibGetNumberOfProcessors(). > + > + @retval EFI_SUCCESS The current processor handle number w= as > returned > + in ProcessorNumber. > + @retval EFI_INVALID_PARAMETER ProcessorNumber is NULL. > + @retval EFI_NOT_READY MP Initialize Library is not initiali= zed. > + > +**/ > +EFI_STATUS > +EFIAPI > +MpInitLibWhoAmI ( > + OUT UINTN *ProcessorNumber > + ) > +{ > + if (ProcessorNumber =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + *ProcessorNumber =3D 0; > + return EFI_SUCCESS; > +} > diff --git a/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf > b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf > new file mode 100644 > index 0000000000..24ad29c03c > --- /dev/null > +++ b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf > @@ -0,0 +1,37 @@ > +## @file > +# MP Initialize Library instance for uniprocessor platforms. > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
# > +SPDX-License-Identifier: BSD-2-Clause-Patent # ## > + > +[Defines] > + INF_VERSION =3D 0x00010005 > + BASE_NAME =3D MpInitLibUp > + MODULE_UNI_FILE =3D MpInitLibUp.uni > + FILE_GUID =3D 70E9818C-A4F0-4061-9FA2-2DFFC7016D= 6E > + MODULE_TYPE =3D BASE > + VERSION_STRING =3D 1.1 > + LIBRARY_CLASS =3D MpInitLib > + > +# > +# The following information is for reference only and not required by t= he > build tools. > +# > +# VALID_ARCHITECTURES =3D IA32 X64 > +# > + > +[Sources] > + MpInitLibUp.c > + > +[Packages] > + MdePkg/MdePkg.dec > + UefiCpuPkg/UefiCpuPkg.dec > + > +[LibraryClasses] > + DebugLib > + LocalApicLib > + HobLib > + > +[Ppis] > + gEfiSecPlatformInformationPpiGuid ## SOMETIMES_CONSUMES > diff --git a/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.uni > b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.uni > new file mode 100644 > index 0000000000..ca1ab94379 > --- /dev/null > +++ b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.uni > @@ -0,0 +1,14 @@ > +// /** @file > +// MP Initialize Library instance for uniprocessor platforms. > +// > +// MP Initialize Library instance for uniprocessor platforms. > +// > +// Copyright (c) 2019, Intel Corporation. All rights reserved.
// > +// SPDX-License-Identifier: BSD-2-Clause-Patent // // **/ > + > +#string STR_MODULE_ABSTRACT #language en-US "MP Initialize > Library instance for uniprocessor platforms." > + > +#string STR_MODULE_DESCRIPTION #language en-US "MP Initialize > Library instance for uniprocessor platforms." > diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index > 9ed2f79648..bf690d3978 100644 > --- a/UefiCpuPkg/UefiCpuPkg.dsc > +++ b/UefiCpuPkg/UefiCpuPkg.dsc > @@ -1,7 +1,7 @@ > ## @file > # UefiCpuPkg Package > # > -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved. > +# Copyright (c) 2007 - 2019, Intel Corporation. All rights > +reserved.
> # > # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -124,6 +124,7 @@ > [Components.IA32, Components.X64] >=20 > UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf > UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf > UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf > + UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf > UefiCpuPkg/Library/MtrrLib/MtrrLib.inf > UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf > UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.i= nf > -- > 2.21.0.windows.1 >=20 >=20 >=20