From 58e5069ee34edd585ca11dfa387bd122d45995aa Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Mon, 28 Nov 2016 14:00:45 -0800 Subject: rmc: integration update This is a whole package of rmc work in meta-intel to reflect some major changes in the upstream project: In rmc.bb recipe, EFI_ARCH, path of EFI header files, and dependency on gnu-efi are removed with the updated revision. In systemd-boot, patches to integrate with rmc are re-worked mainly because of new APIs. Size of patches are smaller than the previous implementation. Notice we still use multiple APIs instead of calling an one-step interface multiple times, to get some potential runtime performance benefit. (rmc tool in user space is changed to use single API in the upstream project.) Fixes [YOCTO #10086] Fixes [YOCTO #10671] Signed-off-by: Jianxun Zhang Signed-off-by: Saul Wold --- common/recipes-bsp/rmc/rmc.bb | 20 ++------ .../recipes-bsp/systemd-boot/systemd-boot.bbappend | 4 +- ...d-boot-Link-RMC-libraries-into-bootloader.patch | 31 ------------ ...-sd-boot-Link-RMC-library-into-bootloader.patch | 31 ++++++++++++ ...d-board-specific-boot-entries-from-RMC-da.patch | 55 +++++++++------------- ...pport-global-kernel-command-line-fragment.patch | 10 ++-- 6 files changed, 64 insertions(+), 87 deletions(-) delete mode 100644 common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-libraries-into-bootloader.patch create mode 100644 common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-library-into-bootloader.patch (limited to 'common/recipes-bsp') diff --git a/common/recipes-bsp/rmc/rmc.bb b/common/recipes-bsp/rmc/rmc.bb index f69b41a0..8c89a99c 100644 --- a/common/recipes-bsp/rmc/rmc.bb +++ b/common/recipes-bsp/rmc/rmc.bb @@ -14,33 +14,23 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=838c366f69b72c5df05c96dff79b35f2" SRC_URI = "git://git.yoctoproject.org/rmc" -SRCREV = "2e38d056f86c0457f3a5ca7ef848545bbb190e47" +SRCREV = "4799cb89b543712390d863a6fc50a58881590fa2" S = "${WORKDIR}/git" -DEPENDS_class-target = "gnu-efi" - COMPATIBLE_HOST = "(x86_64.*|i.86.*)-linux*" -EXTRA_OEMAKE='RMC_CFLAGS="-Wl,--hash-style=both"' - -# from gnu-efi, we should align arch-mapping with it. -def rmc_efi_arch(d): - import re - arch = d.getVar("TARGET_ARCH", True) - if re.match("i[3456789]86", arch): - return "ia32" - return arch +TARGET_CFLAGS +="-Wl,--hash-style=both" SECURITY_CFLAGS_remove_class-target = "-fstack-protector-strong" do_compile_class-target() { oe_runmake - oe_runmake RMC_EFI_HEADER_PREFIX=${STAGING_INCDIR}/efi RMC_EFI_ARCH="${@rmc_efi_arch(d)}" -f Makefile.efi + oe_runmake -f Makefile.efi } do_install() { - oe_runmake RMC_EFI_ARCH="${@rmc_efi_arch(d)}" RMC_INSTALL_PREFIX=${D}/usr install - oe_runmake RMC_EFI_ARCH="${@rmc_efi_arch(d)}" RMC_INSTALL_PREFIX=${D}/usr -f Makefile.efi install + oe_runmake RMC_INSTALL_PREFIX=${D}/usr install + oe_runmake RMC_INSTALL_PREFIX=${D}/usr -f Makefile.efi install } do_install_class-native() { diff --git a/common/recipes-bsp/systemd-boot/systemd-boot.bbappend b/common/recipes-bsp/systemd-boot/systemd-boot.bbappend index ed317554..2aecc3f9 100644 --- a/common/recipes-bsp/systemd-boot/systemd-boot.bbappend +++ b/common/recipes-bsp/systemd-boot/systemd-boot.bbappend @@ -2,7 +2,7 @@ DEPENDS_append_intel-x86-common = " rmc" FILESEXTRAPATHS_prepend := "${THISDIR}/systemd-boot:" -EXTRA_OEMAKE_append_intel-x86-common = ' EFI_LDFLAGS="-L${STAGING_DIR_HOST}/usr/lib" EFI_CFLAGS="-I${STAGING_INCDIR}/rmc/efi -DRMC_EFI"' +EXTRA_OEMAKE_append_intel-x86-common = ' EFI_LDFLAGS="-L${STAGING_DIR_HOST}/usr/lib" EFI_CFLAGS="-I${STAGING_INCDIR}/rmc -DRMC_EFI"' # Pin systemd revision down for systemd-boot recipe. # Patches could not be applied cleanly when systemd in OE is updated, @@ -15,7 +15,7 @@ EXTRA_OEMAKE_append_intel-x86-common = ' EFI_LDFLAGS="-L${STAGING_DIR_HOST}/usr/ SRCREV_intel-x86-common = "3a74d4fc90cb322a4784a3515bef7118c8f8c5ba" SRC_URI_append_intel-x86-common = " \ - file://0001-sd-boot-Link-RMC-libraries-into-bootloader.patch \ + file://0001-sd-boot-Link-RMC-library-into-bootloader.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://0001-efi-boot.c-workaround-for-Joule-BIOS-hang.patch \ diff --git a/common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-libraries-into-bootloader.patch b/common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-libraries-into-bootloader.patch deleted file mode 100644 index c8867a24..00000000 --- a/common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-libraries-into-bootloader.patch +++ /dev/null @@ -1,31 +0,0 @@ -From b7775f24928fca01600cac1077ff3f215aa6362d Mon Sep 17 00:00:00 2001 -From: Jianxun Zhang -Date: Sat, 21 May 2016 18:52:07 -0700 -Subject: [PATCH 1/3] sd-boot: Link RMC libraries into bootloader - -Add two RMC libraries into bootloader binary. EFI stub is not changed -until we really need rmc in stub. - -Upstream-Status: Pending - -Signed-off-by: Jianxun Zhang ---- - Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile.am b/Makefile.am -index 305099a..ff21ebd 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -2802,7 +2802,7 @@ $(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(t - - $(systemd_boot_solib): $(systemd_boot_objects) - $(AM_V_CCLD)$(LD) $(efi_ldflags) $(systemd_boot_objects) \ -- -o $@ -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name); \ -+ -o $@ -lefi -lgnuefi -lrmclefi -lrsmpefi $(shell $(CC) -print-libgcc-file-name); \ - nm -D -u $@ | grep ' U ' && exit 1 || : - - $(systemd_boot): $(systemd_boot_solib) --- -2.7.4 - diff --git a/common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-library-into-bootloader.patch b/common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-library-into-bootloader.patch new file mode 100644 index 00000000..626efce8 --- /dev/null +++ b/common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-library-into-bootloader.patch @@ -0,0 +1,31 @@ +From 1ccd031ce97501f8ee63f39e8794437d568115dc Mon Sep 17 00:00:00 2001 +From: Jianxun Zhang +Date: Sat, 21 May 2016 18:52:07 -0700 +Subject: [PATCH 1/3] sd-boot: Link RMC library into bootloader + +Add RMC library into bootloader binary. EFI stub is not changed +until we really need rmc in stub. + +Upstream-Status: Pending + +Signed-off-by: Jianxun Zhang +--- + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.am b/Makefile.am +index 305099a..df176a5 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -2802,7 +2802,7 @@ $(top_builddir)/src/boot/efi/%.o: $(top_srcdir)/src/boot/efi/%.c $(addprefix $(t + + $(systemd_boot_solib): $(systemd_boot_objects) + $(AM_V_CCLD)$(LD) $(efi_ldflags) $(systemd_boot_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 || : + + $(systemd_boot): $(systemd_boot_solib) +-- +2.7.4 + diff --git a/common/recipes-bsp/systemd-boot/systemd-boot/0002-sd-boot-Load-board-specific-boot-entries-from-RMC-da.patch b/common/recipes-bsp/systemd-boot/systemd-boot/0002-sd-boot-Load-board-specific-boot-entries-from-RMC-da.patch index ddad940b..e88012c3 100644 --- a/common/recipes-bsp/systemd-boot/systemd-boot/0002-sd-boot-Load-board-specific-boot-entries-from-RMC-da.patch +++ b/common/recipes-bsp/systemd-boot/systemd-boot/0002-sd-boot-Load-board-specific-boot-entries-from-RMC-da.patch @@ -1,4 +1,4 @@ -From f714cdc84b791d84099f7461c4f223677456720f Mon Sep 17 00:00:00 2001 +From a3c4fc8c2847fe289a617bcba1d905f580f0e18d Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Wed, 1 Jun 2016 16:32:22 -0700 Subject: [PATCH 2/3] sd-boot: Load board-specific boot entries from RMC @@ -39,23 +39,22 @@ Upstream-Status: Pending Signed-off-by: Jianxun Zhang --- - src/boot/efi/boot.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 158 insertions(+), 2 deletions(-) + src/boot/efi/boot.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 145 insertions(+), 2 deletions(-) diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c -index 30c1ead..43b0793 100644 +index 30c1ead..d1b029b 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c -@@ -15,6 +15,8 @@ +@@ -15,6 +15,7 @@ #include #include -+#include -+#include ++#include #include "console.h" #include "disk.h" -@@ -33,6 +35,9 @@ static const char __attribute__((used)) magic[] = "#### LoaderInfo: systemd-boot +@@ -33,6 +34,9 @@ static const char __attribute__((used)) magic[] = "#### LoaderInfo: systemd-boot static const EFI_GUID global_guid = EFI_GLOBAL_VARIABLE; @@ -65,7 +64,7 @@ index 30c1ead..43b0793 100644 enum loader_type { LOADER_UNDEFINED, LOADER_EFI, -@@ -1702,6 +1707,148 @@ static VOID config_free(Config *config) { +@@ -1702,6 +1706,136 @@ static VOID config_free(Config *config) { FreePool(config->entry_oneshot); } @@ -123,13 +122,8 @@ index 30c1ead..43b0793 100644 + * this function returns 0. + */ + -+static UINTN rmc_initialize(EFI_FILE *root_dir, CHAR8 **db, rmc_fingerprint_t **fp) { ++static UINTN rmc_initialize(EFI_FILE *root_dir, EFI_SYSTEM_TABLE *sys_table, CHAR8 **db, rmc_fingerprint_t **fp) { + UINTN len; -+ EFI_GUID smbios_guid = SMBIOS_TABLE_GUID; -+ EFI_GUID smbios3_guid = SMBIOS3_TABLE_GUID; -+ VOID *smbios_entry = NULL; -+ UINT64 smbios_struct_addr = 0; -+ UINT16 smbios_struct_len = 0; + UINTN ret = 1; + + if (!db || !fp) @@ -144,18 +138,11 @@ index 30c1ead..43b0793 100644 + if (len <= 0) + goto done; + -+ /* locate smbios entry table, try both 32 and 64 bit */ -+ if (LibGetSystemConfigurationTable(&smbios3_guid, &smbios_entry) != EFI_SUCCESS -+ && LibGetSystemConfigurationTable(&smbios_guid, &smbios_entry) != EFI_SUCCESS) -+ goto done; -+ -+ /* call rsmp to get fp */ -+ if (rsmp_get_smbios_strcut(smbios_entry, &smbios_struct_addr, &smbios_struct_len)) -+ goto done; -+ + *fp = AllocateZeroPool(sizeof(rmc_fingerprint_t)); -+ -+ if (rsmp_get_fingerprint_from_smbios_struct((BYTE *) smbios_struct_addr, *fp)) ++ /* call rmc to get fingerprint. We will use single-action rmc APIs to query multiple files. ++ * This should bring a better performance than calling double-action rmc API every time. ++ */ ++ if (rmc_get_fingerprint(sys_table, *fp)) + goto done; + + ret = 0; @@ -174,7 +161,7 @@ index 30c1ead..43b0793 100644 +static BOOLEAN config_load_rmc_entries(Config *config, EFI_HANDLE *device, CHAR16 *loaded_image_path, CHAR8 *db, rmc_fingerprint_t *fp) { + CHAR8 *boot_entry = NULL; + CHAR8 *boot_config = NULL; -+ rmc_policy_file_t rp; ++ rmc_file_t rp; + CHAR8 *line; + UINT64 pos = 0; + BOOLEAN ret = FALSE; @@ -183,7 +170,7 @@ index 30c1ead..43b0793 100644 + return ret; + + /* query boot entry config file */ -+ if (query_policy_from_db(fp, db, RMC_POLICY_BLOB, "BOOTENTRY.CONFIG", &rp)) ++ if (rmc_query_file_by_fp(fp, db, "BOOTENTRY.CONFIG", &rp)) + return ret; + + /* file blob read from rmc db is not necessarily null-terminated, and we @@ -194,7 +181,7 @@ index 30c1ead..43b0793 100644 + boot_config[rp.blob_len] = '\0'; + /* parse boot entry config */ + while ((line = get_line(boot_config, &pos))) { -+ if (query_policy_from_db(fp, db, RMC_POLICY_BLOB, (char *)line, &rp)) ++ if (rmc_query_file_by_fp(fp, db, (char *)line, &rp)) + continue; + if (rp.blob_len > 0) { + boot_entry = AllocatePool(rp.blob_len * sizeof(CHAR8) + 1); @@ -214,7 +201,7 @@ index 30c1ead..43b0793 100644 EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { CHAR16 *s; CHAR8 *b; -@@ -1714,6 +1861,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { +@@ -1714,6 +1848,7 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { UINT64 init_usec; BOOLEAN menu = FALSE; CHAR16 uuid[37]; @@ -222,16 +209,16 @@ index 30c1ead..43b0793 100644 InitializeLib(image, sys_table); init_usec = time_usec(); -@@ -1745,6 +1893,8 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { +@@ -1745,6 +1880,8 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { return EFI_LOAD_ERROR; } + /* Initialize rmc before loading any config */ -+ rmc_initialize(root_dir, &rmc_db, &rmc_fp); ++ rmc_initialize(root_dir, sys_table, &rmc_db, &rmc_fp); /* the filesystem path to this image, to prevent adding ourselves to the menu */ loaded_image_path = DevicePathToStr(loaded_image->FilePath); -@@ -1753,11 +1903,15 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { +@@ -1753,11 +1890,15 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { ZeroMem(&config, sizeof(Config)); config_load_defaults(&config, root_dir); @@ -249,7 +236,7 @@ index 30c1ead..43b0793 100644 /* sort entries after version number */ config_sort_entries(&config); -@@ -1851,6 +2005,8 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { +@@ -1851,6 +1992,8 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { out: FreePool(loaded_image_path); config_free(&config); diff --git a/common/recipes-bsp/systemd-boot/systemd-boot/0003-sd-boot-Support-global-kernel-command-line-fragment.patch b/common/recipes-bsp/systemd-boot/systemd-boot/0003-sd-boot-Support-global-kernel-command-line-fragment.patch index 6d077f19..a4b63557 100644 --- a/common/recipes-bsp/systemd-boot/systemd-boot/0003-sd-boot-Support-global-kernel-command-line-fragment.patch +++ b/common/recipes-bsp/systemd-boot/systemd-boot/0003-sd-boot-Support-global-kernel-command-line-fragment.patch @@ -1,4 +1,4 @@ -From a38be4fe8ffed142abbba92f7ad91a8f7b8f1ace Mon Sep 17 00:00:00 2001 +From 1e33f99e13a70c19c1f63f6ef1c5522a09adece6 Mon Sep 17 00:00:00 2001 From: Jianxun Zhang Date: Mon, 20 Jun 2016 13:08:20 -0700 Subject: [PATCH 3/3] sd-boot: Support global kernel command line fragment @@ -17,10 +17,10 @@ Signed-off-by: Jianxun Zhang 1 file changed, 34 insertions(+) diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c -index 43b0793..3dcd9a5 100644 +index d1b029b..8dffc48 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c -@@ -847,6 +847,40 @@ static VOID config_add_entry(Config *config, ConfigEntry *entry) { +@@ -846,6 +846,40 @@ static VOID config_add_entry(Config *config, ConfigEntry *entry) { config->entries = ReallocatePool(config->entries, sizeof(VOID *) * config->entry_count, sizeof(VOID *) * i); } @@ -29,9 +29,9 @@ index 43b0793..3dcd9a5 100644 + * we put appending global command line here to cover both of two cases. + */ + if (entry->type == LOADER_LINUX && rmc_db && rmc_fp) { -+ rmc_policy_file_t rmc_kp; ++ rmc_file_t rmc_kp; + -+ if (!query_policy_from_db(rmc_fp, rmc_db, RMC_POLICY_BLOB, "KBOOTPARAM", &rmc_kp)) { ++ if (!rmc_query_file_by_fp(rmc_fp, rmc_db, "KBOOTPARAM", &rmc_kp)) { + CHAR8 *cmdline; + CHAR16 *s; + CHAR16 *t; -- cgit v1.2.3-54-g00ecf