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