That's a good step. Visa Hankala <[email protected]> wrote:
> On Tue, Feb 01, 2022 at 10:55:03AM -0700, Theo de Raadt wrote: > > Mark Kettenis <[email protected]> wrote: > > > > > Maybe we should rename the file to efi_installboot.c and/or rearrange > > > the code slightly such that is becomes more obvious that the name of > > > the file is indeed the only difference. > > > > And obviously, efi_installboot.c would do this on all efi architectures: > > > > echo bootriscv64.efi > /mnt/mnt/efi/boot/startup.nsh > > > > OK let's call it > > > > write "boot%s.efi\n" to efi/boot/startup.nsh > > > > On all architectures. Always. Where %s is a rather strange substitution. > > Here is a revised diff that additionally makes the depicted installboot > adjustments. For clarity, the diff refers to armv7_installboot.c, but > I can rename the file to efi_installboot.c in a separate, preceding > commit. > > This skips updating of install.md of arm64 and armv7. However, these > installboot modifications should not break the scripts. > > Index: distrib/riscv64/ramdisk/install.md > =================================================================== > RCS file: src/distrib/riscv64/ramdisk/install.md,v > retrieving revision 1.3 > diff -u -p -r1.3 install.md > --- distrib/riscv64/ramdisk/install.md 2 Aug 2021 21:46:39 -0000 > 1.3 > +++ distrib/riscv64/ramdisk/install.md 2 Feb 2022 14:11:08 -0000 > @@ -33,16 +33,13 @@ > # > > NCPU=$(sysctl -n hw.ncpufound) > -NEWFSARGS_msdos="-F 16 -L boot" > -MOUNT_ARGS_msdos="-o-l" > > md_installboot() { > - local _disk=/dev/$1 > - > - mount ${MOUNT_ARGS_msdos} ${_disk}i /mnt/mnt > - mkdir -p /mnt/mnt/efi/boot > - cp /mnt/usr/mdec/BOOTRISCV64.EFI /mnt/mnt/efi/boot/bootriscv64.efi > - echo bootriscv64.efi > /mnt/mnt/efi/boot/startup.nsh > + if ! installboot -r /mnt ${1}; then > + echo "\nFailed to install bootblocks." > + echo "You will not be able to boot OpenBSD from ${1}." > + exit > + fi > } > > md_prep_fdisk() { > @@ -53,7 +50,6 @@ md_prep_fdisk() { > local bootsectorsize="32768" > local bootsectorend=$(($bootsectorstart + $bootsectorsize)) > local bootfstype="msdos" > - local newfs_args=${NEWFSARGS_msdos} > > while :; do > _d=whole > @@ -83,8 +79,7 @@ write > quit > __EOT > echo "done." > - disklabel $_disk 2>/dev/null | grep -q "^ i:" || > disklabel -w -d $_disk > - newfs -t ${bootfstype} ${newfs_args} ${_disk}i > + installboot -p $_disk > return ;; > [eE]*) > # Manually configure the MBR. > Index: distrib/riscv64/ramdisk/list > =================================================================== > RCS file: src/distrib/riscv64/ramdisk/list,v > retrieving revision 1.5 > diff -u -p -r1.5 list > --- distrib/riscv64/ramdisk/list 4 Oct 2021 01:34:29 -0000 1.5 > +++ distrib/riscv64/ramdisk/list 2 Feb 2022 14:11:08 -0000 > @@ -62,6 +62,7 @@ LINK instbin > usr/bin/sed > LINK instbin usr/bin/signify > LINK instbin usr/bin/tee > LINK instbin usr/sbin/chroot > +LINK instbin usr/sbin/installboot > LINK instbin usr/sbin/pwd_mkdb > ARGVLINK ksh -sh > SPECIAL rm bin/md5 > Index: distrib/special/installboot/Makefile > =================================================================== > RCS file: src/distrib/special/installboot/Makefile,v > retrieving revision 1.14 > diff -u -p -r1.14 Makefile > --- distrib/special/installboot/Makefile 20 Jul 2020 14:55:43 -0000 > 1.14 > +++ distrib/special/installboot/Makefile 2 Feb 2022 14:11:08 -0000 > @@ -15,7 +15,7 @@ CFLAGS += -DSOFTRAID > SRCS += i386_installboot.c > SRCS += i386_nlist.c > SRCS += i386_softraid.c > -.elif ${MACHINE} == "armv7" || ${MACHINE} == "arm64" > +.elif ${MACHINE} == "armv7" || ${MACHINE} == "arm64" || ${MACHINE} == > "riscv64" > SRCS += armv7_installboot.c > .elif ${MACHINE} == "hppa" > CFLAGS += -DBOOTSTRAP > Index: usr.sbin/installboot/armv7_installboot.c > =================================================================== > RCS file: src/usr.sbin/installboot/armv7_installboot.c,v > retrieving revision 1.11 > diff -u -p -r1.11 armv7_installboot.c > --- usr.sbin/installboot/armv7_installboot.c 20 Jul 2021 14:51:56 -0000 > 1.11 > +++ usr.sbin/installboot/armv7_installboot.c 2 Feb 2022 14:11:08 -0000 > @@ -55,6 +55,19 @@ > > #include "installboot.h" > > +#if defined(__aarch64__) > +#define BOOTEFI_SRC "BOOTAA64.EFI" > +#define BOOTEFI_DST "bootaa64.efi" > +#elif defined(__arm__) > +#define BOOTEFI_SRC "BOOTARM.EFI" > +#define BOOTEFI_DST "bootarm.efi" > +#elif defined(__riscv) > +#define BOOTEFI_SRC "BOOTRISCV64.EFI" > +#define BOOTEFI_DST "bootriscv64.efi" > +#else > +#error "unhandled architecture" > +#endif > + > static int create_filesystem(struct disklabel *, char); > static void write_filesystem(struct disklabel *, char); > static int findgptefisys(int, struct disklabel *); > @@ -252,52 +265,18 @@ write_filesystem(struct disklabel *dl, c > goto umount; > } > > -#ifdef __aarch64__ > - /* > - * Copy BOOTAA64.EFI to /efi/boot/bootaa64.efi. > - */ > + /* Copy EFI bootblocks to /efi/boot/. */ > pathlen = strlen(dst); > - if (strlcat(dst, "/bootaa64.efi", sizeof(dst)) >= sizeof(dst)) { > + if (strlcat(dst, "/" BOOTEFI_DST, sizeof(dst)) >= sizeof(dst)) { > rslt = -1; > - warn("unable to build /bootaa64.efi path"); > + warn("unable to build /%s path", BOOTEFI_DST); > goto umount; > } > - src = fileprefix(root, "/usr/mdec/BOOTAA64.EFI"); > + src = fileprefix(root, "/usr/mdec/" BOOTEFI_SRC); > if (src == NULL) { > rslt = -1; > goto umount; > } > -#elif defined(__arm__) > - /* > - * Copy BOOTARM.EFI to /efi/boot/bootarm.efi. > - */ > - pathlen = strlen(dst); > - if (strlcat(dst, "/bootarm.efi", sizeof(dst)) >= sizeof(dst)) { > - rslt = -1; > - warn("unable to build /bootarm.efi path"); > - goto umount; > - } > - src = fileprefix(root, "/usr/mdec/BOOTARM.EFI"); > - if (src == NULL) { > - rslt = -1; > - goto umount; > - } > -#elif defined(__riscv) > - /* > - * Copy BOOTRISCV64.EFI to /efi/boot/bootriscv64.efi. > - */ > - pathlen = strlen(dst); > - if (strlcat(dst, "/bootriscv64.efi", sizeof(dst)) >= sizeof(dst)) { > - rslt = -1; > - warn("unable to build /bootriscv64.efi path"); > - goto umount; > - } > - src = fileprefix(root, "/usr/mdec/BOOTRISCV64.EFI"); > - if (src == NULL) { > - rslt = -1; > - goto umount; > - } > -#endif > srclen = strlen(src); > if (verbose) > fprintf(stderr, "%s %s to %s\n", > @@ -308,6 +287,22 @@ write_filesystem(struct disklabel *dl, c > goto umount; > } > > + /* Write /efi/boot/startup.nsh. */ > + dst[pathlen] = '\0'; > + if (strlcat(dst, "/startup.nsh", sizeof(dst)) >= sizeof(dst)) { > + rslt = -1; > + warn("unable to build /startup.nsh path"); > + goto umount; > + } > + if (verbose) > + fprintf(stderr, "%s %s\n", > + (nowrite ? "would write" : "writing"), dst); > + if (!nowrite) { > + rslt = fileprintf(dst, "%s\n", BOOTEFI_DST); > + if (rslt == -1) > + goto umount; > + } > + > rslt = 0; > > umount: > Index: usr.sbin/installboot/installboot.h > =================================================================== > RCS file: src/usr.sbin/installboot/installboot.h,v > retrieving revision 1.13 > diff -u -p -r1.13 installboot.h > --- usr.sbin/installboot/installboot.h 20 Jul 2021 14:51:56 -0000 > 1.13 > +++ usr.sbin/installboot/installboot.h 2 Feb 2022 14:11:08 -0000 > @@ -33,6 +33,8 @@ void bootstrap(int, char *, char *); > > int filecopy(const char *, const char *); > char *fileprefix(const char *, const char *); > +int fileprintf(const char *, const char *, ...) > + __attribute__((format(printf, 2, 3))); > u_int32_t crc32(const u_char *, const u_int32_t); > > void md_init(void); > Index: usr.sbin/installboot/util.c > =================================================================== > RCS file: src/usr.sbin/installboot/util.c,v > retrieving revision 1.15 > diff -u -p -r1.15 util.c > --- usr.sbin/installboot/util.c 2 Feb 2022 13:22:10 -0000 1.15 > +++ usr.sbin/installboot/util.c 2 Feb 2022 14:11:08 -0000 > @@ -20,6 +20,7 @@ > #include <err.h> > #include <errno.h> > #include <fcntl.h> > +#include <stdarg.h> > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > @@ -137,6 +138,46 @@ err: > return (NULL); > } > > +int > +fileprintf(const char *filename, const char *fmt, ...) > +{ > + va_list ap; > + int fd, ret; > + int rslt = -1; > + > + fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, > + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); > + if (fd == -1) { > + warn("open %s", filename); > + return (-1); > + } > + if (fchown(fd, 0, 0) == -1) { > + if (errno != EINVAL) { > + warn("chown"); > + goto err; > + } > + } > + if (fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) == -1) { > + warn("chmod"); > + goto err; > + } > + > + va_start(ap, fmt); > + ret = vdprintf(fd, fmt, ap); > + va_end(ap); > + > + if (ret < 0) { > + warn("vdprintf"); > + goto err; > + } > + > + rslt = 0; > + > +err: > + close(fd); > + return (rslt); > +} > + > /* > * Adapted from Hacker's Delight crc32b(). > * >
