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().
*