summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authorsmh <smh@FreeBSD.org>2016-02-11 17:57:42 +0000
committersmh <smh@FreeBSD.org>2016-02-11 17:57:42 +0000
commitccc782c04f57c64aad716172eab8bfd8592306a6 (patch)
treecd19c9c66c6494b4787ba57e8eaf01d7a3aeb1d7 /sys/boot
parenta4298d06ff2c7a1d71ae0e7afb0020724d8866f2 (diff)
downloadFreeBSD-src-ccc782c04f57c64aad716172eab8bfd8592306a6.zip
FreeBSD-src-ccc782c04f57c64aad716172eab8bfd8592306a6.tar.gz
MFC r294768:
Process /boot/config and /boot.config during EFI boot Approved by: re (marius) Sponsored by: Multiplay
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/efi/boot1/boot1.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/sys/boot/efi/boot1/boot1.c b/sys/boot/efi/boot1/boot1.c
index 0aa6c5b..c326c79 100644
--- a/sys/boot/efi/boot1/boot1.c
+++ b/sys/boot/efi/boot1/boot1.c
@@ -91,13 +91,41 @@ Free(void *buf, const char *file __unused, int line __unused)
void
try_load(const boot_module_t *mod)
{
- size_t bufsize;
+ size_t bufsize, cmdsize;
void *buf;
+ char *cmd;
dev_info_t *dev;
EFI_HANDLE loaderhandle;
EFI_LOADED_IMAGE *loaded_image;
EFI_STATUS status;
+ /*
+ * Read in and parse the command line from /boot.config or /boot/config,
+ * if present. We'll pass it the next stage via a simple ASCII
+ * string. loader.efi has a hack for ASCII strings, so we'll use that to
+ * keep the size down here. We only try to read the alternate file if
+ * we get EFI_NOT_FOUND because all other errors mean that the boot_module
+ * had troubles with the filesystem. We could return early, but we'll let
+ * loading the actual kernel sort all that out. Since these files are
+ * optional, we don't report errors in trying to read them.
+ */
+ cmd = NULL;
+ cmdsize = 0;
+ status = mod->load(PATH_DOTCONFIG, &dev, &buf, &bufsize);
+ if (status == EFI_NOT_FOUND)
+ status = mod->load(PATH_CONFIG, &dev, &buf, &bufsize);
+ if (status == EFI_SUCCESS) {
+ cmdsize = bufsize + 1;
+ cmd = malloc(cmdsize);
+ if (cmd == NULL) {
+ free(buf);
+ return;
+ }
+ memcpy(cmd, buf, bufsize);
+ cmd[bufsize] = '\0';
+ free(buf);
+ }
+
status = mod->load(PATH_LOADER_EFI, &dev, &buf, &bufsize);
if (status == EFI_NOT_FOUND)
return;
@@ -115,6 +143,9 @@ try_load(const boot_module_t *mod)
return;
}
+ if (cmd != NULL)
+ printf(" command args: %s\n", cmd);
+
if ((status = bs->HandleProtocol(loaderhandle, &LoadedImageGUID,
(VOID**)&loaded_image)) != EFI_SUCCESS) {
printf("Failed to query LoadedImage provided by %s (%lu)\n",
@@ -123,11 +154,16 @@ try_load(const boot_module_t *mod)
}
loaded_image->DeviceHandle = dev->devhandle;
+ loaded_image->LoadOptionsSize = cmdsize;
+ loaded_image->LoadOptions = cmd;
if ((status = bs->StartImage(loaderhandle, NULL, NULL)) !=
EFI_SUCCESS) {
printf("Failed to start image provided by %s (%lu)\n",
mod->name, EFI_ERROR_CODE(status));
+ free(cmd);
+ loaded_image->LoadOptionsSize = 0;
+ loaded_image->LoadOptions = NULL;
return;
}
}
OpenPOWER on IntegriCloud