On 03/15/17 16:54, Andrew Fish wrote: > >> On Mar 15, 2017, at 8:38 AM, Laszlo Ersek <[email protected] >> <mailto:[email protected]>> wrote: >> >> On 03/15/17 16:13, Andrew Fish wrote: >>> >>>> On Mar 15, 2017, at 8:07 AM, Laszlo Ersek <[email protected] >>>> <mailto:[email protected]>> wrote: >>>> >>>> On 03/15/17 13:23, Michael Zimmermann wrote: >>>>> I'm trying to add another FV section FVMAIN_COMPACT so I can keep >>>>> Platform specific drivers in a separate, included fdf. >>>>> >>>>> I did this: >>>>> FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { >>>>> SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF >>>>> PROCESSING_REQUIRED = TRUE { >>>>> SECTION FV_IMAGE = FVMAIN >>>>> SECTION FV_IMAGE = FVMAINPLATFORM >>>>> } >>>>> } >>>>> >>>>> The image builds file and using uefitool I can verify that the new FV >>>>> is inside the compressed section. >>>>> But none of the drivers gets discovered/loaded and I get 'Protocol not >>>>> present!!' errors. >>>> >>>> The FVs need to be exposed to the DXE core via FV HOBs. See >>>> - 9.8.5 "Firmware Volume HOBs" in Volume 2 of the Platform Init 1.5 >>>> spec, >>>> - and more importantly, 5.7 "Firmware Volume HOB" in Volume 3 of the >>>> same. >>>> >>>> You can use the BuildFvHob() function for this. >>>> >>>> If the firmware volume contains PEIMs (... as well), then it has to be >>>> exposed to the PEI core too, I think. I think the >>>> PeiServicesInstallFvInfoPpi() function can be used for that. (See 3.3 >>>> "PEI" in Volume 3 of the PI spec.) >>>> >>>> ... I used the PeiFvInitialization() function in >>>> OvmfPkg/PlatformPei/Fv.c as a "cheat sheet" for the above. >>>> >>> >>> Laszlo, >>> >>> I think this case is an FV that is compressed and nested in another >>> FV that is discovered. I think the issues is multiple FV Sections in >>> an FV file are not currently supported. >> >> In OVMF we do the same: >> >> FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { >> SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF >> PROCESSING_REQUIRED = TRUE { >> # >> # These firmware volumes will have files placed in them uncompressed, >> # and then both firmware volumes will be compressed in a single >> # compression operation in order to achieve better overall >> compression. >> # >> SECTION FV_IMAGE = PEIFV >> SECTION FV_IMAGE = DXEFV >> } >> } >> >> "OvmfPkg/Sec/SecMain.c" decompresses the compressed FFS file into >> memory -- which is special to OVMF, i.e. the fact that there is >> writeable memory in SEC --, then jumps to the PEI entry point. >> PlatformPei then exposes DXEFV to the PEI core (for loading the DXE >> core AIUI) and to the DXE core as well (for loading DXE modules). >> >> The multiple FV sections in the FFS file are not discovered >> automatically. First, the OVMF build process saves the final (= >> decompressed) in-memory locations of the nested FVs into PCDs. Second, >> in DecompressMemFvs(), the SEC module decompresses the outer, >> compressed, FFS file, then locates the embedded FVs manually with >> FindFfsSectionInstance(), then moves the decompressed FVs individually >> to their pre-recorded locations. >> >> In Michael's case, I think the same should be possible -- since FVMAIN >> is running for him, the outer, compressed file must already be >> decompressed (in full) to some temporary buffer in memory. If he can >> find, manually, the second section (with the embedded FVMAINPLATFORM >> firmware volume in it) in that area, then he can also expose it to the >> DXE core, I believe. >> > > Laszlo, > > The DXE Core will dispatch FVs with Depex "automagically" but only one > FV_IMAGE Section per FV_IMAGE file. > > So one workaround would be to add a 2nd FV_IMAGE file that contains the > 2nd FV in the 1st FV_IMAGE Section. > > Also I'm not sure if the outer FV is compressed, but compressing > compressed data usually does not end well as the algorithms leverage > entropy.
I apologize if my previous emails were confusing; I didn't mean to imply nested compression. OVMF doesn't do that. > It is better to just compress the outer FV and have everything > else uncompressed and let it all get compressed together. Yes, that's what OVMF does. Did you perhaps misread the comment above that I quoted from the FDF? "These firmware volumes will have files placed in them *uncompressed*, and then both firmware volumes will be compressed in a single compression operation in order to achieve better overall compression." (Emphasis mine.) Thanks! Laszlo > This also > helps as there will be common dictionary entries so compressing as much > data as possible in one shot usually works better. So for example if the > outer FV is compressed it may have a dictionary entry that represents > CopyMem, and it can represent that pattern with a small number of bits. > Doing compression multiple times causes duplication as each compressed > image has one copy of CopyMem (massive over simplification). Also if you > compress a nested FV then the CopyMem pattern does not exist in the > compressed data, and since the compressed data is more random it is hard > to find patterns to compress, so it hurts the compression of the outer FV. > > Thanks, > > Andrew Fish > >> Thanks >> Laszlo >> _______________________________________________ >> edk2-devel mailing list >> [email protected] <mailto:[email protected]> >> https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

