On Wednesday, March 20, 2024 6:05 PM Gerd Hoffmann wrote:
> 
> We don't need to read + cache all fw_cfg data.  We only need to cache the
> entries which (a) must be measured, and (b) will not be measured in some
> other way.
> 
I am afraid that it is difficult to determine which fw_cfg items 
are need to be cached and measured, since there are some fw_cfg items are
optional with special qemu cmd.
Example : 
fw_cfg item: opt/ovmf/X-PciMmio64Mb  
depends on qemu command: "-fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=N"

> The big entries I'm aware of are:
>  (1) kernel for direct boot (no fw_cfg measurement needed, binary
>      will be measured before launch).
>  (2) ACPI tables (no fw_cfg measurement needed, acpi tables are
>      measured when installed).
>  (3) smbios tables (to be decided, could be handled similar to ACPI).
> 
> Anything else where you have size concerns?
So far I don't find other big entries.

> 
> > Further more this is not a lazy mode which means some fw_cfg data may
> > be read but it is not to be consumed later.
> 
> The problem with lazy mode is that the measurement order is not fixed.
We'd better define what's the "fixed measurement order".
Think about such scenario:
There are 5 fw_cfg items ("A-B-C-D-E"), and C is an optional one which depends 
on special qemu cmd
 (example : etc/boot-menu-wait depends on qemu command: " -boot 
menu=on,splash-time=N").
        
So, there are two measurement orders in different qemu command:
1, "A-B-C-D-E" (with qemu command "-boot menu=on,splash-time=N ")
2, "A-B-D-E" (without qemu command "-boot menu=on,splash-time=N ") 

Is the "A-B-C-D-E" or "A-B-D-E"  fixed order ? 

What's your thoughts ?

> 
> > We propose below solution :
> >
> > Add a new API in QemuFwCfgLib,
> > RETURN_STATUS QemuFwCfgGetData(fw_cfg_name, *size, *value,
> FW_CFG_GET_DATA_FLAG flag).
> 
> I'd suggest to *not* touch the existing interfaces for reading entries.
> Instead change the existing functions to first check the cache, in case there 
> is
> no cache entry go read from fw_cfg.
Actually we don't touch the existing interface for reading entries.
The API is newly added.

>
> Add a new interface for adding fw_cfg entries to the cache, with optional
> measurement.
Do you mean to add a new API (example : QemuFwCfgReadBytes2(*size, *buffer, 
Flag))
 with optional measurement to cache fw_cfg data?

> 
> >  And it can reduce the code complexity because it pack 3 fw_cfg call
> > (QemuFwCfgFindFile/QemuFwCfgSelectItem/QemuFwCfgReadBytes) into one
> call.
> 
> There are a few places in the code which expect they can read fw_cfg files in
> multiple chunks (i.e. call QemuFwCfgReadBytes multiple times).
> 
Actually we can handle the case with the new API.
For example, etc/e820 is read in chunks. 
Current code like below:
  QemuFwCfgSelectItem (FwCfgItem);
  for (Processed = 0; Processed < FwCfgSize; Processed += sizeof E820Entry) {
    QemuFwCfgReadBytes (sizeof E820Entry, &E820Entry);
    Callback (&E820Entry, PlatformInfoHob);
  }

We can update it like below:
  QemuFwCfgGetData("etc/e820", &FwCfgSize,  Buffer, Flag);
  for (Processed = 0; Processed < FwCfgSize; Processed += sizeof E820Entry) { 
    EFI_E820_ENTRY64 *E820Entry = (EFI_E820_ENTRY64 *)(Buffer + Processed);
    Callback (E820Entry, PlatformInfoHob);
  }

> Also note that not all fw_cfg entries are (pseudo-)files.
I am not sure what you mean about (pseudo-)files.

Could you give some instructions?

Base on your comments,  does this mean there are other fw_cfg data 
which are read from QEMU via different method (not 
QemuFwCfgFindFile/QemuFwCfgSelectItem/QemuFwCfgReadBytes) ?

If it is the case, could you please give an example? 

Thanks 
Ceping


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116950): https://edk2.groups.io/g/devel/message/116950
Mute This Topic: https://groups.io/mt/104880546/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to