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

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;
+       }
+       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