diff --git a/classes/rmc-systemd-boot.bbclass b/classes/rmc-systemd-boot.bbclass new file mode 100644 index 00000000..ad2cf106 --- /dev/null +++ b/classes/rmc-systemd-boot.bbclass @@ -0,0 +1,12 @@ +# rmc-systemd-boot bbclass +# Deploy central RMC database file to ESP + +IMAGE_INSTALL_append = " rmc" + +inherit systemd-boot + +do_bootimg[depends] += "${MLPREFIX}rmc-db:do_deploy" + +efi_populate_append() { + install -m 0400 ${DEPLOY_DIR_IMAGE}/rmc.db ${DEST}/rmc.db +} diff --git a/common/recipes-bsp/rmc/rmc-db.bb b/common/recipes-bsp/rmc/rmc-db.bb new file mode 100644 index 00000000..14553af0 --- /dev/null +++ b/common/recipes-bsp/rmc/rmc-db.bb @@ -0,0 +1,48 @@ +SUMMARY = "Central RMC Database" +DESCRIPTION = "Generate a centralized RMC database for RMC feature. \ +Fingerprints and data for all boards supported are specified by variable \ +RMC_BOARD_DATA_DIRS which is a list of top directories that contains \ +subdirectories for boards. Developers can add their top directories by appending \ +them to this variable in a rmc-db.bbappend.Refer to rmc-db bbclass for more \ +information." + +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690" + +S = "${WORKDIR}" + +inherit rmc-db + +RMC_BOARD_DATA_DIRS_append := " ${THISDIR}/boards/" +RMC_DB_DIR = "${WORKDIR}/db" + +# Let sstate be aware of change in any added board directories +do_generate_rmc_db[file-checksums] = "${@get_rmc_top_dirs_list(d)}" + +# derived from get_lic_checksum_file_list(d) in base.bbclass in OE +def get_rmc_top_dirs_list(d): + dirlist = [] + dirs = d.getVar("RMC_BOARD_DATA_DIRS", True) or '' + topdirs = dirs.split() + for each in topdirs: + dirlist.append(each + ":" + str(os.path.exists(each))) + return " ".join(dirlist) + +do_generate_rmc_db () { + rmc_generate_db "${RMC_BOARD_DATA_DIRS}" "${RMC_DB_DIR}"/rmc.db +} + +addtask generate_rmc_db after do_compile + +inherit deploy + +do_deploy () { + if [ -f ${RMC_DB_DIR}/rmc.db ]; then + install -m 0400 ${RMC_DB_DIR}/rmc.db ${DEPLOYDIR} + else + echo "Warning: no RMC central database found, skip deployment." + fi +} + +addtask deploy after do_generate_rmc_db diff --git a/conf/layer.conf b/conf/layer.conf index d8e5000d..41e42e83 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -15,3 +15,13 @@ LICENSE_PATH += "${LAYERDIR}/common/custom-licenses" # This should only be incremented on significant changes that will # cause compatibility issues with other layers LAYERVERSION_intel = "3" + + +# Exclude RMC patches unless RMC Feature is eanbled +RMC_BBMASK := "${LAYERDIR}/common/recipes-bsp/systemd-boot/systemd-boot.*\.bbappend \ + ${LAYERDIR}/common/recipes-core/initrdscripts/initramfs-live-install-efi.*\.bbappend \ + ${LAYERDIR}/common/recipes-bsp/gnu-efi/gnu-efi.*\.bbappend" + +BBMASK += "${RMC_BBMASK}" + +BBMASK_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'rmc', '${RMC_BBMASK}', '', d)}"