Hi ChenChen Thanks! Do you think we also need fix IntelSiliconPkg\Feature\Capsule\MicrocodeUpdateDxe?
Thank you Yao Jiewen > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > Chen A Chen > Sent: Monday, February 18, 2019 1:54 PM > To: edk2-devel@lists.01.org > Cc: Dong, Eric <eric.d...@intel.com> > Subject: [edk2] [PATCH] UefiCpuPkg/Microcode: Fix incorrect checksum > issue for extended table > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1020 > > The following Microcode payload format is define in SDM spec. > Payload: > |MicrocodeHeader|MicrocodeBinary|ExtendedHeader|ExtendedTable|. > When we verify the CheckSum32 with ExtendedTable, we should use the > fields > of ExtendedTable to replace corresponding fields in MicrocodeHeader, > and then calculate the CheckSum32 with > MicrocodeHeader+MicrocodeBinary. > This patch already verified on ICL platform. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Chen A Chen <chen.a.c...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Eric Dong <eric.d...@intel.com> > --- > UefiCpuPkg/Library/MpInitLib/Microcode.c | 38 > ++++++++++++++++++++++++-------- > 1 file changed, 29 insertions(+), 9 deletions(-) > > diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c > b/UefiCpuPkg/Library/MpInitLib/Microcode.c > index d84344c6f5..38880cdbec 100644 > --- a/UefiCpuPkg/Library/MpInitLib/Microcode.c > +++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c > @@ -57,6 +57,7 @@ MicrocodeDetect ( > UINT32 LatestRevision; > UINTN TotalSize; > UINT32 CheckSum32; > + UINT32 > InCompleteCheckSum32; > BOOLEAN CorrectMicrocode; > VOID *MicrocodeData; > MSR_IA32_PLATFORM_ID_REGISTER PlatformIdMsr; > @@ -121,6 +122,26 @@ MicrocodeDetect ( > MicrocodeData = NULL; > MicrocodeEnd = (UINTN) (CpuMpData->MicrocodePatchAddress + > CpuMpData->MicrocodePatchRegionSize); > MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (UINTN) > CpuMpData->MicrocodePatchAddress; > + > + // > + // To avoid double calculate checksum32 value. > + // Save the CheckSum32 of the common parts in advance. > + // > + if (MicrocodeEntryPoint->DataSize == 0) { > + InCompleteCheckSum32 = CalculateSum32 ( > + (UINT32 *) MicrocodeEntryPoint, > + sizeof (CPU_MICROCODE_HEADER) + > 2000 > + ); > + } else { > + InCompleteCheckSum32 = CalculateSum32 ( > + (UINT32 *) MicrocodeEntryPoint, > + sizeof (CPU_MICROCODE_HEADER) + > MicrocodeEntryPoint->DataSize > + ); > + } > + InCompleteCheckSum32 -= > MicrocodeEntryPoint->ProcessorSignature.Uint32; > + InCompleteCheckSum32 -= MicrocodeEntryPoint->ProcessorFlags; > + InCompleteCheckSum32 -= MicrocodeEntryPoint->Checksum; > + > do { > // > // Check if the microcode is for the Cpu and the version is newer > @@ -137,14 +158,10 @@ MicrocodeDetect ( > MicrocodeEntryPoint->UpdateRevision > LatestRevision && > (MicrocodeEntryPoint->ProcessorFlags & (1 << PlatformId)) > ) { > - if (MicrocodeEntryPoint->DataSize == 0) { > - CheckSum32 = CalculateSum32 ((UINT32 *) > MicrocodeEntryPoint, 2048); > - } else { > - CheckSum32 = CalculateSum32 ( > - (UINT32 *) MicrocodeEntryPoint, > - MicrocodeEntryPoint->DataSize + sizeof > (CPU_MICROCODE_HEADER) > - ); > - } > + CheckSum32 = InCompleteCheckSum32; > + CheckSum32 += > MicrocodeEntryPoint->ProcessorSignature.Uint32; > + CheckSum32 += MicrocodeEntryPoint->ProcessorFlags; > + CheckSum32 += MicrocodeEntryPoint->Checksum; > if (CheckSum32 == 0) { > CorrectMicrocode = TRUE; > ProcessorFlags = MicrocodeEntryPoint->ProcessorFlags; > @@ -171,7 +188,10 @@ MicrocodeDetect ( > ExtendedTableCount = > ExtendedTableHeader->ExtendedSignatureCount; > ExtendedTable = > (CPU_MICROCODE_EXTENDED_TABLE *) (ExtendedTableHeader + 1); > for (Index = 0; Index < ExtendedTableCount; Index ++) { > - CheckSum32 = CalculateSum32 ((UINT32 *) > ExtendedTable, sizeof(CPU_MICROCODE_EXTENDED_TABLE)); > + CheckSum32 = InCompleteCheckSum32; > + CheckSum32 += > ExtendedTable->ProcessorSignature.Uint32; > + CheckSum32 += ExtendedTable->ProcessorFlag; > + CheckSum32 += ExtendedTable->Checksum; > if (CheckSum32 == 0) { > // > // Verify Header > -- > 2.16.2.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel