> Date: Sat, 19 Nov 2022 18:26:36 +0100
> From: Tobias Heider <tobias.hei...@stusta.de>
> 
> Here is the promised last diff we need to enable Apple M* bootloader updates.
> 
> With this, installboot(8) will pick up apple-boot.bin from the firmware
> directory and writes it to $ESP/m1n1/boot.bin if both file and target
> directory exist.
> Creation of the m1n1/ directory is expected to happen during the initial
> Asahi Linux EFI environment installation so it is safe to assume it is
> already there when we need it.
> 
> Running this on my M2 gives me:
> 
> kischt# installboot -v sd0  
> Using / as root
> installing bootstrap on /dev/rsd0c
> using first-stage /usr/mdec/BOOTAA64.EFI
> copying /etc/firmware/apple-boot.bin to 
> /tmp/installboot.0JSQ0XrWRB/m1n1/boot.bin
> copying /usr/mdec/BOOTAA64.EFI to 
> /tmp/installboot.0JSQ0XrWRB/efi/boot/bootaa64.efi
> writing /tmp/installboot.0JSQ0XrWRB/efi/boot/startup.nsh

Hmm...

> Index: efi_installboot.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/installboot/efi_installboot.c,v
> retrieving revision 1.6
> diff -u -p -r1.6 efi_installboot.c
> --- efi_installboot.c 14 Sep 2022 16:43:00 -0000      1.6
> +++ efi_installboot.c 19 Nov 2022 16:45:36 -0000
> @@ -191,6 +191,7 @@ write_filesystem(struct disklabel *dl, c
>       struct msdosfs_args args;
>       char cmd[60];
>       char dst[PATH_MAX];
> +     struct stat st;
>       char *src;
>       size_t mntlen, pathlen, srclen;
>       int rslt;
> @@ -245,7 +246,36 @@ write_filesystem(struct disklabel *dl, c
>               }
>       }
>  
> +     /* Copy apple-boot firmware to /m1n1/boot.bin if available */
> +     src = fileprefix(root, "/etc/firmware/apple-boot.bin");
> +     if (src == NULL) {
> +             rslt = -1;
> +             goto umount;

Doesn't this mean that if /etc/firmware/apple-boot.bin doesn't exist,
we won't write the OpenBSD bootloader to the filesystem?  That would
be wrong.

So I think the Apple "magic" needs to be done at the end of the
function.

> +     }
> +     pathlen = strlen(dst);
> +     if (strlcat(dst, "/m1n1", sizeof(dst)) >= sizeof(dst)) {
> +             rslt = -1;
> +             warn("unable to build /m1n1 path");
> +             goto umount;
> +     }
> +     if ((access(src, R_OK) == 0) &&
> +         (stat(dst, &st) == 0) && S_ISDIR(st.st_mode)) {
> +             if (strlcat(dst, "/boot.bin", sizeof(dst)) >= sizeof(dst)) {
> +                     rslt = -1;
> +                     warn("unable to build /m1n1/boot.bin path");
> +                     goto umount;
> +             }
> +             if (verbose)
> +                     fprintf(stderr, "%s %s to %s\n",
> +                         (nowrite ? "would copy" : "copying"), src, dst);
> +             if (!nowrite)
> +                     rslt = filecopy(src, dst);
> +                     if (rslt == -1)
> +                             goto umount;
> +     }
> +
>       /* Create "/efi/boot" directory in <duid>.<part>. */
> +     dst[pathlen] = '\0';
>       if (strlcat(dst, "/efi", sizeof(dst)) >= sizeof(dst)) {
>               rslt = -1;
>               warn("unable to build /efi directory");
> 
> 

Reply via email to