mirror of https://github.com/acidanthera/audk.git
190 lines
18 KiB
Markdown
190 lines
18 KiB
Markdown
# 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 |
|
|
+--------------------------------+
|
|
|
|
```
|