systemd-boot: use RMC database in EFI stub

systemd-boot's EFI stub can be built in an EFI executable
with the kernel, cmdline, and initrd.

This commit enables the EFI stub code to use the RMC database
and appends the board specific cmdline (KBOOTPARAM) to the
built-in cmdline.

Signed-off-by: Mikko Ylinen <mikko.ylinen@intel.com>
Signed-off-by: California Sullivan <california.l.sullivan@intel.com>
This commit is contained in:
Mikko Ylinen 2017-01-27 15:36:00 +02:00 committed by California Sullivan
parent a020ceb2ae
commit 7fba4baa0e
3 changed files with 99 additions and 9 deletions

View File

@ -1,20 +1,19 @@
From 1ccd031ce97501f8ee63f39e8794437d568115dc Mon Sep 17 00:00:00 2001 From fe1c2fdfe81f2ac2b41fe8543ba07f1911770d26 Mon Sep 17 00:00:00 2001
From: Jianxun Zhang <jianxun.zhang@linux.intel.com> From: Jianxun Zhang <jianxun.zhang@linux.intel.com>
Date: Sat, 21 May 2016 18:52:07 -0700 Date: Sat, 21 May 2016 18:52:07 -0700
Subject: [PATCH 1/3] sd-boot: Link RMC library into bootloader Subject: [PATCH] sd-boot: Link RMC library into bootloader and stub
Add RMC library into bootloader binary. EFI stub is not changed Add RMC library into bootloader binary and stub.
until we really need rmc in stub.
Upstream-Status: Pending Upstream-Status: Pending
Signed-off-by: Jianxun Zhang <jianxun.zhang@linux.intel.com> Signed-off-by: Jianxun Zhang <jianxun.zhang@linux.intel.com>
--- ---
Makefile.am | 2 +- Makefile.am | 4 ++--
1 file changed, 1 insertion(+), 1 deletion(-) 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Makefile.am b/Makefile.am diff --git a/Makefile.am b/Makefile.am
index 305099a..df176a5 100644 index 305099ab6..9fb6f9b7b 100644
--- a/Makefile.am --- a/Makefile.am
+++ b/Makefile.am +++ b/Makefile.am
@@ -2802,7 +2802,7 @@ $(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(t @@ -2802,7 +2802,7 @@ $(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(t
@ -26,6 +25,15 @@ index 305099a..df176a5 100644
nm -D -u $@ | grep ' U ' && exit 1 || : nm -D -u $@ | grep ' U ' && exit 1 || :
$(systemd_boot): $(systemd_boot_solib) $(systemd_boot): $(systemd_boot_solib)
-- @@ -2852,7 +2852,7 @@ $(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(t
2.7.4
$(stub_solib): $(stub_objects)
$(AM_V_CCLD)$(LD) $(efi_ldflags) $(stub_objects) \
- -o $@ -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name); \
+ -o $@ -lefi -lgnuefi -lrmcefi $(shell $(CC) -print-libgcc-file-name); \
nm -D -u $@ | grep ' U ' && exit 1 || :
$(stub): $(stub_solib)
--
2.11.0

View File

@ -0,0 +1,81 @@
From 4cb9c65ea9c0eba3ba04d036dccd4a5ab3d2547b Mon Sep 17 00:00:00 2001
From: Mikko Ylinen <mikko.ylinen@intel.com>
Date: Fri, 27 Jan 2017 13:31:45 +0200
Subject: [PATCH] sd-boot: support global kernel command line in EFI stub
This change integrates rmc into EFI stub and supports a
global fragment (RMC KBOOTPARAM) that is appended to the
cmdline at boot.
The fragment is board-specific and read from the database.
Implements [YOCTO #10924].
Upstream-status: Pending
Signed-off-by: Mikko Ylinen <mikko.ylinen@intel.com>
---
src/boot/efi/stub.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c
index 1e250f34f..f3865199f 100644
--- a/src/boot/efi/stub.c
+++ b/src/boot/efi/stub.c
@@ -13,6 +13,7 @@
#include <efi.h>
#include <efilib.h>
+#include <rmc_api.h>
#include "disk.h"
#include "graphics.h"
@@ -48,6 +49,9 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
UINTN cmdline_len;
CHAR16 uuid[37];
EFI_STATUS err;
+ INTN len;
+ CHAR8 *rmc_db = NULL;
+ rmc_file_t rmc_file;
InitializeLib(image, sys_table);
@@ -112,6 +116,35 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
#endif
}
+ len = file_read(root_dir, L"\\rmc.db", 0, 0, &rmc_db);
+ if (len <= 0)
+ rmc_db = NULL;
+
+ /* If the board has a fragment in rmc database, append it to the cmdline */
+ if (rmc_db && !rmc_gimme_file(sys_table, rmc_db, "KBOOTPARAM", &rmc_file)) {
+ CHAR8 *line;
+ UINTN i = 0;
+ UINTN j;
+
+ line = AllocatePool(rmc_file.blob_len + cmdline_len + 2);
+
+ while (i < cmdline_len && cmdline[i] != '\0') {
+ line[i] = cmdline[i];
+ i++;
+ }
+
+ line[i++] = ' ';
+
+ for (j=0; j < rmc_file.blob_len; j++)
+ line[i+j] = rmc_file.blob[j];
+ line[i+j] = '\0';
+
+ cmdline = line;
+ cmdline_len = i + j;
+
+ FreePool(rmc_db);
+ }
+
/* export the device path this image is started from */
if (disk_get_part_uuid(loaded_image->DeviceHandle, uuid) == EFI_SUCCESS)
efivar_set(L"LoaderDevicePartUUID", uuid, FALSE);
--
2.11.0

View File

@ -15,9 +15,10 @@ EXTRA_OEMAKE_append_intel-x86-common = ' EFI_LDFLAGS="-L${STAGING_DIR_HOST}/usr/
SRCREV_intel-x86-common = "a1e2ef7ec912902d8142e7cb5830cbfb47dba86c" SRCREV_intel-x86-common = "a1e2ef7ec912902d8142e7cb5830cbfb47dba86c"
SRC_URI_append_intel-x86-common = " \ SRC_URI_append_intel-x86-common = " \
file://0001-sd-boot-Link-RMC-library-into-bootloader.patch \ file://0001-sd-boot-Link-RMC-library-into-bootloader-and-stub.patch \
file://0002-sd-boot-Load-board-specific-boot-entries-from-RMC-da.patch \ file://0002-sd-boot-Load-board-specific-boot-entries-from-RMC-da.patch \
file://0003-sd-boot-Support-global-kernel-command-line-fragment.patch \ file://0003-sd-boot-Support-global-kernel-command-line-fragment.patch \
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-efi-boot.c-workaround-for-Joule-BIOS-hang.patch \
" "