**NOTE** I haven't yet tested direct boot through Raspberry's proprietary bootloader. Booting Yggdrasil on Raspberry Pi 4B with u-boot: 1. Clone u-boot sources to some directory and checkout some stable branch. I've used v2024.10. 2. Modify cmd/boot.c by replacing the do_go_exec function: /* Allow ports to override the default behavior */ __attribute__((weak)) unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, char *const argv[]) { void *entry_ptr = (void *) entry; ulong fdt_addr_r = 0; if (argc >= 2) { fdt_addr_r = hextoul(argv[1], NULL); } void (*func)(ulong) = entry_ptr; func(fdt_addr_r); return 0; } 3. make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 rpi_4_defconfig 4. make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 -j 5. Copy u-boot.bin into your Pi SD-card's boot partition. **NOTE** I assume you have all the bootloader parts in the boot partition already. If not, clone raspberry fw repo and copy the following files to the boot partition: * bootcode.bin * start4.elf * all the .dtb files (a bcm2711-rpi-4-b.dtb should be enough though) 6. config.txt: enable_uart=1 arm64_bit=1 kernel=u-boot.bin 7. Compile the OS with `cargo xtask --arch=aarch64 --board=raspi4b --release` 8. Copy the following files into some directory: * target/aarch64-unknown-raspi4b/release/yggdrasil-kernel * userspace/target/aarch64-unknown-yggdrasil/release/initrd.tar 9. cd into that directory and start a TFTP server of your choice. I used `uftpd`. 10. Connect an ethernet and serial to the Pi and run the following commands in u-boot shell: tftpboot 0x04000000 :initrd.tar tftpboot ${loadaddr} :yggdrasil-kernel load mmc 0:1 ${fdt_addr_r} bcm2711-rpi-4-b.dtb fdt addr ${fdt_addr_r} fdt resize fdt memory 0x0 0x3C000000 fdt chosen 0x04000000 bootelf -p go ${kernel_addr_r} ${fdt_addr_r} 11. Yggdrasil OS should start!