On Sat, Nov 19, 2022 at 06:33:51PM +0100, Mark Kettenis wrote:
> > 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.

That is what I also first thought, but fileprefix() just concats the strings
and doesn't actually touch the file system.  This is also why I added my own
stat() && S_ISDIR() check below to make sure the directory exists.

Wit apple-boot manually deleted I get:

kischt# installboot -v sd0            
Using / as root
installing bootstrap on /dev/rsd0c
using first-stage /usr/mdec/BOOTAA64.EFI
copying /usr/mdec/BOOTAA64.EFI to 
/tmp/installboot.Tm5s4GRaRT/efi/boot/bootaa64.efi
writing /tmp/installboot.Tm5s4GRaRT/efi/boot/startup.nsh

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