On 01/08/20 11:58, Fu, Siyuan wrote: > Hi, Laszlo > >> -----Original Message----- >> From: Laszlo Ersek <ler...@redhat.com> >> Sent: 2020年1月8日 17:43 >> To: Fu, Siyuan <siyuan...@intel.com>; devel@edk2.groups.io >> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Gao, Liming >> <liming....@intel.com>; Dong, Eric <eric.d...@intel.com>; Ni, Ray >> <ray...@intel.com>; Tom Lendacky <thomas.lenda...@amd.com> >> Subject: Re: [Patch 0/2] Shadow microcode patch according to FIT microcode >> table. >> >> (+Tom) >> >> On 01/08/20 05:25, Siyuan Fu wrote: >>> The existing MpInitLib will shadow the microcode update patches from >>> flash to memory and this is done by searching microcode region >>> specified by PCD PcdCpuMicrocodePatchAddress and >>> PcdCpuMicrocodePatchRegionSize. >>> This brings a limition to platform FW that all the microcode patches >>> must be placed in one continuous flash space. >>> >>> This patch set shadows microcode update according to FIT microcode >>> entries if it's present, otherwise it will fallback to original logic >>> (by PCD). >>> >>> Patch 1/2: Add FIT header file to MdePkg. >>> Patch 2/2: Update microcode loader to shadow microcode according to FIT. >>> >>> Cc: Michael D Kinney <michael.d.kin...@intel.com> >>> Cc: Liming Gao <liming....@intel.com> >>> Cc: Eric Dong <eric.d...@intel.com> >>> Cc: Ray Ni <ray...@intel.com> >>> Cc: Laszlo Ersek <ler...@redhat.com> >>> >>> Siyuan Fu (2): >>> MdePkg: Add header file for Firmware Interface Table specification. >>> UefiCpuPkg: Shadow microcode patch according to FIT microcode entry. >>> >>> .../IndustryStandard/FirmwareInterfaceTable.h | 76 ++++++ >>> UefiCpuPkg/Library/MpInitLib/Microcode.c | 255 +++++++++++++----- >>> UefiCpuPkg/Library/MpInitLib/MpLib.c | 4 +- >>> UefiCpuPkg/Library/MpInitLib/MpLib.h | 7 +- >>> 4 files changed, 276 insertions(+), 66 deletions(-) >>> create mode 100644 >> MdePkg/Include/IndustryStandard/FirmwareInterfaceTable.h >>> >> >> I have now checked >> >> >> https://www.intel.com/content/dam/www/public/us/en/documents/guides >> /fit-bios-specification.pdf >> >> that is referenced in >> >> https://tianocore.acgmultimedia.com/show_bug.cgi?id=2449#c0 >> >> I think it is wrong for MpInitLib to deduce anything from the flash >> contents at fixed physical address 0xFFFFFFC0 *unless* the platform >> advertizes up-front adherence to the FIT specification. >> >> The proposed logic in patch#2 goes like this: >> >> (1) read the UINT64 at physical address 0xFFFFFFC0 >> >> (2) If the value read is zero, all-nibles-F, or all-nibbles-E, then >> assume "no FIT" >> >> (3) otherwise, dereference the value read, as a >> pointer-to-FIRMWARE_INTERFACE_TABLE_ENTRY >> >> (4) if the assumed FIRMWARE_INTERFACE_TABLE_ENTRY doesn't look right, >> assume "no FIT" >> >> (5) if "no FIT", then fall back to previous PCDs (which describe if >> there is a microcode update in the flash, and if so, where) >> >> This approach is wrong. If a platform has never heard of the FIT >> specification, it may have any value at all at address 0xFFFFFFC0. The >> value there may easily differ from the three values that step (2) >> equates to "no FIT". >> >> Therefore the whole procedure above needs to be gated with a new >> FeaturePCD (default value FALSE). >> >> >> This is not a theoretical risk. Please see the following patches: >> >> * [edk2-devel] [RFC PATCH v3 36/43] UefiCpuPkg: Allow AP booting under >> SEV-ES >> https://edk2.groups.io/g/devel/message/50976 >> http://mid.mail- >> archive.com/ddc10e014822c9a87a7dc9a44ee854751ffcf442.1574280425.git. >> thomas.lenda...@amd.com >> >> * [edk2-devel] [RFC PATCH v3 37/43] OvmfPkg: Reserve a page in memory for >> the SEV-ES AP reset vector >> https://edk2.groups.io/g/devel/message/50977 >> http://mid.mail- >> archive.com/706f17aa0ea3ed3f57c1e933e93164a94ba1a0cf.1574280425.git. >> thomas.lenda...@amd.com >> >> Those patches describe a structure whose *last* field, and EFI_GUID, is >> placed ath 0xffffffd0. This structure is extensible, and new fields are >> supposed to be *prepended* to it. The currently defined first field >> starts at 0xffffffca. Whereas the (exclusive) end of the FIT pointer is >> at 0xffffffc8. This means there is a 2 (two) bytes gap between them. If >> more than two bytes are prepended to the extensible structure in the >> future, that may easily lead step (2) above to incorrectly determine >> "yes FIT". >> >> So please introduce a new FeaturePCD in MdePkg (or even a dynamic >> boolean PCD, if you think that's more flexible), and add logic similar >> to: > > I think a Feature PCD should be enough for this since whether using > the FIT based booting flow is decided by platform owner and not expected > to be changed once decided. > > And considering that the FIT table is very critical to processor init flow, > I propose to add a DEBUG ASSERT if the Feature PCD is true, but couldn't > find a valid FIT table structure. This could reminder platform developer > that the FIT address may have been incorrectly override by someone else, > like the extensible structure as you mentioned above. > > So the checking in ShadowMicrocodePatchByFit() should be as follows: > > if (!FeaturePcdGet (PcdFirmwareInterfaceTableSupported)) { > return EFI_UNSUPPORTED; > } > > if (FIRMWARE_INTERFACE_TABLE_ENTRY doesn't look right) { > ASSERT(FALSE); > } > > What's your opinion on this?
Works fine for me. Thanks! Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#53013): https://edk2.groups.io/g/devel/message/53013 Mute This Topic: https://groups.io/mt/69521538/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-