Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/test-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ on:
make-args:
required: false
type: string
prep-run:
required: false
type: string

jobs:

Expand Down Expand Up @@ -42,6 +45,10 @@ jobs:
run: |
make -C tools/keytools && make -C tools/bin-assemble
- name: Pre-build setup
if: inputs.prep-run != ''
run: ${{inputs.prep-run}}

- name: Build wolfboot
run: |
make ${{inputs.make-args}}
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/test-configs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,14 @@ jobs:
arch: host
config-file: ./config/examples/x86_64_efi.config

aarch64_efi_test:
uses: ./.github/workflows/test-build.yml
with:
arch: aarch64
config-file: ./config/examples/aarch64_efi.config
# Build gnu-efi for aarch64 (pinned in the script) before wolfboot.efi.
prep-run: ./tools/scripts/build-gnu-efi-aarch64.sh

zynqmp_test:
uses: ./.github/workflows/test-build-aarch64.yml
with:
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -421,3 +421,12 @@ sdcard.img

# wolfHSM STM32H5 TZ demo build output
port/stmicro/stm32h5-tz-wolfhsm/out/

# gnu-efi built for the AArch64 UEFI target and its cloned source
tools/gnu-efi-aarch64/
tools/gnu-efi-src/
# aarch64_efi working/staging dirs (build artifacts, not tracked)
aarch64_efi-stage/
tools/qemu-esp/
# UEFI Secure Boot keys/certs generated by tools/scripts/sign-efi-secureboot.sh
tools/efi-secureboot-keys/
9 changes: 8 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,9 @@ SIGN_ENV=IMAGE_HEADER_SIZE=$(IMAGE_HEADER_SIZE) \


MAIN_TARGET=factory.bin
# PE/COFF output format for the wolfboot.efi objcopy rule. Overridden per
# target in arch.mk (e.g. pei-aarch64-little for aarch64_efi).
EFI_OBJCOPY_TARGET?=pei-x86-64
TARGET_H_TEMPLATE:=include/target.h.in

ifeq ($(TZEN),1)
Expand Down Expand Up @@ -293,6 +296,10 @@ ifeq ($(TARGET),x86_64_efi)
MAIN_TARGET:=wolfboot.efi
endif

ifeq ($(TARGET),aarch64_efi)
MAIN_TARGET:=wolfboot.efi
endif

ifeq ($(FSP), 1)
MAIN_TARGET:=wolfboot_stage1.bin
endif
Expand Down Expand Up @@ -379,7 +386,7 @@ wolfboot.efi: wolfboot.elf
$(Q)$(OBJCOPY) -j .rodata -j .text -j .sdata -j .data \
-j .dynamic -j .dynsym -j .rel \
-j .rela -j .reloc -j .eh_frame \
-O pei-x86-64 --subsystem=10 $^ $@
-O $(EFI_OBJCOPY_TARGET) --subsystem=10 $^ $@
@echo
@echo "\t[SIZE]"
$(Q)$(SIZE) wolfboot.efi
Expand Down
60 changes: 58 additions & 2 deletions arch.mk
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,20 @@ endif

## ARM Cortex-A
ifeq ($(ARCH),AARCH64)
CROSS_COMPILE?=aarch64-none-elf-
ifeq ($(TARGET),aarch64_efi)
# UEFI app: Linux GNU toolchain (freestanding EFI ABI), not aarch64-none-elf-
CROSS_COMPILE?=aarch64-linux-gnu-
else
CROSS_COMPILE?=aarch64-none-elf-
endif
CFLAGS+=-DARCH_AARCH64 -DFAST_MEMCPY
OBJS+=src/boot_aarch64.o src/boot_aarch64_start.o
ifeq ($(TARGET),aarch64_efi)
# UEFI app: gnu-efi CRT0 is the entry; do_boot is in boot_aarch64_efi.o.
# Skip the bare-metal reset (boot_aarch64_start.S) and EL2/GIC glue.
OBJS+=src/boot_aarch64_efi.o
else
OBJS+=src/boot_aarch64.o src/boot_aarch64_start.o
endif

ifeq ($(TARGET),zynq)
ARCH_FLAGS=-march=armv8-a+crypto
Expand Down Expand Up @@ -1776,6 +1787,37 @@ ifeq ($(TARGET),x86_64_efi)
UPDATE_OBJS:=src/update_ram.o
endif

ifeq ($(TARGET),aarch64_efi)
# Generic AArch64 UEFI application (validated on NVIDIA Jetson Orin Nano).
# Build gnu-efi for aarch64 first: ./tools/scripts/build-gnu-efi-aarch64.sh
# (override the install path with GNU_EFI_PATH=... if needed).
USE_GCC_HEADLESS=0
GNU_EFI_PATH?=tools/gnu-efi-aarch64
GNU_EFI_LIB_PATH?=$(GNU_EFI_PATH)/lib
GNU_EFI_INC_PATH?=$(GNU_EFI_PATH)/include
GNU_EFI_CRT0=$(GNU_EFI_LIB_PATH)/crt0-efi-aarch64.o
GNU_EFI_LSCRIPT=$(GNU_EFI_LIB_PATH)/elf_aarch64_efi.lds
CFLAGS += -fpic -ffreestanding -fno-stack-protector -fno-stack-check \
-fshort-wchar -mstrict-align
CFLAGS += -I$(GNU_EFI_INC_PATH) -I$(GNU_EFI_INC_PATH)/efi \
-I$(GNU_EFI_INC_PATH)/efi/aarch64 \
-DTARGET_aarch64_efi -DWOLFBOOT_DUALBOOT
# avoid using of fixed LOAD_ADDRESS, uefi target uses dynamic location
CFLAGS += -DWOLFBOOT_NO_LOAD_ADDRESS
# AArch64 PE/COFF output format for objcopy (see the wolfboot.efi rule).
# This binutils exposes it as pei-aarch64-little (not efi-app-aarch64).
EFI_OBJCOPY_TARGET=pei-aarch64-little
# --allow-multiple-definition: gnu-efi's libefi init.o (pulled in for
# InitializeLib) also defines memset/memcpy; wolfBoot's src/string.o comes
# first in link order and wins.
LDFLAGS = -shared -Bsymbolic --allow-multiple-definition \
-L$(GNU_EFI_LIB_PATH) -T$(GNU_EFI_LSCRIPT)
LD_START_GROUP = $(GNU_EFI_CRT0)
LD_END_GROUP = -lgnuefi -lefi
LD = $(CROSS_COMPILE)ld
UPDATE_OBJS:=src/update_ram.o
endif

ifeq ($(ARCH),sim)
USE_GCC_HEADLESS=0
LD = gcc
Expand Down Expand Up @@ -2026,6 +2068,19 @@ endif

## Update mechanism
ifeq ($(ARCH),AARCH64)
ifeq ($(TARGET),aarch64_efi)
# UEFI app: UEFI owns MMU/FDT, so skip the -DMMU/-DWOLFBOOT_FDT DTS path and
# fdt.o/gpt.o (like x86_64_efi). update_ram.o is set in the block above.
# DEBUG=1: route wolfBoot_printf to the UEFI console (gnu-efi Print).
ifeq ($(DEBUG),1)
CFLAGS += -DWOLFBOOT_DEBUG_EFI=1
endif
# Drop -Werror for this target: WOLFBOOT_DEBUG_EFI pulls gnu-efi headers into
# every TU and efidebug.h redefines the -DDEBUG object macro as a function
# macro. That cpp macro-redefinition warning has no -W name, so it can't be
# scoped with -Wno-error=<name>; our own sources are kept warning-clean.
CFLAGS := $(filter-out -Werror,$(CFLAGS))
else
CFLAGS+=-DMMU -DWOLFBOOT_FDT -DWOLFBOOT_DUALBOOT
OBJS+=src/fdt.o
# src/gpt.c provides the CRC32 helpers reused by update_ram.c's uImage
Expand All @@ -2046,6 +2101,7 @@ ifeq ($(ARCH),AARCH64)
# RAM-based boot from external flash (default)
UPDATE_OBJS:=src/update_ram.o
endif
endif
else
ifeq ($(DUALBANK_SWAP),1)
CFLAGS+=-DWOLFBOOT_DUALBOOT
Expand Down
32 changes: 32 additions & 0 deletions config/examples/aarch64_efi.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# AArch64 UEFI application - wolfBoot as a UEFI app (the AArch64 sibling of the
# x86_64_efi target). Validated on the NVIDIA Jetson Orin Nano (Tegra234).
#
# wolfBoot builds as an AArch64 UEFI application (wolfboot.efi) launched by the
# platform UEFI firmware. It reads kernel.img/update.img from the EFI Simple
# File System, verifies them, and boots via UEFI LoadImage/StartImage.
# Modeled on config/examples/x86_64_efi.config.
#
# Prerequisite: build gnu-efi for AArch64 first (one-time):
# ./tools/scripts/build-gnu-efi-aarch64.sh
# then: cp config/examples/aarch64_efi.config .config && make
#
# Crypto starts on ED25519/SHA256 (matches the proven x86 EFI target) to
# de-risk the first build. Switch to ECC384/SHA384 once the port builds and
# runs: set SIGN?=ECC384, HASH?=SHA384, SPMATH=1 (pulls in SP math objects).
ARCH=AARCH64
TARGET=aarch64_efi
WOLFBOOT_SMALL_STACK=1
SIGN?=ED25519
HASH?=SHA256
DEBUG=1
SPMATH=0
# required for keytools
WOLFBOOT_SECTOR_SIZE?=0x1000
WOLFBOOT_NO_PARTITIONS=1
# Measured boot: extend the verified kernel into the platform firmware TPM via
# EFI_TCG2_PROTOCOL (PCR MEASURED_PCR_A) before handoff, using the firmware's
# own TPM stack -- no wolfTPM transport. Best-effort: skips cleanly if the
# firmware exposes no TCG2/TPM. Validated on the NVIDIA Orin Nano fTPM
# (TPM present, SHA-256 + SHA-384 PCR banks).
MEASURED_BOOT_TCG2=1
MEASURED_PCR_A?=9
Loading
Loading