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");