Bootloader command functions must return zero in case of failure, returning 1 tells the bootloader to boot the file.
arm64's `machine dtb' command has it the wrong way so using it triggers a boot that doesn't make any sense: >> OpenBSD/arm64 BOOTAA64 1.4 boot> mach dtb booting sd0a:/etc/boot.conf: open sd0a:/etc/boot.conf: No such file or directory failed(2). will try /bsd boot> mach dtb /foo cannot open sd0a:/foo NOTE: random seed is being reused. booting sd0a:/etc/boot.conf: open sd0a:/etc/boot.conf: No such file or directory failed(2). will try /bsd With this diff: >> OpenBSD/arm64 BOOTAA64 1.4 boot> mach dtb dtb file boot> mach dtb /foo cannot open sd0a:/foo While here, tell users how to use that command (like other commands such as `hexdump' do). Feedback? OK? Index: arch/arm64/stand/efiboot/efiboot.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/stand/efiboot/efiboot.c,v retrieving revision 1.31 diff -u -p -r1.31 efiboot.c --- arch/arm64/stand/efiboot/efiboot.c 9 Mar 2021 21:11:24 -0000 1.31 +++ arch/arm64/stand/efiboot/efiboot.c 24 Mar 2021 17:59:52 -0000 @@ -980,28 +980,30 @@ Xdtb_efi(void) #define O_RDONLY 0 - if (cmd.argc != 2) - return (1); + if (cmd.argc != 2) { + printf("dtb file\n"); + return (0); + } snprintf(path, sizeof(path), "%s:%s", cmd.bootdev, cmd.argv[1]); fd = open(path, O_RDONLY); if (fd < 0 || fstat(fd, &sb) == -1) { printf("cannot open %s\n", path); - return (1); + return (0); } if (efi_memprobe_find(EFI_SIZE_TO_PAGES(sb.st_size), 0x1000, &addr) != EFI_SUCCESS) { printf("cannot allocate memory for %s\n", path); - return (1); + return (0); } if (read(fd, (void *)addr, sb.st_size) != sb.st_size) { printf("cannot read from %s\n", path); - return (1); + return (0); } fdt = (void *)addr; - return (0); + return (1); } int