[meta-intel] [PATCH RFC 1/4] systemd-boot: Add patch to systemd boot stub to fix kernel command line

California Sullivan california.l.sullivan at intel.com
Fri Jun 9 18:30:53 PDT 2017


As is, invoking the executable through the EFI shell causes the kernel
command line to be replaced. Typing "bootx64" as we often do, causes the
kernel command line to be replaced with just "bootx64", for example.
This causes a boot failure since no root is defined. In addition, some
boards, such as the Galileo, have garbage data in LoadOptions, which
will also replace the command line and cause a boot failure.

There are two options to solve the issue. We could either completely
disable the block that checks for LoadOptions data to replace the
command line with, or we can append the data from LoadOptions to the
kernel command line. The former would be a lot cleaner, especially in
cases like the Galileo which have garbage data in LoadOptions, but it
would also disable to ability to modify the command line on the fly,
making it much less useful for debugging or bringing up a new board. The
latter results in some useless information ending up on the kernel
command line, but it does keep some flexibility in the system.

This patch implements the latter option.

Signed-off-by: California Sullivan <california.l.sullivan at intel.com>
---
 ...ub-append-LoadOptions-to-command-line-ins.patch | 55 ++++++++++++++++++++++
 .../systemd-boot/systemd-boot_%.bbappend           |  1 +
 2 files changed, 56 insertions(+)
 create mode 100644 common/recipes-bsp/systemd-boot/systemd-boot/0001-boot-efi-stub-append-LoadOptions-to-command-line-ins.patch

diff --git a/common/recipes-bsp/systemd-boot/systemd-boot/0001-boot-efi-stub-append-LoadOptions-to-command-line-ins.patch b/common/recipes-bsp/systemd-boot/systemd-boot/0001-boot-efi-stub-append-LoadOptions-to-command-line-ins.patch
new file mode 100644
index 0000000..94a4f60
--- /dev/null
+++ b/common/recipes-bsp/systemd-boot/systemd-boot/0001-boot-efi-stub-append-LoadOptions-to-command-line-ins.patch
@@ -0,0 +1,55 @@
+From 726a1722d30376d2e30561854809edfb05e34047 Mon Sep 17 00:00:00 2001
+From: California Sullivan <california.l.sullivan at intel.com>
+Date: Wed, 12 Apr 2017 11:10:52 -0700
+Subject: [PATCH] boot: efi: stub: append LoadOptions to command line instead
+ of replace
+
+Upstream-status: Inappropriate
+
+This patch changes systemd-boot's stub program to append LoadOptions to
+the command line instead of replace. This way, calling the binary from
+the shell does not get rid of any kernel command line built in to the
+binary.
+
+Signed-off-by: California Sullivan <california.l.sullivan at intel.com>
+---
+ src/boot/efi/stub.c | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c
+index 74e95fd..f8f3e95 100644
+--- a/src/boot/efi/stub.c
++++ b/src/boot/efi/stub.c
+@@ -94,14 +94,26 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
+         if (!secure && loaded_image->LoadOptionsSize > 0 && *(CHAR16 *)loaded_image->LoadOptions != 0) {
+                 CHAR16 *options;
+                 CHAR8 *line;
++                UINTN options_len;
++                UINTN total_len;
+                 UINTN i;
++                UINTN j;
+ 
+                 options = (CHAR16 *)loaded_image->LoadOptions;
+-                cmdline_len = (loaded_image->LoadOptionsSize / sizeof(CHAR16)) * sizeof(CHAR8);
+-                line = AllocatePool(cmdline_len);
++                options_len = (loaded_image->LoadOptionsSize / sizeof(CHAR16)) * sizeof(CHAR8);
++                total_len = cmdline_len + options_len + 1;
++                line = AllocatePool(total_len);
++
+                 for (i = 0; i < cmdline_len; i++)
+-                        line[i] = options[i];
++                        line[i] = cmdline[i];
++
++                line[i++] = ' ';
++
++                for (j = 0; j < options_len && i + j < total_len; j++)
++                        line[i + j] = options[j];
++
+                 cmdline = line;
++                cmdline_len = total_len;
+ 
+ #ifdef SD_BOOT_LOG_TPM
+                 /* Try to log any options to the TPM, escpecially manually edited options */
+-- 
+2.5.5
+
diff --git a/common/recipes-bsp/systemd-boot/systemd-boot_%.bbappend b/common/recipes-bsp/systemd-boot/systemd-boot_%.bbappend
index 98eaf45..f13763b 100644
--- a/common/recipes-bsp/systemd-boot/systemd-boot_%.bbappend
+++ b/common/recipes-bsp/systemd-boot/systemd-boot_%.bbappend
@@ -21,6 +21,7 @@ SRC_URI_append_intel-x86-common = " \
             file://0004-sd-boot-Support-global-kernel-command-line-fragment-in-EFI-stub.patch \
             file://0001-efi-boot.c-workaround-for-Joule-BIOS-hang.patch \
             file://0001-sd-boot-stub-check-LoadOptions-contains-data.patch \
+            file://0001-boot-efi-stub-append-LoadOptions-to-command-line-ins.patch \
             "
 
 PACKAGE_ARCH_intel-x86-common = "${INTEL_COMMON_PACKAGE_ARCH}"
-- 
2.5.5



More information about the meta-intel mailing list