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

Reply via email to