edk2/UefiPayloadPkg
Michael Kubacki f3c45d2f0c UefiPayloadPkg: Replace include guards with #pragma once
Replace traditional `#ifndef`/`#define`/`#endif` include guards with
`#pragma` once.

`#pragma once` is a widely supported preprocessor directive that
prevents header files from being included multiple times. It is
supported by all toolchains used to build edk2: GCC, Clang/LLVM, and
MSVC.

Compared to macro-based include guards, `#pragma once`:

- Eliminates the risk of macro name collisions or copy/paste errors
  where two headers inadvertently use the same guard macro.
- Eliminate inconsistency in the way include guard macros are named
  (e.g., some files use `__FILE_H__`, others use `FILE_H_`, etc.).
- Reduces boilerplate (three lines replaced by one).
- Avoids polluting the macro namespace with guard symbols.
- Can improve build times as the preprocessor can skip re-opening the
  file entirely, rather than re-reading it to find the matching
  `#endif` ("multiple-include optimization").
  - Note that some compilers may already optimize traditional include
    guards, by recognzining the idiomatic pattern.

This change is made acknowledging that overall portability of the
code will technically be reduced, as `#pragma once` is not part of the
C/C++ standards.

However, this is considered acceptable given:

1. edk2 already defines a subset of supported compilers in
   BaseTools/Conf/tools_def.template, all of which have supported
   `#pragma once` for over two decades.
2. There have been concerns raised to the project about inconsistent
   include guard naming and potential macro collisions.

Approximate compiler support dates:

- MSVC: Supported since Visual C++ 4.2 (1996)
- GCC: Supported since 3.4 (2004)
  (http://gnu.ist.utl.pt/software/gcc/gcc-3.4/changes.html)
- Clang (LLVM based): Since initial release in 2007

Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
2026-02-23 21:01:28 +00:00
..
BlSupportDxe UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
BlSupportSmm UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
FvbRuntimeDxe UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
GraphicsOutputDxe UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
Include UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
Library UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
PayloadLoaderPeim UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
PchSmiDispatchSmm UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
PciPlatformDxe UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
PlatformCI UefiPayloadPkg: Update wiki links 2026-02-10 05:44:46 +00:00
SmmAccessDxe UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
SmmControlRuntimeDxe UefiPayloadPkg: Apply uncrustify changes 2021-12-07 17:24:28 +00:00
SmmStoreFvb UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
Tools UefiPayloadPkg: MkFitImage.py removes extra spaces 2026-01-26 11:29:46 +00:00
UefiPayloadEntry UefiPayloadPkg: Replace include guards with #pragma once 2026-02-23 21:01:28 +00:00
BuildAndIntegrationInstructions.txt UefiPayloadPkg: Update wiki links 2026-02-10 05:44:46 +00:00
Readme.md UefiPayloadPkg: Enhance ReadMe.md for ELF and FIT 2024-09-23 15:30:20 +00:00
UefiPayloadPkg.ci.yaml UefiPayloadPkg: Add Secure Boot support 2024-10-09 19:14:11 +00:00
UefiPayloadPkg.dec UefiPayloadPkg: Add PCD to control PCI DMA memory above 4GB 2026-01-21 11:29:41 +00:00
UefiPayloadPkg.dsc UefiPayloadPkg: Add PCD to control PCI DMA memory above 4GB 2026-01-21 11:29:41 +00:00
UefiPayloadPkg.fdf UefiPayloadPkg: Enable processing of capsules 2025-08-25 11:54:17 +00:00
UniversalPayloadBuild.py UefiPayloadPkg: UniversalPayloadBuild.py -l add support for various bases 2026-01-26 14:11:01 +00:00
UniversalPayloadBuild.sh UefiPayloadPkg: Provide a wrapper for UniversalPayloadBuild.py 2022-09-28 17:52:34 +08: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                |
                                                                                                                                +--------------------------------+