From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com []) by mx.groups.io with SMTP id smtpd.web08.12337.1617343099200294881 for ; Thu, 01 Apr 2021 22:58:20 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: ray.ni@intel.com) IronPort-SDR: YxL0YhiCemVbKSseRbQEVrp9m97hKE1QeE5bO4/fB9f1cIlIq0RxMfI8yKRKBGR2P6VjytsQ9m XwmSFIx9M67g== X-IronPort-AV: E=McAfee;i="6000,8403,9941"; a="192501517" X-IronPort-AV: E=Sophos;i="5.81,298,1610438400"; d="scan'208";a="192501517" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Apr 2021 22:58:19 -0700 IronPort-SDR: yJTCLfCAeGjNMlYpoQfqDxXJEZymiBXfyDx9DMBziLEOxOoTbdN8UinJQwgn6qx7OAgLSSmbWp A9WkiuwB0Sfw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,298,1610438400"; d="scan'208";a="413029588" Received: from ray-dev.ccr.corp.intel.com ([10.239.158.87]) by fmsmga008.fm.intel.com with ESMTP; 01 Apr 2021 22:58:18 -0700 From: "Ni, Ray" To: devel@edk2.groups.io Cc: Eric Dong , Laszlo Ersek , Rahul Kumar Subject: [PATCH 1/4] UefiCpuPkg: Add MicrocodeLib for loading microcode Date: Fri, 2 Apr 2021 13:58:04 +0800 Message-Id: <20210402055807.858-2-ray.ni@intel.com> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20210402055807.858-1-ray.ni@intel.com> References: <20210402055807.858-1-ray.ni@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Signed-off-by: Ray Ni Cc: Eric Dong Cc: Laszlo Ersek Cc: Rahul Kumar --- UefiCpuPkg/Include/Library/MicrocodeLib.h | 120 +++++++ .../Library/MicrocodeLib/MicrocodeLib.c | 322 ++++++++++++++++++ .../Library/MicrocodeLib/MicrocodeLib.inf | 32 ++ UefiCpuPkg/UefiCpuPkg.dec | 5 +- UefiCpuPkg/UefiCpuPkg.dsc | 1 + 5 files changed, 479 insertions(+), 1 deletion(-) create mode 100644 UefiCpuPkg/Include/Library/MicrocodeLib.h create mode 100644 UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.c create mode 100644 UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf diff --git a/UefiCpuPkg/Include/Library/MicrocodeLib.h b/UefiCpuPkg/Include= /Library/MicrocodeLib.h new file mode 100644 index 0000000000..2570c43cce --- /dev/null +++ b/UefiCpuPkg/Include/Library/MicrocodeLib.h @@ -0,0 +1,120 @@ +/** @file=0D + Public include file for Microcode library.=0D +=0D + Copyright (c) 2021, Intel Corporation. All rights reserved.
=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#ifndef __MICROCODE_LIB_H__=0D +#define __MICROCODE_LIB_H__=0D +=0D +#include =0D +#include =0D +=0D +/**=0D + Get microcode update signature of currently loaded microcode update.=0D +=0D + @return Microcode signature.=0D +**/=0D +UINT32=0D +EFIAPI=0D +GetProcessorMicrocodeSignature (=0D + VOID=0D + );=0D +=0D +/**=0D + Get the processor signature and platform ID for current processor.=0D +=0D + @param MicrocodeCpuId Return the processor signature and platform ID.=0D +**/=0D +VOID=0D +EFIAPI=0D +GetProcessorMicrocodeCpuId (=0D + EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId=0D + );=0D +=0D +/**=0D + Return the total size of the microcode entry.=0D +=0D + Logic follows pseudo code in SDM as below:=0D +=0D + N =3D 512=0D + If (Update.DataSize !=3D 00000000H)=0D + N =3D Update.TotalSize / 4=0D +=0D + If Microcode is NULL, then ASSERT.=0D +=0D + @param Microcode Pointer to the microcode entry.=0D +=0D + @return The microcode total size.=0D +**/=0D +UINT32=0D +EFIAPI=0D +GetMicrocodeLength (=0D + IN CPU_MICROCODE_HEADER *Microcode=0D + );=0D +=0D +/**=0D + Load the microcode to the processor.=0D +=0D + If Microcode is NULL, then ASSERT.=0D +=0D + @param Microcode Pointer to the microcode entry.=0D +**/=0D +VOID=0D +EFIAPI=0D +LoadMicrocode (=0D + IN CPU_MICROCODE_HEADER *Microcode=0D + );=0D +=0D +/**=0D + Detect whether specified processor can find matching microcode patch and= load it.=0D +=0D + Microcode format is as below:=0D + +----------------------------------------+------------------------------= -------------------+=0D + | CPU_MICROCODE_HEADER | = |=0D + +----------------------------------------+ = V=0D + | Update Data | = CPU_MICROCODE_HEADER.Checksum=0D + +----------------------------------------+-------+ = ^=0D + | CPU_MICROCODE_EXTENDED_TABLE_HEADER | | = |=0D + +----------------------------------------+ V = |=0D + | CPU_MICROCODE_EXTENDED_TABLE[0] | CPU_MICROCODE_EXTENDED_TABLE= _HEADER.Checksum |=0D + | CPU_MICROCODE_EXTENDED_TABLE[1] | ^ = |=0D + | ... | | = |=0D + +----------------------------------------+-------+----------------------= -------------------+=0D +=0D + There may by multiple CPU_MICROCODE_EXTENDED_TABLE in this format.=0D + The count of CPU_MICROCODE_EXTENDED_TABLE is indicated by ExtendedSignat= ureCount=0D + of CPU_MICROCODE_EXTENDED_TABLE_HEADER structure.=0D +=0D + If Microcode is NULL, then ASSERT.=0D +=0D + @param Microcode Pointer to a microcode entry.=0D + @param MicrocodeLength The total length of the microcode entry.=0D + @param MinimumRevision The microcode whose revision <=3D MinimumRev= ision is treated as invalid.=0D + Caller can supply value get from GetProcesso= rMicrocodeSignature() to check=0D + whether the microcode is newer than loaded o= ne.=0D + Caller can supply 0 to treat any revision (e= xcept 0) microcode as valid.=0D + @param MicrocodeCpuIds Pointer to an array of processor signature a= nd platform ID that represents=0D + a set of processors.=0D + Caller can supply zero-element array to skip= the processor signature and=0D + platform ID check.=0D + @param MicrocodeCpuIdCount The number of elements in MicrocodeCpuIds.=0D + @param VerifyChecksum FALSE to skip all the checksum verifications= .=0D +=0D + @retval TRUE The microcode is valid.=0D + @retval FALSE The microcode is invalid.=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +IsValidMicrocode (=0D + IN CPU_MICROCODE_HEADER *Microcode,=0D + IN UINTN MicrocodeLength,=0D + IN UINT32 MinimumRevision,=0D + IN EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuIds,=0D + IN UINTN MicrocodeCpuIdCount,=0D + IN BOOLEAN VerifyChecksum=0D + );=0D +=0D +#endif \ No newline at end of file diff --git a/UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.c b/UefiCpuPkg/Li= brary/MicrocodeLib/MicrocodeLib.c new file mode 100644 index 0000000000..03a43fdae7 --- /dev/null +++ b/UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.c @@ -0,0 +1,322 @@ +/** @file=0D + Implementation of MicrocodeLib.=0D +=0D + Copyright (c) 2021, Intel Corporation. All rights reserved.
=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +/**=0D + Get microcode update signature of currently loaded microcode update.=0D +=0D + @return Microcode signature.=0D +**/=0D +UINT32=0D +EFIAPI=0D +GetProcessorMicrocodeSignature (=0D + VOID=0D + )=0D +{=0D + MSR_IA32_BIOS_SIGN_ID_REGISTER BiosSignIdMsr;=0D +=0D + AsmWriteMsr64 (MSR_IA32_BIOS_SIGN_ID, 0);=0D + AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, NULL);=0D + BiosSignIdMsr.Uint64 =3D AsmReadMsr64 (MSR_IA32_BIOS_SIGN_ID);=0D + return BiosSignIdMsr.Bits.MicrocodeUpdateSignature;=0D +}=0D +=0D +/**=0D + Get the processor signature and platform ID for current processor.=0D +=0D + @param MicrocodeCpuId Return the processor signature and platform ID.=0D +**/=0D +VOID=0D +EFIAPI=0D +GetProcessorMicrocodeCpuId (=0D + EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId=0D + )=0D +{=0D + MSR_IA32_PLATFORM_ID_REGISTER PlatformIdMsr;=0D +=0D + ASSERT (MicrocodeCpuId !=3D NULL);=0D +=0D + PlatformIdMsr.Uint64 =3D AsmReadMsr64 (MSR_IA32_PLATFORM_ID);=0D + MicrocodeCpuId->PlatformId =3D (UINT8) PlatformIdMsr.Bits.PlatformId;=0D + AsmCpuid (CPUID_VERSION_INFO, &MicrocodeCpuId->ProcessorSignature, NULL,= NULL, NULL);=0D +}=0D +=0D +/**=0D + Return the total size of the microcode entry.=0D +=0D + Logic follows pseudo code in SDM as below:=0D +=0D + N =3D 512=0D + If (Update.DataSize !=3D 00000000H)=0D + N =3D Update.TotalSize / 4=0D +=0D + If Microcode is NULL, then ASSERT.=0D +=0D + @param Microcode Pointer to the microcode entry.=0D +=0D + @return The microcode total size.=0D +**/=0D +UINT32=0D +EFIAPI=0D +GetMicrocodeLength (=0D + IN CPU_MICROCODE_HEADER *Microcode=0D + )=0D +{=0D + UINT32 TotalSize;=0D +=0D + ASSERT (Microcode !=3D NULL);=0D +=0D + TotalSize =3D 2048;=0D + if (Microcode->DataSize !=3D 0) {=0D + TotalSize =3D Microcode->TotalSize;=0D + }=0D + return TotalSize;=0D +}=0D +=0D +/**=0D + Load the microcode to the processor.=0D +=0D + If Microcode is NULL, then ASSERT.=0D +=0D + @param Microcode Pointer to the microcode entry.=0D +**/=0D +VOID=0D +EFIAPI=0D +LoadMicrocode (=0D + IN CPU_MICROCODE_HEADER *Microcode=0D + )=0D +{=0D + ASSERT (Microcode !=3D NULL);=0D +=0D + AsmWriteMsr64 (MSR_IA32_BIOS_UPDT_TRIG, (UINT64) (UINTN) (Microcode + 1)= );=0D +}=0D +=0D +/**=0D + Determine if a microcode patch matchs the specific processor signature a= nd flag.=0D +=0D + @param[in] ProcessorSignature The processor signature field value in= a=0D + microcode patch.=0D + @param[in] ProcessorFlags The processor flags field value in a=0D + microcode patch.=0D + @param[in] MicrocodeCpuId A pointer to an array of EDKII_PEI_MIC= ROCODE_CPU_ID=0D + structures.=0D + @param[in] MicrocodeCpuIdCount Number of elements in MicrocodeCpuId a= rray.=0D +=0D + @retval TRUE The specified microcode patch matches to one of the Mic= rocodeCpuId.=0D + @retval FALSE The specified microcode patch doesn't match to any of t= he MicrocodeCpuId.=0D +**/=0D +BOOLEAN=0D +IsProcessorMatchedMicrocode (=0D + IN UINT32 ProcessorSignature,=0D + IN UINT32 ProcessorFlags,=0D + IN EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId,=0D + IN UINTN MicrocodeCpuIdCount=0D + )=0D +{=0D + UINTN Index;=0D +=0D + if (MicrocodeCpuIdCount =3D=3D 0) {=0D + return TRUE;=0D + }=0D +=0D + for (Index =3D 0; Index < MicrocodeCpuIdCount; Index++) {=0D + if ((ProcessorSignature =3D=3D MicrocodeCpuId[Index].ProcessorSignatur= e) &&=0D + (ProcessorFlags & (1 << MicrocodeCpuId[Index].PlatformId)) !=3D 0)= {=0D + return TRUE;=0D + }=0D + }=0D +=0D + return FALSE;=0D +}=0D +=0D +/**=0D + Detect whether specified processor can find matching microcode patch and= load it.=0D +=0D + Microcode format is as below:=0D + +----------------------------------------+------------------------------= -------------------+=0D + | CPU_MICROCODE_HEADER | = |=0D + +----------------------------------------+ = V=0D + | Update Data | = CPU_MICROCODE_HEADER.Checksum=0D + +----------------------------------------+-------+ = ^=0D + | CPU_MICROCODE_EXTENDED_TABLE_HEADER | | = |=0D + +----------------------------------------+ V = |=0D + | CPU_MICROCODE_EXTENDED_TABLE[0] | CPU_MICROCODE_EXTENDED_TABLE= _HEADER.Checksum |=0D + | CPU_MICROCODE_EXTENDED_TABLE[1] | ^ = |=0D + | ... | | = |=0D + +----------------------------------------+-------+----------------------= -------------------+=0D +=0D + There may by multiple CPU_MICROCODE_EXTENDED_TABLE in this format.=0D + The count of CPU_MICROCODE_EXTENDED_TABLE is indicated by ExtendedSignat= ureCount=0D + of CPU_MICROCODE_EXTENDED_TABLE_HEADER structure.=0D +=0D + If Microcode is NULL, then ASSERT.=0D +=0D + @param Microcode Pointer to a microcode entry.=0D + @param MicrocodeLength The total length of the microcode entry.=0D + @param MinimumRevision The microcode whose revision <=3D MinimumRev= ision is treated as invalid.=0D + Caller can supply value get from GetProcesso= rMicrocodeSignature() to check=0D + whether the microcode is newer than loaded o= ne.=0D + Caller can supply 0 to treat any revision (e= xcept 0) microcode as valid.=0D + @param MicrocodeCpuIds Pointer to an array of processor signature a= nd platform ID that represents=0D + a set of processors.=0D + Caller can supply zero-element array to skip= the processor signature and=0D + platform ID check.=0D + @param MicrocodeCpuIdCount The number of elements in MicrocodeCpuIds.=0D + @param VerifyChecksum FALSE to skip all the checksum verifications= .=0D +=0D + @retval TRUE The microcode is valid.=0D + @retval FALSE The microcode is invalid.=0D +**/=0D +BOOLEAN=0D +EFIAPI=0D +IsValidMicrocode (=0D + IN CPU_MICROCODE_HEADER *Microcode,=0D + IN UINTN MicrocodeLength,=0D + IN UINT32 MinimumRevision,=0D + IN EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuIds,=0D + IN UINTN MicrocodeCpuIdCount,=0D + IN BOOLEAN VerifyChecksum=0D + )=0D +{=0D + UINTN Index;=0D + UINT32 DataSize;=0D + UINT32 TotalSize;=0D + CPU_MICROCODE_EXTENDED_TABLE *ExtendedTable;=0D + CPU_MICROCODE_EXTENDED_TABLE_HEADER *ExtendedTableHeader;=0D + UINT32 ExtendedTableLength;=0D + UINT32 Sum32;=0D + BOOLEAN Match;=0D +=0D + ASSERT (Microcode !=3D NULL);=0D +=0D + //=0D + // It's invalid when:=0D + // the input microcode buffer is so small that even cannot contain the= header.=0D + // the input microcode buffer is so large that exceeds MAX_ADDRESS.=0D + //=0D + if ((MicrocodeLength < sizeof (CPU_MICROCODE_HEADER)) || (MicrocodeLengt= h > (MAX_ADDRESS - (UINTN) Microcode))) {=0D + return FALSE;=0D + }=0D +=0D + //=0D + // Per SDM, HeaderVersion and LoaderRevision should both be 1.=0D + //=0D + if ((Microcode->HeaderVersion !=3D 1) || (Microcode->LoaderRevision !=3D= 1)) {=0D + return FALSE;=0D + }=0D +=0D + //=0D + // The microcode revision should be larger than the minimum revision.=0D + //=0D + if (Microcode->UpdateRevision <=3D MinimumRevision) {=0D + return FALSE;=0D + }=0D +=0D + DataSize =3D Microcode->DataSize;=0D + if (DataSize =3D=3D 0) {=0D + DataSize =3D 2000;=0D + }=0D +=0D + //=0D + // Per SDM, DataSize should be multiple of DWORDs.=0D + //=0D + if ((DataSize % 4) !=3D 0) {=0D + return FALSE;=0D + }=0D +=0D + TotalSize =3D GetMicrocodeLength (Microcode);=0D +=0D + //=0D + // Check whether the whole microcode is within the buffer.=0D + // TotalSize should be multiple of 1024.=0D + //=0D + if (((TotalSize % SIZE_1KB) !=3D 0) || (TotalSize > MicrocodeLength)) {= =0D + return FALSE;=0D + }=0D +=0D + //=0D + // The summation of all DWORDs in microcode should be zero.=0D + //=0D + if (VerifyChecksum && (CalculateSum32 ((UINT32 *) Microcode, TotalSize) = !=3D 0)) {=0D + return FALSE;=0D + }=0D +=0D + Sum32 =3D Microcode->ProcessorSignature.Uint32 + Microcode->ProcessorFla= gs + Microcode->Checksum;=0D +=0D + //=0D + // Check the processor signature and platform ID in the primary header.= =0D + //=0D + Match =3D IsProcessorMatchedMicrocode (=0D + Microcode->ProcessorSignature.Uint32,=0D + Microcode->ProcessorFlags,=0D + MicrocodeCpuIds,=0D + MicrocodeCpuIdCount=0D + );=0D + if (Match) {=0D + return TRUE;=0D + }=0D +=0D + ExtendedTableLength =3D TotalSize - (DataSize + sizeof (CPU_MICROCODE_HE= ADER));=0D + if ((ExtendedTableLength < sizeof (CPU_MICROCODE_EXTENDED_TABLE_HEADER))= || ((ExtendedTableLength % 4) !=3D 0)) {=0D + return FALSE;=0D + }=0D + //=0D + // Extended Table exist, check if the CPU in support list=0D + //=0D + ExtendedTableHeader =3D (CPU_MICROCODE_EXTENDED_TABLE_HEADER *) ((UINTN)= (Microcode + 1) + DataSize);=0D + if (ExtendedTableHeader->ExtendedSignatureCount > MAX_UINT32 / sizeof (C= PU_MICROCODE_EXTENDED_TABLE)) {=0D + return FALSE;=0D + }=0D + if (ExtendedTableHeader->ExtendedSignatureCount * sizeof (CPU_MICROCODE_= EXTENDED_TABLE)=0D + > ExtendedTableLength - sizeof (CPU_MICROCODE_EXTENDED_TABLE_HEADER)= ) {=0D + return FALSE;=0D + }=0D + //=0D + // Check the extended table checksum=0D + //=0D + if (VerifyChecksum && (CalculateSum32 ((UINT32 *) ExtendedTableHeader, E= xtendedTableLength) !=3D 0)) {=0D + return FALSE;=0D + }=0D +=0D + ExtendedTable =3D (CPU_MICROCODE_EXTENDED_TABLE *) (ExtendedTableHeader = + 1);=0D + for (Index =3D 0; Index < ExtendedTableHeader->ExtendedSignatureCount; I= ndex ++) {=0D + if (VerifyChecksum &&=0D + (ExtendedTable[Index].ProcessorSignature.Uint32 + ExtendedTable[In= dex].ProcessorFlag=0D + + ExtendedTable[Index].Checksum !=3D Sum32)) {=0D + //=0D + // The extended table entry is valid when the summation of Processor= Signature, Processor Flags=0D + // and Checksum equal to the coresponding summation from primary hea= der. Because:=0D + // CalculateSum32 (Header + Update Binary) =3D=3D 0=0D + // CalculateSum32 (Header + Update Binary)=0D + // - (Header.ProcessorSignature + Header.ProcessorFlag + Head= er.Checksum)=0D + // + (Extended.ProcessorSignature + Extended.ProcessorFlag + = Extended.Checksum) =3D=3D 0=0D + // So,=0D + // (Header.ProcessorSignature + Header.ProcessorFlag + Header.Che= cksum)=0D + // =3D=3D (Extended.ProcessorSignature + Extended.ProcessorFlag = + Extended.Checksum)=0D + //=0D + continue;=0D + }=0D + Match =3D IsProcessorMatchedMicrocode (=0D + ExtendedTable[Index].ProcessorSignature.Uint32,=0D + ExtendedTable[Index].ProcessorFlag,=0D + MicrocodeCpuIds,=0D + MicrocodeCpuIdCount=0D + );=0D + if (Match) {=0D + return TRUE;=0D + }=0D + }=0D + return FALSE;=0D +}=0D diff --git a/UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf b/UefiCpuPkg/= Library/MicrocodeLib/MicrocodeLib.inf new file mode 100644 index 0000000000..c6f8f52e95 --- /dev/null +++ b/UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf @@ -0,0 +1,32 @@ +## @file=0D +# Library for microcode verification and load.=0D +#=0D +# Copyright (c) 2021, Intel Corporation. All rights reserved.
=0D +#=0D +# SPDX-License-Identifier: BSD-2-Clause-Patent=0D +#=0D +#=0D +##=0D +=0D +[Defines]=0D + INF_VERSION =3D 0x00010006=0D + BASE_NAME =3D MicrocodeLib=0D + FILE_GUID =3D EB8C72BC-8A48-4F80-996B-E52F68416D57= =0D + MODULE_TYPE =3D BASE=0D + VERSION_STRING =3D 1.0=0D + LIBRARY_CLASS =3D MicrocodeLib=0D +=0D +#=0D +# VALID_ARCHITECTURES =3D IA32 X64 EBC=0D +#=0D +=0D +[Sources.common]=0D + MicrocodeLib.c=0D +=0D +[Packages]=0D + MdePkg/MdePkg.dec=0D + UefiCpuPkg/UefiCpuPkg.dec=0D +=0D +[LibraryClasses]=0D + BaseLib=0D + DebugLib=0D diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index a639ce5412..62acb291f3 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -1,7 +1,7 @@ ## @file UefiCpuPkg.dec=0D # This Package provides UEFI compatible CPU modules and libraries.=0D #=0D -# Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved.
=0D +# Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.
=0D #=0D # SPDX-License-Identifier: BSD-2-Clause-Patent=0D #=0D @@ -59,6 +59,9 @@ [LibraryClasses.IA32, LibraryClasses.X64] ## @libraryclass Provides function to get CPU cache information.=0D CpuCacheInfoLib|Include/Library/CpuCacheInfoLib.h=0D =0D + ## @libraryclass Provides function for loading microcode.=0D + MicrocodeLib|Include/Library/MicrocodeLib.h=0D +=0D [Guids]=0D gUefiCpuPkgTokenSpaceGuid =3D { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa,= 0xb8, 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }}=0D gMsegSmramGuid =3D { 0x5802bce4, 0xeeee, 0x4e33, { 0xa1,= 0x30, 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }}=0D diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 98c4c53465..b932cf63ec 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -60,6 +60,7 @@ [LibraryClasses] PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeC= offExtraActionLibNull.inf=0D TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurem= entLibNull.inf=0D VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf=0D + MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf=0D =0D [LibraryClasses.common.SEC]=0D PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.= inf=0D --=20 2.27.0.windows.1