Skip to main content
Qualcomm® Linux boots without a conventional second-stage boot loader. The kernel itself is compiled as an EFI application using the EFI boot stub, and the UEFI firmware (or systemd-boot) executes it directly from the EFI System Partition (ESP).

Qualcomm Linux kernel as the EFI stub

The EFI boot stub is a thin shim built into the kernel image (drivers/firmware/efi/libstub/) that satisfies the EFI application entry point contract. When CONFIG_EFI_STUB=y is set, the kernel image is formatted as a Portable Executable / Common Object File Format (PE/COFF) binary so that UEFI firmware can load and execute it directly. On AArch64, compressed kernel support (zImage) is not available. The kernel image therefore ships as an uncompressed Image binary wrapped in the PE/COFF container with the EFI stub linked in. Verify the configuration in the active defconfig or a running system:
# From kernel source
grep CONFIG_EFI_STUB arch/arm64/configs/defconfig

# On target
zcat /proc/config.gz | grep CONFIG_EFI_STUB
# Expected: CONFIG_EFI_STUB=y
For the upstream EFI stub documentation, see The EFI Boot Stub.

EFI System Partition (ESP) layout

The ESP is a FAT32-formatted partition that UEFI firmware and systemd-boot use as the shared storage for boot components. On Qualcomm Linux devices it is accessible as the efi partition (partition label) and its contents are packaged into the efi.bin flashable image during the Yocto build.

Directory structure

ESP/
├── EFI/
│   ├── BOOT/
│   │   └── BOOTAA64.EFI          ← systemd-boot (default UEFI removable-media path)
│   └── Linux/
│       ├── linux.efi             ← Standard kernel UKI (Type 2 boot entry)
│       └── linux-rt.efi          ← Real-time kernel UKI (present when RT image built)
└── loader/
    ├── loader.conf               ← systemd-boot global configuration
    └── entries/                  ← Type 1 drop-in entries (unused by default)
PathDescription
EFI/BOOT/BOOTAA64.EFIThe UEFI default boot application for AArch64. UEFI firmware runs this when no explicit boot entry is configured. On Qualcomm Linux this is a copy of systemd-boot.efi.
EFI/Linux/*.efiUnified kernel image(s). systemd-boot enumerates all .efi files in this directory as boot entries.
loader/loader.confControls systemd-boot timeout and default entry policy.
loader/entries/Optional Type 1 drop-in .conf entries. Not populated by default on Qualcomm Linux.

FAT32 requirements

The UEFI specification requires the ESP to be formatted with FAT32 (or FAT12/16 for smaller partitions). The Yocto esp-qcom-image.bb recipe creates the efi.bin image with the correct FAT32 parameters. Do not reformat the efi partition with a different file system else UEFI firmware will fail to mount it.

Unified kernel image (UKI) structure

A UKI is a PE/COFF binary with additional EFI sections that carry the boot payload. The sections embedded by ukify in the Qualcomm Linux build are:
PE sectionContents
.linuxThe uncompressed kernel Image binary
.initrdThe initramfs CPIO archive (gzip or lz4 compressed)
.cmdlineKernel command-line string baked in at build time
.dtbauto(Optional) Device tree blob; DTBs are normally in dtb.bin on a separate partition
.osrelos-release metadata identifying the distribution and kernel version
The Qualcomm Linux UKI stores the kernel command line in .cmdline, which means the command line is fixed at image build time. To change kernel parameters you must rebuild efi.bin. For runtime overrides during development, see the efi-bin-append-update-kernel-cmdline-params skill documentation.

DTB partition image (dtb.bin)

Device tree blobs are maintained in a separate partition (dtb_a) rather than embedded in the UKI. This allows DTB updates (for example, adding a new board overlay) without rebuilding the kernel image. The Yocto build compiles all device trees listed in KERNEL_DEVICETREE and packages them into dtb.bin which is a FIT image that UEFI firmware interrogates to select the correct DTB for the detected hardware. The FIT-based selection mechanism is described in Device tree architecture.

Build artifacts summary

The following table maps each boot-relevant artifact to its partition and role:
FilePartitionContains
efi.binefiFAT32 ESP image: systemd-boot + UKI(s) in EFI/Linux/
dtb.bindtb_aFIT image of compiled DTB / DTBO files
vmlinuxBuild artifactUnstripped ELF kernel image with debug symbols
ImageEmbedded in UKIRaw AArch64 kernel binary
initramfs-*.cpio.gzEmbedded in UKIEarly userspace file system

Updating the ESP after a kernel change

After modifying the kernel source, configuration, or device tree, rebuild and reflash both efi.bin and dtb.bin:
# 1. Rebuild inside the kas shell
kas shell meta-qcom/ci/<board>.yml:meta-qcom/ci/qcom-distro.yml
bitbake qcom-multimedia-image

# 2. Navigate to the deploy directory
cd build/tmp/deploy/images/<Machine>/<Image>-*.rootfs.qcomflash/

# 3. Flash both partitions
fastboot flash efi efi.bin
fastboot flash dtb_a dtb.bin
fastboot reboot
Always flash efi.bin and dtb.bin together after a kernel or DTS change. Flashing only one can leave the kernel and device tree out of sync, causing boot failures.