[meta-intel] [PATCH 1/2] rmc: integration update
Jianxun Zhang
jianxun.zhang at linux.intel.com
Mon Nov 28 14:00:45 PST 2016
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 <jianxun.zhang at linux.intel.com>
---
For 10671 I believe I have fixed compiling issue with musl at
my side. Please let me know if the orginal reporter still see
the issue. (Alejandro Hernandez)
Thanks
common/recipes-bsp/rmc/rmc.bb | 20 ++------
.../recipes-bsp/systemd-boot/systemd-boot.bbappend | 4 +-
...sd-boot-Link-RMC-library-into-bootloader.patch} | 10 ++--
...d-board-specific-boot-entries-from-RMC-da.patch | 55 +++++++++-------------
...pport-global-kernel-command-line-fragment.patch | 10 ++--
5 files changed, 38 insertions(+), 61 deletions(-)
rename common/recipes-bsp/systemd-boot/systemd-boot/{0001-sd-boot-Link-RMC-libraries-into-bootloader.patch => 0001-sd-boot-Link-RMC-library-into-bootloader.patch} (70%)
diff --git a/common/recipes-bsp/rmc/rmc.bb b/common/recipes-bsp/rmc/rmc.bb
index aeaf12e..41062bf 100644
--- a/common/recipes-bsp/rmc/rmc.bb
+++ b/common/recipes-bsp/rmc/rmc.bb
@@ -14,32 +14,22 @@ 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"
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 ed31755..2aecc3f 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-library-into-bootloader.patch
similarity index 70%
rename from common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-libraries-into-bootloader.patch
rename to common/recipes-bsp/systemd-boot/systemd-boot/0001-sd-boot-Link-RMC-library-into-bootloader.patch
index c8867a2..626efce 100644
--- 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-library-into-bootloader.patch
@@ -1,9 +1,9 @@
-From b7775f24928fca01600cac1077ff3f215aa6362d Mon Sep 17 00:00:00 2001
+From 1ccd031ce97501f8ee63f39e8794437d568115dc Mon Sep 17 00:00:00 2001
From: Jianxun Zhang <jianxun.zhang at linux.intel.com>
Date: Sat, 21 May 2016 18:52:07 -0700
-Subject: [PATCH 1/3] sd-boot: Link RMC libraries into bootloader
+Subject: [PATCH 1/3] sd-boot: Link RMC library into bootloader
-Add two RMC libraries into bootloader binary. EFI stub is not changed
+Add RMC library into bootloader binary. EFI stub is not changed
until we really need rmc in stub.
Upstream-Status: Pending
@@ -14,7 +14,7 @@ Signed-off-by: Jianxun Zhang <jianxun.zhang at linux.intel.com>
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
-index 305099a..ff21ebd 100644
+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
@@ -22,7 +22,7 @@ index 305099a..ff21ebd 100644
$(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); \
++ -o $@ -lefi -lgnuefi -lrmcefi $(shell $(CC) -print-libgcc-file-name); \
nm -D -u $@ | grep ' U ' && exit 1 || :
$(systemd_boot): $(systemd_boot_solib)
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 ddad940..e88012c 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 <jianxun.zhang at linux.intel.com>
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 <jianxun.zhang at linux.intel.com>
---
- 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 <efi.h>
#include <efilib.h>
-+#include <rmcl.h>
-+#include <rsmp.h>
++#include <rmc_api.h>
#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 6d077f1..a4b6355 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 <jianxun.zhang at linux.intel.com>
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 <jianxun.zhang at linux.intel.com>
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;
--
2.7.4
More information about the meta-intel
mailing list