devicetree /dtbs/rockchip/rk3399.dtb linux /Image root=/dev/mmcblk0p2 boot Many aa64 firmwares look for BOOTAA64.EFI (not BOOTARM64.EFI ). Some older implementations use bootaa64.efi (case-sensitive in FAT32? Yes—FAT32 is case-preserving but case-insensitive for lookup, but best to match firmware expectations). ❌ Kernel Image Format x86_64 uses bzImage with a setup header. aa64 expects Image (a pure executable). Do not try to boot vmlinux (ELF) directly unless your firmware has an ELF loader (rare). Building a Minimal AA64 EFI Bootloader (conceptual) If you want to write your own (for education or specialized use), the entry point looks like this:
Fix in GRUB:
# Install kernel to ESP cp arch/arm64/boot/Image /boot/efi/EFI/Linux/linux.efi efibootmgr -c -d /dev/sda -p 1 -L "Linux AA64" -l '\EFI\Linux\linux.efi' -u "console=ttyAMA0 root=/dev/sda2" Common Pitfalls on AA64 EFI Boot ❌ Missing Device Tree If your firmware doesn’t provide ACPI (most SBSA/SBBR servers do), you must pass a DTB. Without it, the kernel won’t find UART, timer, or interrupt controller. aa64 efi bootloader
#include <efi.h> #include <efilib.h> EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) InitializeLib(image, sys_table); Print(L"Hello from AA64 EFI bootloader\n"); // Load kernel image, DTB, call ExitBootServices() return EFI_SUCCESS; devicetree /dtbs/rockchip/rk3399