Just forgot to pass the disk during sparc64 tests and was surprised to see it treating a file as disk:
# installboot -nv /usr/mdec/bootblk /ofwboot.test Using / as root would install bootstrap on ./usr/mdec/bootblk using first-stage ./ofwboot.test, second-stage /usr/mdec/ofwboot boot block is 120696 bytes (236 blocks @ 512 bytes = 120832 bytes) installboot: boot blocks too big (120832 > 7680) Same on amd64: $ installboot -nv /usr/mdec/biosboot /usr/mdec/boot Using / as root would install bootstrap on /usr/mdec/biosboot using first-stage /usr/mdec/boot, second-stage /usr/mdec/boot installboot: /usr/mdec/boot: 2 ELF load sections (only support 1) Require an exact argc match instead of erroring out too many args alone: $ ./obj/installboot -nv /usr/mdec/biosboot /usr/mdec/boot usage: installboot [-nv] [-r root] disk [stage1 [stage2]] installboot [-nv] -p disk This problem exists on all platforms, but EFI (armv7, arm64, risc64) currently suffers from another bug regarding an explicit stage file: $ installboot -nv sd0 /usr/mdec/BOOTAA64.EFI usage: installboot [-nv] [-r root] disk [stage1] installboot [-nv] -p disk There md_init() does not yet set `stages' (relevant for this argc fix) and `stage1', so `stage' remains zero-initialised, effectively always requiring exactly one argument (the disk). That's stuff for another diff and luckily the argc fix below does not change behaviour for the only currently working usage on EFI: # doas installboot -nv sd0 Using / as root would install bootstrap on /dev/rsd0c would copy /usr/mdec/BOOTAA64.EFI to /tmp/installboot.7w8t7zd34s/efi/boot/bootaa64.efi would write /tmp/installboot.7w8t7zd34s/efi/boot/startup.nsh # doas ./obj/installboot -nv sd0 Using / as root would install bootstrap on /dev/rsd0c would copy /usr/mdec/BOOTAA64.EFI to /tmp/installboot.OMturEqYaM/efi/boot/bootaa64.efi would write /tmp/installboot.OMturEqYaM/efi/boot/startup.nsh The argc checks now read like I would read the synopsis, making it much easier to read and understand than the current code: 1. -p? a. no -r? b. exactly one arg (disk)? 2. else a. exactly one arg (disk)? b. exactly one+stages args (disk + stage1 [+ stage2])? Pull stage1/stage2 assignments into 2. to clarify things further. This fixes the bogus case I hit and keeps existing valid usages working. Feedback? OK? Index: installboot.c =================================================================== RCS file: /cvs/src/usr.sbin/installboot/installboot.c,v retrieving revision 1.15 diff -u -p -r1.15 installboot.c --- installboot.c 19 Aug 2022 08:27:48 -0000 1.15 +++ installboot.c 20 Aug 2022 06:29:49 -0000 @@ -75,10 +75,13 @@ main(int argc, char **argv) argc -= optind; argv += optind; - if (argc < 1 || argc > stages + 1) - usage(); - if (prepare && (root != NULL || argc > 1)) - usage(); + if (prepare) { + if (root != NULL || argc != 1) + usage(); + } else { + if (argc != 1 && argc != stages + 1) + usage(); + } dev = argv[0]; if (argc > 1)