| # UefiPayloadPkg | |
| Provide UEFI Universal Payload for different bootloader to generate EFI environment | |
| # Spec | |
| UniversalPayload URL: https://universalscalablefirmware.github.io/documentation/2_universal_payload.html | |
| UniversalPayload URL: https://universalpayload.github.io/spec/ | |
| ELF Format URL: https://refspecs.linuxfoundation.org/elf/elf.pdf | |
| FIT Format URL: https://universalpayload.github.io/spec/chapter2-payload-image-format.html | |
| # Uefi UniversalPayload Format | |
| | Binary Format | HandOffPayload - HOB | | |
| |---------------|----------------------| | |
| | ELF | V (Default) | | |
| | FIT | V | | |
| # Binary Format | |
| - ELF | |
| ``` | |
| + +-----------------------+ | |
| | | UniversalPayloadEntry | <----------- UefiPayloadPkg\UefiPayloadEntry\UniversalPayloadEntry.c:_ModuleEntryPoint (HOB) | |
| | +-----------------------+ | |
| | | .upld_info | patch it directly | |
| ELF Format | +-----------------------+ | |
| | | .upld.uefi_fv | patch it directly | |
| | +-----------------------+ | |
| | | .upld.bds_fv | patch it directly | |
| | +-----------------------+ | |
| | | .upld.<afpx>_fv | patch it directly | |
| + +-----------------------+ | |
| ``` | |
| - FIT | |
| ``` | |
| + +-----------------------+ | |
| FIT Data | | FIT Header | <----------- Generate by pylibfdt | |
| + +-----------------------+ | |
| PECOFF Format | | UniversalPayloadEntry | <----------- UefiPayloadPkg\UefiPayloadEntry\FitUniversalPayloadEntry.c:_ModuleEntryPoint (HOB) | |
| + +-----------------------+ | |
| Relocate Data | | reloc-start | | |
| + +-----------------------+ | |
| | | uefi_fv | patch it directly | |
| | +-----------------------+ | |
| Multi Binary | | bds_fv | patch it directly | |
| | +-----------------------+ | |
| | | afp_xxx_fv | patch it directly | |
| | +-----------------------+ | |
| | | afp_xxx_fv | patch it directly | |
| + +-----------------------+ | |
| ``` | |
| # Environment | |
| - ELF | |
| ``` | |
| Download and install https://github.com/llvm/llvm-project/releases/tag/llvmorg-10.0.1 | |
| ``` | |
| - FIT | |
| - Windows | |
| ```powershell | |
| Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) | |
| choco install dtc-msys2 | |
| pip3 install pefile | |
| pip3 install swig | |
| pip3 install pylibfdt | |
| ``` | |
| - Ubuntu | |
| ```bash | |
| sudo apt install -y u-boot-tools | |
| pip3 install pefile | |
| pip3 install swig | |
| pip3 install pylibfdt | |
| ``` | |
| # How to build UEFI UniversalPayload | |
| - Windows | |
| - edksetup Rebuild | |
| - Linux | |
| - make -C BaseTools | |
| - source edksetup.sh | |
| - UniversalPayload.elf | |
| - python UefiPayloadPkg/UniversalPayloadBuild.py -t <TOOL_CHAIN_TAG> | |
| - llvm-objdump -h Build/UefiPayloadPkgX64/UniversalPayload.elf | |
| - UniversalPayload.fit | |
| - python UefiPayloadPkg/UniversalPayloadBuild.py -t <TOOL_CHAIN_TAG> --Fit | |
| - fdtdump Build/UefiPayloadPkgX64/UniversalPayload.fit | |
| # Edk2boot + UefiUniversalPayload | |
| ELF Edk2boot use below way to support compress and sign. | |
| - ELF Behavior - Edk2boot + UefiUniversalPayload.elf | |
| ``` | |
| Boot Flow | |
| +-------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+-------------------+ | |
| | Platform Init | Universal Loader Interface | OS | | |
| +-------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+-------------------+ | |
| HOBs | |
| SEC -> PEI -> DXE -> DXE IPL -> UefiPayloadPkg\PayloadLoaderPeim\PayloadLoaderPeim.c ------------------------------------------------------------------------------------> Load UniversalPayload.elf -> Operation System | |
| | Platform Initialize - Edk2 | UniversalPayload - Edk2 | | |
| +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------+ | |
| Binary Format | |
| +-------------------+ | |
| | BIOS.rom | | |
| +-------------------+ | |
| | Other Firmware | | |
| +-------------------+ | |
| | ... | FMMT UniversalPayloadBuild.py | |
| +-------------------+<----------------+-----------------------+ GenFfs +-----------------------+ Rsa2048Sha256 Sign +-----------------------+ LzmaCompress +----------------------+ GenSec +--------------------------------+ | |
| | | | EDK2 FFS Header |<-----------| Rsa2048Sha256 Hash |<--------------------| UniversalPayload.lzma |<--------------| EDK2 SEC Header |<--------| UniversalPayload.elf | | |
| | RAW Data | +-----------------------+ +-----------------------+ +-----------------------+ +----------------------+ +--------------------------------+ | |
| | | | Rsa2048Sha256 Hash | | UniversalPayload.lzma | | UniversalPayload.elf | | upld_info | | |
| | | +-----------------------+ +-----------------------+ +----------------------+ +--------------------------------+ | |
| | | | UniversalPayload.lzma | | upld_info | | upld.uefi_fv | | |
| +-------------------+<----------------+-----------------------+ +----------------------+ +--------------------------------+ | |
| | ... | | upld.uefi_fv | | upld.bds_fv | | |
| +-------------------+ +----------------------+ +--------------------------------+ | |
| | Other Firmware | | upld.bds_fv | | upld.AFP1 | | |
| +-------------------+ +----------------------+ +--------------------------------+ | |
| | upld.AFP1 | | upld.AFP2 | | |
| +----------------------+ +--------------------------------+ | |
| | upld.AFP2 | | ... | | |
| +----------------------+ +--------------------------------+ | |
| | ... | | upld.AFPn | | |
| +----------------------+ +--------------------------------+ | |
| | upld.AFPn | | |
| +----------------------+ | |
| ``` | |
| FIT Edk2boot use below way to support compress and sign | |
| - FIT Behavior - Edk2boot + UefiUniversalPayload.fit | |
| ``` | |
| Boot Flow | |
| +-------------------------------------------------------------------------------------+------------------------------------------------------------------------+-------------------+ | |
| | Platform Init | Universal Loader Interface | OS | | |
| +-------------------------------------------------------------------------------------+------------------------------------------------------------------------+-------------------+ | |
| HOBs | |
| SEC -> PEI -> DXE -> DXE IPL -> *UefiPayloadPkg\PayloadLoaderPeim\PayloadLoaderPeim.c ----------------------------------------------> Load UniversalPayload.fit -> Operation System | |
| Binary Format | |
| | Platform Initialize - Edk2 | UniversalPayload - Edk2 (UniversalPayloadBuild.py --Fit) | | |
| +---------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | |
| +-------------------+ | |
| | BIOS.rom | | |
| +-------------------+ | |
| | Other Firmware | | |
| +-------------------+ | |
| | ... | FMMT UniversalPayloadBuild.py --Fit tianocore -> data-offset | |
| +-------------------+<----------------+--------------------------------+ GenFfs +--------------------------------+ GenSec +--------------------------------+ tianocore -> reloc-start +--------------------------+ | |
| | | | EDK2 FFS Header |<--------| EDK2 SEC Header |<--------| FIT Header |<-------------------------| UniversalPayload.pecoff | | |
| | | +--------------------------------+ +--------------------------------+ | description = "Uefi Payload"; | +--------------------------+ | |
| | | | EDK2 SEC Header | | FIT Header | | ... | | |
| | RAW Data | +--------------------------------+ | | | images { | uefi-fv -> data-offset +--------------------------+ | |
| | | | FIT Header | | | | tianocore {...}; |<-------------------------| uefi_fv | | |
| | | | | +--------------------------------+ | uefi-fv {...}; | bds-fv -> data-offset +--------------------------+ | |
| | | | | | tianocore -> data | | bds-fv {...}; |<-------------------------| bds_fv | | |
| | | +--------------------------------+ +--------------------------------+ | afp1-fv {...}; | AFP1 -> data-offset +--------------------------+ | |
| | | | tianocore -> data | | tianocore -> reloc-start | | ... |<-------------------------| AFP1 | | |
| | | +--------------------------------+ +--------------------------------+ | afpn-fv {...}; | AFP2 -> data-offset +--------------------------+ | |
| | | | tianocore -> reloc-start | | uefi-fv -> data | | } |<-------------------------| AFP2 | | |
| | | +--------------------------------+ +--------------------------------+ | configurations { | ... +--------------------------+ | |
| | | | uefi-fv -> data | | bds-fv -> data | | conf-1 {...} |<-------------------------| ... | | |
| | | +--------------------------------+ +--------------------------------+ | } | AFPn -> data-offset +--------------------------+ | |
| | | | bds-fv -> data | | AFP1-fv -> data | | |<-------------------------| AFPn | | |
| | | +--------------------------------+ +--------------------------------+ | | +--------------------------+ | |
| | | | AFP1-fv -> data | | AFP2-fv -> data | | | | |
| | | +--------------------------------+ +--------------------------------+ +--------------------------------+ | |
| | | | AFP2-fv -> data | | ... | | tianocore -> data | | |
| | | +--------------------------------+ +--------------------------------+ +--------------------------------+ | |
| | | | ... | | AFPn-fv -> data | | tianocore -> reloc-start | | |
| | | +--------------------------------+ +--------------------------------+ +--------------------------------+ | |
| | | | AFPn-fv -> data | | uefi-fv -> data | | |
| +-------------------+<----------------+--------------------------------+ +--------------------------------+ | |
| | ... | | bds-fv -> data | | |
| +-------------------+ +--------------------------------+ | |
| | Other Firmware | | AFP1-fv -> data | | |
| +-------------------+ +--------------------------------+ | |
| | AFP2-fv -> data | | |
| +--------------------------------+ | |
| | ... | | |
| +--------------------------------+ | |
| | AFPn-fv -> data | | |
| +--------------------------------+ | |
| ``` |