Files
EDK2-fork/UefiPayloadPkg
Patrick Rudolph c9ff197059 UefiPayloadPkg: UefiPayloadEntry: Don't use reserved DRAM
Recent AMD platforms reserve parts of the lower DRAM where UefiPayload is
being loaded to and since UefiPayloadEntry doesn't care, it uses the reserved
memory for HOB and memory allocation.

The bootloader cannot prevent this, as it can only place the UEFI FV in
usable DRAM, but it has no control over EfiBootService memory allocations.

This issue prevents boot on those platforms without any specific error message.
It's not vendor specific and can happen on every platform.

Add the same logic as used on UniversalPayload and do the following:
- Walk bootloader provided memory information
- Skip everything that's not marked as usable DRAM
- Align entries to 1MiB boundary
- Don't use memory above 4GiB on x86_32
- Skip memory ranges too small
- Don't use memory currently occupied by the UEFI FV itself

Once a useable memory range is found pass it to HobConstructor().

TEST: Fixes boot on AMD/glinda, that reserved memory at 2000000h.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2025-04-08 06:32:56 +00:00
..

UefiPayloadPkg

Provide UEFI Universal Payload for different bootloader to generate EFI environment

Spec

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
                  +  +-----------------------+
    

Build Environment

  • ELF
    Install GCC compiler on linux and MSVC compiler on windows
    Install CLANG compiler https://github.com/llvm/llvm-project/releases/tag/llvmorg-10.0.1 on windows and linux
    
  • FIT
    Install GCC compiler on linux and MSVC compiler on windows
    pip3 install pefile
    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

How to dump payload binary data

  • UniversalPayload.elf

  • UniversalPayload.fit

    • Install fdtdump tool

      • Windows
        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
        
      • Linux
        sudo apt install -y u-boot-tools
        
    • 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                |
                                                                                                                                +--------------------------------+