> On Mar 15, 2017, at 7:29 PM, Gao, Liming <liming....@intel.com> wrote:
> 
> Michael:
>  I agree this is an issue in PeiCore and DxeCore, because PI spec has no 
> limitation to nest FV number. Could you help submit one tracker in bugzillar? 
> We will fix it. 
> 

Liming,

Thanks for double checking the spec, I did not have time to do that today.

Thanks,

Andrew Fish

> Thanks
> Liming
>> -----Original Message-----
>> From: Michael Zimmermann [mailto:sigmaepsilo...@gmail.com]
>> Sent: Thursday, March 16, 2017 12:08 AM
>> To: Andrew Fish <af...@apple.com>
>> Cc: Laszlo Ersek <ler...@redhat.com>; Tian, Feng <feng.t...@intel.com>; Gao, 
>> Liming <liming....@intel.com>;
>> edk2-devel@lists.01.org <edk2-de...@ml01.01.org>; Zeng, Star 
>> <star.z...@intel.com>
>> Subject: Re: [edk2] how to load drivers from additional FV's?
>> 
>> Andrew, using a fallback with 1 as the fourth argument didn't seem to work.
>> 
>>> So one workaround would be to add a 2nd FV_IMAGE file that contains the 2nd 
>>> FV in the 1st FV_IMAGE Section.
>> I've actually tried that before and it didn't seem to work. BUt after
>> what you've said I tried using a uncompressed, nested FV like
>> this(inside [FV.FvMain]):
>> 
>> FILE FV_IMAGE = B67596E9-EA27-40E4-885C-5AE83D414BD4 {
>>  SECTION FV_IMAGE = FVMAINPLATFORM
>> }
>> 
>> And that actually worked! So is this a workaround or a clean solution?
>> 
>> Thanks a lot
>> Michael
>> 
>> 
>> On Wed, Mar 15, 2017 at 4:54 PM, Andrew Fish <af...@apple.com> wrote:
>>> 
>>> On Mar 15, 2017, at 8:38 AM, Laszlo Ersek <ler...@redhat.com> wrote:
>>> 
>>> On 03/15/17 16:13, Andrew Fish wrote:
>>> 
>>> 
>>> On Mar 15, 2017, at 8:07 AM, Laszlo Ersek <ler...@redhat.com> 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. It is
>>> better to just compress the outer FV and have everything else uncompressed
>>> and let it all get compressed together. 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
>>> 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

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to