diff options
author | smh <smh@FreeBSD.org> | 2016-02-11 17:57:42 +0000 |
---|---|---|
committer | smh <smh@FreeBSD.org> | 2016-02-11 17:57:42 +0000 |
commit | ccc782c04f57c64aad716172eab8bfd8592306a6 (patch) | |
tree | cd19c9c66c6494b4787ba57e8eaf01d7a3aeb1d7 /sys/boot | |
parent | a4298d06ff2c7a1d71ae0e7afb0020724d8866f2 (diff) | |
download | FreeBSD-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.c | 38 |
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; } } |