Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/stand/efiboot - Add support for a boot configuration fil...
details: https://anonhg.NetBSD.org/src/rev/d476f481bd81
branches: trunk
changeset: 450664:d476f481bd81
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun Apr 21 22:30:41 2019 +0000
description:
- Add support for a boot configuration file, defaulting to /etc/efiboot.plist.
- Add support for pre-loading EFI environment variables from efiboot.plist.
- Add support for device tree overlays specified in efiboot.plist.
(Man page for efiboot forthcoming.)
diffstat:
sys/stand/efiboot/Makefile.efiboot | 6 +-
sys/stand/efiboot/boot.c | 41 +++++++-
sys/stand/efiboot/efiboot.c | 8 +-
sys/stand/efiboot/efiboot.h | 8 +-
sys/stand/efiboot/efienv.c | 66 ++++++++++++-
sys/stand/efiboot/efienv.h | 3 +-
sys/stand/efiboot/efifdt.c | 50 +++++++++-
sys/stand/efiboot/efifdt.h | 4 +-
sys/stand/efiboot/exec.c | 187 ++++++++++++++++++++++++++++++++++--
sys/stand/efiboot/version | 3 +-
10 files changed, 354 insertions(+), 22 deletions(-)
diffs (truncated from 660 to 300 lines):
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/Makefile.efiboot
--- a/sys/stand/efiboot/Makefile.efiboot Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/Makefile.efiboot Sun Apr 21 22:30:41 2019 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.efiboot,v 1.6 2018/10/12 22:08:04 jmcneill Exp $
+# $NetBSD: Makefile.efiboot,v 1.7 2019/04/21 22:30:41 thorpej Exp $
S= ${.CURDIR}/../../..
@@ -26,7 +26,7 @@
.PATH: ${S}/external/bsd/libfdt/dist
CPPFLAGS+= -I${S}/external/bsd/libfdt/dist
-SOURCES+= fdt.c fdt_addresses.c fdt_empty_tree.c
+SOURCES+= fdt.c fdt_addresses.c fdt_empty_tree.c fdt_overlay.c
SOURCES+= fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c
SRCS= ${SOURCES} ${EXTRA_SOURCES}
@@ -51,6 +51,7 @@
CPPFLAGS+= -I$S -I${.CURDIR} -I${.CURDIR}/../common -I$S/lib/libsa
CPPFLAGS+= -I${.OBJDIR}
CPPFLAGS+= -I${.CURDIR}/../../lib
+CPPFLAGS+= -I${S}/../common/include
COPTS+= -fpic -g -O2
COPTS+= -fshort-wchar -fno-strict-aliasing
@@ -77,6 +78,7 @@
CPPFLAGS+= -DSUPPORT_TFTP
CPPFLAGS+= -DLIBSA_ENABLE_LS_OP
+#CPPFLAGS+= -DEFIBOOT_DEBUG
#CPPFLAGS+= -DARP_DEBUG
#CPPFLAGS+= -DBOOTP_DEBUG
#CPPFLAGS+= -DNET_DEBUG
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/boot.c
--- a/sys/stand/efiboot/boot.c Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/boot.c Sun Apr 21 22:30:41 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.17 2019/04/20 11:28:53 jmcneill Exp $ */
+/* $NetBSD: boot.c,v 1.18 2019/04/21 22:30:41 thorpej Exp $ */
/*-
* Copyright (c) 2016 Kimihiro Nonaka <nonaka%netbsd.org@localhost>
@@ -72,6 +72,7 @@
static char default_device[32];
static char initrd_path[255];
static char dtb_path[255];
+static char efibootplist_path[255];
static char netbsd_path[255];
static char netbsd_args[255];
@@ -84,6 +85,7 @@
void command_boot(char *);
void command_dev(char *);
void command_dtb(char *);
+void command_plist(char *);
void command_initrd(char *);
void command_ls(char *);
void command_mem(char *);
@@ -99,6 +101,7 @@
{ "boot", command_boot, "boot [dev:][filename] [args]\n (ex. \"hd0a:\\netbsd.old -s\"" },
{ "dev", command_dev, "dev" },
{ "dtb", command_dtb, "dtb [dev:][filename]" },
+ { "plist", command_plist, "plist [dev:][filename]" },
{ "initrd", command_initrd, "initrd [dev:][filename]" },
{ "ls", command_ls, "ls [hdNn:/path]" },
{ "mem", command_mem, "mem" },
@@ -166,6 +169,13 @@
}
void
+command_plist(char *arg)
+{
+ if (set_efibootplist_path(arg) == 0)
+ load_efibootplist(false);
+}
+
+void
command_initrd(char *arg)
{
set_initrd_path(arg);
@@ -324,6 +334,20 @@
}
int
+set_efibootplist_path(const char *arg)
+{
+ if (strlen(arg) + 1 > sizeof(efibootplist_path))
+ return ERANGE;
+ strcpy(efibootplist_path, arg);
+ return 0;
+}
+
+char *get_efibootplist_path(void)
+{
+ return efibootplist_path;
+}
+
+int
set_bootfile(const char *arg)
{
if (strlen(arg) + 1 > sizeof(netbsd_path))
@@ -354,6 +378,21 @@
{
char *s;
+ s = efi_env_get("efibootplist");
+ if (s) {
+#ifdef EFIBOOT_DEBUG
+ printf(">> Setting efiboot.plist path to '%s' from environment\n", s);
+#endif
+ set_efibootplist_path(s);
+ FreePool(s);
+ }
+
+ /*
+ * Read the efiboot.plist now as it may contain additional
+ * environment variables.
+ */
+ load_efibootplist(true);
+
s = efi_env_get("fdtfile");
if (s) {
#ifdef EFIBOOT_DEBUG
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/efiboot.c
--- a/sys/stand/efiboot/efiboot.c Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/efiboot.c Sun Apr 21 22:30:41 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efiboot.c,v 1.15 2019/04/20 11:23:16 jmcneill Exp $ */
+/* $NetBSD: efiboot.c,v 1.16 2019/04/21 22:30:41 thorpej Exp $ */
/*-
* Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -56,6 +56,8 @@
EFI_STATUS EFIAPI efi_main(EFI_HANDLE, EFI_SYSTEM_TABLE *);
+prop_dictionary_t efibootplist;
+
EFI_STATUS EFIAPI
efi_main(EFI_HANDLE imageHandle, EFI_SYSTEM_TABLE *systemTable)
{
@@ -180,6 +182,10 @@
UINTN nentries, mapkey, descsize;
UINT32 descver;
+ if (efibootplist) {
+ prop_object_release(efibootplist);
+ }
+
memmap = LibMemoryMap(&nentries, &mapkey, &descsize, &descver);
status = uefi_call_wrapper(BS->ExitBootServices, 2, IH, mapkey);
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/efiboot.h
--- a/sys/stand/efiboot/efiboot.h Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/efiboot.h Sun Apr 21 22:30:41 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efiboot.h,v 1.9 2018/11/15 23:52:33 jmcneill Exp $ */
+/* $NetBSD: efiboot.h,v 1.10 2019/04/21 22:30:41 thorpej Exp $ */
/*-
* Copyright (c) 2016 Kimihiro Nonaka <nonaka%netbsd.org@localhost>
@@ -35,6 +35,8 @@
#include <loadfile.h>
#include <net.h>
+#include <prop/proplib.h>
+
#include "efiboot_machdep.h"
struct boot_command {
@@ -60,6 +62,8 @@
char *get_initrd_path(void);
int set_dtb_path(const char *);
char *get_dtb_path(void);
+int set_efibootplist_path(const char *);
+char *get_efibootplist_path(void);
/* console.c */
int ischar(void);
@@ -73,6 +77,7 @@
void efi_delay(int);
void efi_reboot(void);
extern int howto;
+extern prop_dictionary_t efibootplist;
/* efichar.c */
size_t ucs2len(const CHAR16 *);
@@ -101,6 +106,7 @@
/* exec.c */
int exec_netbsd(const char *, const char *);
+void load_efibootplist(bool);
/* panic.c */
__dead VOID Panic(IN CHAR16 *, ...);
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/efienv.c
--- a/sys/stand/efiboot/efienv.c Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/efienv.c Sun Apr 21 22:30:41 2019 +0000
@@ -1,6 +1,7 @@
-/* $NetBSD: efienv.c,v 1.3 2019/03/30 12:47:53 jmcneill Exp $ */
+/* $NetBSD: efienv.c,v 1.4 2019/04/21 22:30:41 thorpej Exp $ */
/*-
+ * Copyright (c) 2019 Jason R. Thorpe
* Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
* All rights reserved.
*
@@ -35,6 +36,69 @@
static EFI_GUID EfibootVendorGuid = EFIBOOT_VENDOR_GUID;
void
+efi_env_from_efibootplist(void)
+{
+ /*
+ * We support pre-loading the EFI environment from efiboot.plist
+ * using the following schema:
+ *
+ * <key>environment-variables</key>
+ * <dict>
+ * <key>varname1</key>
+ * <string>value_for_varname1</string>
+ * <key>varname2</key>
+ * <string>value_for_varname2</string>
+ * </dict>
+ *
+ * Only string values are supported.
+ */
+ prop_dictionary_t environment;
+ prop_dictionary_keysym_t key;
+ prop_string_t value;
+ prop_object_iterator_t iter;
+
+ const char *env_key;
+ char *env_value;
+
+ environment = prop_dictionary_get(efibootplist,
+ "environment-variables");
+ if (environment == NULL)
+ return;
+
+ iter = prop_dictionary_iterator(environment);
+ if (iter == NULL)
+ goto failed;
+
+ while ((key = prop_object_iterator_next(iter)) != NULL) {
+ value = prop_dictionary_get_keysym(environment, key);
+ if (value == NULL) {
+ printf("boot: env: failed to get value for '%s'\n",
+ prop_dictionary_keysym_cstring_nocopy(key));
+ continue;
+ }
+ if (prop_object_type(value) != PROP_TYPE_STRING) {
+ printf("boot: env: value for '%s' is not a string\n",
+ prop_dictionary_keysym_cstring_nocopy(key));
+ continue;
+ }
+ /* XXX __UNCONST because gnuefi */
+ env_key = prop_dictionary_keysym_cstring_nocopy(key);;
+ env_value = __UNCONST(prop_string_cstring_nocopy(value));;
+#ifdef EFIBOOT_DEBUG
+ printf(">> efiboot.plist env: '%s' = '%s'\n", env_key,
+ env_value);
+#endif
+ efi_env_set(env_key, env_value);
+ }
+ prop_object_iterator_release(iter);
+
+ return;
+
+ failed:
+ printf("boot: failed to load environment from efiboot.plist");
+}
+
+void
efi_env_set(const char *key, char *val)
{
EFI_STATUS status;
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/efienv.h
--- a/sys/stand/efiboot/efienv.h Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/efienv.h Sun Apr 21 22:30:41 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efienv.h,v 1.1 2018/09/09 17:55:22 jmcneill Exp $ */
+/* $NetBSD: efienv.h,v 1.2 2019/04/21 22:30:41 thorpej Exp $ */
/*-
* Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -26,6 +26,7 @@
* SUCH DAMAGE.
*/
+void efi_env_from_efibootplist(void);
void efi_env_set(const char *, char *);
char *efi_env_get(const char *);
void efi_env_clear(const char *);
diff -r 620949db4be5 -r d476f481bd81 sys/stand/efiboot/efifdt.c
--- a/sys/stand/efiboot/efifdt.c Sun Apr 21 21:52:09 2019 +0000
+++ b/sys/stand/efiboot/efifdt.c Sun Apr 21 22:30:41 2019 +0000
@@ -1,6 +1,7 @@
-/* $NetBSD: efifdt.c,v 1.14 2018/11/15 23:52:33 jmcneill Exp $ */
Home |
Main Index |
Thread Index |
Old Index