You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
*[NVIDIA Jetson Orin (aarch64_efi)](#nvidia-jetson-orin-aarch64_efi)
36
37
*[Raspberry Pi pico 2 (rp2350)](#raspberry-pi-pico-rp2350)
37
38
*[Renesas RA6M4](#renesas-ra6m4)
38
39
*[Renesas RX65N](#renesas-rx65n)
@@ -7785,6 +7786,115 @@ You can `Ctrl-C` or login as `root` and power off qemu with `poweroff`
7785
7786
7786
7787
7787
7788
7789
+
## NVIDIA Jetson Orin (aarch64_efi)
7790
+
7791
+
The `aarch64_efi` target builds wolfBoot as an AArch64 UEFI application (`wolfboot.efi`), the direct counterpart of the [Qemu x86-64 UEFI](#qemu-x86-64-uefi) target. It uses only UEFI Boot Services (no SoC-specific registers), so the same binary runs on any AArch64 UEFI platform. It has been validated on the NVIDIA Jetson Orin Nano Developer Kit (Tegra234), where the on-module UEFI firmware (edk2-nvidia) launches it after the NVIDIA-signed early boot chain (BootROM -> MB1 -> MB2 -> UEFI). wolfBoot reads the next-stage image from the EFI Simple File System, authenticates it with wolfCrypt, and boots it via the UEFI `LoadImage`/`StartImage` services (an AArch64 Linux `Image` is itself a PE/COFF EFI-stub application).
7792
+
7793
+
### Prerequisites
7794
+
7795
+
* An AArch64 GNU toolchain (`aarch64-linux-gnu-gcc`)
7796
+
* gnu-efi built for AArch64 (the host distro package is usually x86-only, so build it with the helper script below)
7797
+
* For emulation: `qemu-system-aarch64` plus the AArch64 UEFI firmware (AAVMF, package `qemu-efi-aarch64`)
7798
+
7799
+
On a debian-like system:
7800
+
7801
+
```
7802
+
apt install git make gcc-aarch64-linux-gnu dosfstools mtools
Build the AArch64 gnu-efi runtime once (installs into `tools/gnu-efi-aarch64/`):
7807
+
7808
+
```
7809
+
./tools/scripts/build-gnu-efi-aarch64.sh
7810
+
```
7811
+
7812
+
### Configuration
7813
+
7814
+
An example configuration is provided in [config/examples/aarch64_efi.config](config/examples/aarch64_efi.config). It selects `ARCH=AARCH64`, `TARGET=aarch64_efi`, and a signature/hash algorithm (ED25519/SHA256 by default). No partition addresses are required -- UEFI provides the storage and dynamic image placement.
7815
+
7816
+
### Building
7817
+
7818
+
```
7819
+
cp config/examples/aarch64_efi.config .config
7820
+
make
7821
+
```
7822
+
7823
+
This produces `wolfboot.efi`, a PE32+ AArch64 EFI application (objcopy output format `pei-aarch64-little`).
7824
+
7825
+
### Signing a payload
7826
+
7827
+
Sign the image to boot (an AArch64 Linux `Image`, or any EFI application for testing) with the generated key, tagging it with a version. wolfBoot looks for `kernel.img` and `update.img` on the volume it was launched from and boots the higher valid version:
./tools/scripts/aarch64-efi-qemu.sh # add --gdb to debug with gdb-multiarch
7838
+
```
7839
+
7840
+
The script exposes a scratch directory to the UEFI firmware as a FAT ESP, copies `wolfboot.efi` (and `kernel.img` from `aarch64_efi-stage/` if present), and auto-runs it.
7841
+
7842
+
### Deploying on the Jetson Orin Nano
7843
+
7844
+
The Jetson UEFI auto-boots removable media via `\EFI\BOOT\BOOTAA64.EFI`. Place wolfBoot and a signed payload on a FAT32 partition:
7845
+
7846
+
```
7847
+
\EFI\BOOT\BOOTAA64.EFI <- wolfboot.efi
7848
+
\kernel.img <- signed payload (read from the volume root)
7849
+
\cmdline.txt <- optional Linux kernel command line (see below)
7850
+
```
7851
+
7852
+
Insert the card and power on; UEFI auto-launches wolfBoot, which verifies and boots the payload. The debug console on the Orin Nano Developer Kit is the J14 button header (not the 40-pin), 115200 8N1. Example output:
7853
+
7854
+
```
7855
+
Image base: 0x25E5D4000
7856
+
Opening file: kernel.img, size: 57969
7857
+
Checking integrity...done
7858
+
Verifying signature...done
7859
+
Successfully selected image in part: 0
7860
+
Firmware Valid
7861
+
Booting at 0x5E254100
7862
+
Staging kernel at address 5E254100, size: 57969
7863
+
```
7864
+
7865
+
### Booting Linux
7866
+
7867
+
An AArch64 Linux `Image` carries a PE/COFF EFI stub, so wolfBoot boots it with the same `LoadImage`/`StartImage` path used above -- no initrd or bare-metal handoff is needed when the kernel has built-in MMC/ext4 drivers (the NVIDIA L4T kernel does). This has been validated end to end on the Jetson Orin Nano: wolfBoot verifies the signed kernel and boots NVIDIA Jetson Linux (L4T R36.4.4, `5.15.148-tegra`) all the way to an Ubuntu 22.04 login prompt.
7868
+
7869
+
Obtain a Tegra234-compatible kernel and root filesystem from the [NVIDIA Jetson Linux (L4T)](https://developer.nvidia.com/embedded/jetson-linux) BSP. The driver package (`Jetson_Linux_R36.x.x_aarch64.tbz2`) contains `Linux_for_Tegra/kernel/Image` and `Linux_for_Tegra/kernel/dtb/tegra234-*.dtb`; the matching `Tegra_Linux_Sample-Root-Filesystem_*.tbz2` provides the rootfs.
7870
+
7871
+
Sign the kernel `Image` with the wolfBoot key and name it `kernel.img`:
On power-up the Jetson UEFI auto-boots `\EFI\BOOT\BOOTAA64.EFI`; wolfBoot verifies `kernel.img` and hands off to the kernel, which receives the real Tegra234 device tree from the UEFI configuration table (`EFI stub: Using DTB from configuration table`), mounts `mmcblk0p2`, and brings up systemd and the login on the J14 debug console (`ttyTCU0`).
7895
+
7896
+
Security note: the plaintext `\cmdline.txt` is not covered by the image signature. For a production trust chain the command line should be authenticated -- baked into the signed image, or supplied via the device-tree `/chosen` bootargs. An initramfs-based flow (rather than a direct `root=` mount) would additionally need initrd support via the `LINUX_EFI_INITRD_MEDIA_GUID` LoadFile2 protocol, which this target does not currently implement.
7897
+
7788
7898
## Intel x86_64 with Intel FSP support
7789
7899
7790
7900
This setup is more complex than the UEFI approach described earlier, but allows
0 commit comments