Every platform ought to set `stages', `stage1' and optionally `stage2' in md_init(), otherwise passing explicit files results won't work as `stages' is zero-initialised and no default path is set:
# installboot -v sd0 /root/BOOTAA64.EFI usage: installboot [-npv] [-r root] disk [stage1] This is correct synopsis and ought to work, but efi_installboot.c has an empty md_init(). Set stage bits for EFI platforms (armv7, arm64 and riscv64) to fix this: # ./obj/installboot -nv sd0 /root/BOOTAA64.EFI Using / as root would install bootstrap on /dev/rsd0c using first-stage /root/BOOTAA64.EFI would copy /root/BOOTAA64.EFI to /tmp/installboot.2bGhLGT1eF/efi/boot/bootaa64.efi would write /tmp/installboot.2bGhLGT1eF/efi/boot/startup.nsh /usr/src/distrib/ uses `-r /mnt' without explicit stage files, which is install media work despite this bug. These usages keep working with this diff (/mnt is another root install): # ./obj/installboot sd4 /usr/mdec/BOOTAA64.EFI # ./obj/installboot -r /mnt sd4 /usr/mdec/BOOTAA64.EFI # ./obj/installboot -r /mnt sd4 And arm64 miniroot keeps booting and installs/ugprades fine with this. I've only tested this on arm64 but it should be the same for other EFIs (armv7 and riscv64); this just looks like an oversight. Feedback? OK? Index: efi_installboot.c =================================================================== RCS file: /cvs/src/usr.sbin/installboot/efi_installboot.c,v retrieving revision 1.2 diff -u -p -r1.2 efi_installboot.c --- efi_installboot.c 3 Feb 2022 10:25:14 -0000 1.2 +++ efi_installboot.c 28 Aug 2022 10:20:52 -0000 @@ -76,6 +76,8 @@ static int findmbrfat(int, struct diskla void md_init(void) { + stages = 1; + stage1 = "/usr/mdec/" BOOTEFI_SRC; } void