Hi,
The problem is that currently, Platform Init needs to have hardcoded logic to load the entire .FIT file to where the entrypoint image points. See below:
FDT dump of UPL FIT:
images {
tianocore {
description = "Uefi Universal Payload";
project = "tianocore";
arch = "x86";
type = "flat-binary";
producer = "intel";
data-offset = <0x00001000>;
data-size = <0x00016000>;
reloc-start = <0x00012000>;
entry-start = <0x00000000 0x00807c98>;
load = <0x00000000 0x00800000>;
};
// more images here
};
UefiPayloadPkg/UniversalPayloadBuild.py:
RunCommand (
"GenFw --rebase 0x{:02X} -o {} {} ".format (
fit_image_info_header.LoadAddr + fit_image_info_header.DataOffset,
TargetRebaseFile,
TargetRebaseFile,
))
So, the entrypoint is supposed to be located 0x800000 + 0x1000, not 0x800000. The first 0x1000 is the FDT, but a Platform Init simply complying with the FIT spec does not know that. We would have this problem in coreboot.
To fix this issue, I propose we emit another 'image' into the FIT's FDT, called "upl-fit-fdt". Then, we can shift the entrypoint's load value back where it should be (0x1000 greater than it is now), and platform init will copy it without needing hardcoded logic.
(I'm aware that a patch would be needed somewhere in UefiPayload - I believe FitUniversalPayloadEntry but it might be FitParserLib - to make sure that this image or this classification of images are not turned into FV HOBs inside EDK2)
What do you think?