summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/installboot/efi_installboot.c73
-rw-r--r--usr.sbin/installboot/installboot.h4
-rw-r--r--usr.sbin/installboot/util.c43
3 files changed, 79 insertions, 41 deletions
diff --git a/usr.sbin/installboot/efi_installboot.c b/usr.sbin/installboot/efi_installboot.c
index 967b1acfe7e..e787a19500c 100644
--- a/usr.sbin/installboot/efi_installboot.c
+++ b/usr.sbin/installboot/efi_installboot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: efi_installboot.c,v 1.1 2022/02/03 10:21:13 visa Exp $ */
+/* $OpenBSD: efi_installboot.c,v 1.2 2022/02/03 10:25:14 visa Exp $ */
/* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
/*
@@ -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, char part)
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, char part)
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:
diff --git a/usr.sbin/installboot/installboot.h b/usr.sbin/installboot/installboot.h
index 54d362c7ab4..0665592cb92 100644
--- a/usr.sbin/installboot/installboot.h
+++ b/usr.sbin/installboot/installboot.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: installboot.h,v 1.13 2021/07/20 14:51:56 kettenis Exp $ */
+/* $OpenBSD: installboot.h,v 1.14 2022/02/03 10:25:14 visa Exp $ */
/*
* Copyright (c) 2012, 2013 Joel Sing <jsing@openbsd.org>
*
@@ -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);
diff --git a/usr.sbin/installboot/util.c b/usr.sbin/installboot/util.c
index 0ffd5e742f9..a21ccdb2cc2 100644
--- a/usr.sbin/installboot/util.c
+++ b/usr.sbin/installboot/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.15 2022/02/02 13:22:10 visa Exp $ */
+/* $OpenBSD: util.c,v 1.16 2022/02/03 10:25:14 visa Exp $ */
/*
* Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
@@ -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().
*