All of lore.kernel.org
 help / color / mirror / Atom feed
* [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script
@ 2020-10-13 11:32 Abdellatif El Khlifi
  2020-10-13 11:32 ` [meta-oe][PATCH 1/2] " Abdellatif El Khlifi
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Abdellatif El Khlifi @ 2020-10-13 11:32 UTC (permalink / raw)
  To: openembedded-core, Lakshmi.Kailasanathan, Ross.Burton
  Cc: nd, Abdellatif El Khlifi

From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>

This patchset adds Initramfs bundle support to the FIT image kernel class in
addition to u-boot boot script capability.

A third patch will be sent which adds the description of the new features in
the Yocto reference manual.

Abdellatif El Khlifi (2):
  kernel-fitimage: adding support for Initramfs bundle and u-boot script
  oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs
    bundle and boot script

 meta/classes/kernel-fitimage.bbclass          | 148 ++++++++++--
 meta/lib/oeqa/selftest/cases/imagefeatures.py | 215 ++++++++++++++++++
 2 files changed, 339 insertions(+), 24 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [meta-oe][PATCH 1/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script
  2020-10-13 11:32 [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Abdellatif El Khlifi
@ 2020-10-13 11:32 ` Abdellatif El Khlifi
  2020-10-13 11:32 ` [meta-oe][PATCH 2/2] oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs bundle and boot script Abdellatif El Khlifi
  2020-10-15 22:21 ` [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Richard Purdie
  2 siblings, 0 replies; 5+ messages in thread
From: Abdellatif El Khlifi @ 2020-10-13 11:32 UTC (permalink / raw)
  To: openembedded-core, Lakshmi.Kailasanathan, Ross.Burton
  Cc: nd, Abdellatif El Khlifi

From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>

This commit adds Initramfs bundle support to the FIT image in addition
to u-boot boot script capability.

These new features are selectable.

In case of Initramfs, the kernel is configured to be bundled with the rootfs
in the same binary (ie: zImage-initramfs-<machine>.bin). When the kernel is
copied to RAM and executed, it unpacks the Initramfs rootfs.

For more information about Initramfs please read:

https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

For more details about the Initramfs bundle and boot script implementation
please check the kernel-fitimage.bbclass paragraph in Yocto reference
or mega manual.

Current limitations:

- Initramfs bundle FIT support has been tested on ARM 32-bit
- The kernel image type in case of ARM 32-bit is zImage

Change-Id: I901bfd899e8d733c5b9a2b6645b1d4748f4b1fda
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
---
 meta/classes/kernel-fitimage.bbclass | 148 ++++++++++++++++++++++-----
 1 file changed, 124 insertions(+), 24 deletions(-)

diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass
index bb2f3c4ccc..f94d4d1b3d 100644
--- a/meta/classes/kernel-fitimage.bbclass
+++ b/meta/classes/kernel-fitimage.bbclass
@@ -1,5 +1,7 @@
 inherit kernel-uboot kernel-artifact-names uboot-sign
 
+KERNEL_IMAGETYPE_REPLACEMENT = ""
+
 python __anonymous () {
     kerneltypes = d.getVar('KERNEL_IMAGETYPES') or ""
     if 'fitImage' in kerneltypes.split():
@@ -21,6 +23,8 @@ python __anonymous () {
         else:
             replacementtype = "zImage"
 
+        d.setVar("KERNEL_IMAGETYPE_REPLACEMENT", replacementtype)
+
         # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal
         # to kernel.bbclass . We have to override it, since we pack zImage
         # (at least for now) into the fitImage .
@@ -45,6 +49,8 @@ python __anonymous () {
         if d.getVar('UBOOT_SIGN_ENABLE') == "1" and d.getVar('UBOOT_DTB_BINARY'):
             uboot_pn = d.getVar('PREFERRED_PROVIDER_u-boot') or 'u-boot'
             d.appendVarFlag('do_assemble_fitimage', 'depends', ' %s:do_populate_sysroot' % uboot_pn)
+            if d.getVar('INITRAMFS_IMAGE_BUNDLE') == "1":
+                d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' %s:do_populate_sysroot' % uboot_pn)
 }
 
 # Options for the device tree compiler passed to mkimage '-D' feature:
@@ -190,6 +196,30 @@ fitimage_emit_section_dtb() {
 EOF
 }
 
+#
+# Emit the fitImage ITS u-boot script section
+#
+# $1 ... .its filename
+# $2 ... Image counter
+# $3 ... Path to boot script image
+fitimage_emit_section_boot_script() {
+
+        bootscr_csum="${FIT_HASH_ALG}"
+
+        cat << EOF >> ${1}
+                bootscr@${2} {
+                        description = "U-boot script";
+                        data = /incbin/("${3}");
+                        type = "script";
+                        arch = "${UBOOT_ARCH}";
+                        compression = "none";
+                        hash@1 {
+                                algo = "${bootscr_csum}";
+                        };
+                };
+EOF
+}
+
 #
 # Emit the fitImage ITS setup section
 #
@@ -260,8 +290,9 @@ EOF
 # $2 ... Linux kernel ID
 # $3 ... DTB image name
 # $4 ... ramdisk ID
-# $5 ... config ID
-# $6 ... default flag
+# $5 ... u-boot script ID
+# $6 ... config ID
+# $7 ... default flag
 fitimage_emit_section_config() {
 
 	conf_csum="${FIT_HASH_ALG}"
@@ -277,6 +308,7 @@ fitimage_emit_section_config() {
 	kernel_line=""
 	fdt_line=""
 	ramdisk_line=""
+	bootscr_line=""
 	setup_line=""
 	default_line=""
 
@@ -307,11 +339,17 @@ fitimage_emit_section_config() {
 	fi
 
 	if [ -n "${5}" ]; then
+		conf_desc="${conf_desc}${sep}u-boot script"
+		sep=", "
+		bootscr_line="bootscr = \"bootscr@${5}\";"
+	fi
+
+	if [ -n "${6}" ]; then
 		conf_desc="${conf_desc}${sep}setup"
-		setup_line="setup = \"setup@${5}\";"
+		setup_line="setup = \"setup@${6}\";"
 	fi
 
-	if [ "${6}" = "1" ]; then
+	if [ "${7}" = "1" ]; then
 		# default node is selected based on dtb ID if it is present,
 		# otherwise its selected based on kernel ID
 		if [ -n "${3}" ]; then
@@ -324,10 +362,11 @@ fitimage_emit_section_config() {
 	cat << EOF >> ${1}
                 ${default_line}
                 $conf_node {
-			description = "${6} ${conf_desc}";
+			description = "${7} ${conf_desc}";
 			${kernel_line}
 			${fdt_line}
 			${ramdisk_line}
+			${bootscr_line}
 			${setup_line}
                         hash@1 {
                                 algo = "${conf_csum}";
@@ -355,6 +394,11 @@ EOF
 		fi
 
 		if [ -n "${5}" ]; then
+			sign_line="${sign_line}${sep}\"bootscr\""
+			sep=", "
+		fi
+
+		if [ -n "${6}" ]; then
 			sign_line="${sign_line}${sep}\"setup\""
 		fi
 
@@ -386,6 +430,7 @@ fitimage_assemble() {
 	DTBS=""
 	ramdiskcount=${3}
 	setupcount=""
+	bootscr_id=""
 	rm -f ${1} arch/${ARCH}/boot/${2}
 
 	fitimage_emit_fit_header ${1}
@@ -396,7 +441,22 @@ fitimage_assemble() {
 	fitimage_emit_section_maint ${1} imagestart
 
 	uboot_prep_kimage
-	fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}"
+
+	if [ "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then
+		initramfs_bundle_path="arch/"${UBOOT_ARCH}"/boot/"${KERNEL_IMAGETYPE_REPLACEMENT}".initramfs"
+		if [ -e "${initramfs_bundle_path}" ]; then
+
+			#
+			# Include the kernel/rootfs bundle.
+			#
+
+			fitimage_emit_section_kernel ${1} "${kernelcount}" "${initramfs_bundle_path}" "${linux_comp}"
+		else
+			bbwarn "${initramfs_bundle_path} not found."
+		fi
+	else
+		fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}"
+	fi
 
 	#
 	# Step 2: Prepare a DTB image section
@@ -430,7 +490,21 @@ fitimage_assemble() {
 	fi
 
 	#
-	# Step 3: Prepare a setup section. (For x86)
+	# Step 3: Prepare a u-boot script section
+	#
+
+	if [ -n "${UBOOT_ENV}" ] && [ -d "${STAGING_DIR_HOST}/boot" ]; then
+		if [ -e "${STAGING_DIR_HOST}/boot/${UBOOT_ENV_BINARY}" ]; then
+			cp ${STAGING_DIR_HOST}/boot/${UBOOT_ENV_BINARY} ${B}
+			bootscr_id="${UBOOT_ENV_BINARY}"
+			fitimage_emit_section_boot_script ${1} "${bootscr_id}" ${UBOOT_ENV_BINARY}
+		else
+			bbwarn "${STAGING_DIR_HOST}/boot/${UBOOT_ENV_BINARY} not found."
+		fi
+	fi
+
+	#
+	# Step 4: Prepare a setup section. (For x86)
 	#
 	if [ -e arch/${ARCH}/boot/setup.bin ]; then
 		setupcount=1
@@ -438,9 +512,9 @@ fitimage_assemble() {
 	fi
 
 	#
-	# Step 4: Prepare a ramdisk section.
+	# Step 5: Prepare a ramdisk section.
 	#
-	if [ "x${ramdiskcount}" = "x1" ] ; then
+	if [ "x${ramdiskcount}" = "x1" ] && [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
 		# Find and use the first initramfs image archive type we find
 		for img in cpio.lz4 cpio.lzo cpio.lzma cpio.xz cpio.gz ext2.gz cpio; do
 			initramfs_path="${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.${img}"
@@ -461,13 +535,15 @@ fitimage_assemble() {
 	fi
 
 	#
-	# Step 5: Prepare a configurations section
+	# Step 6: Prepare a configurations section
 	#
 	fitimage_emit_section_maint ${1} confstart
 
 	# kernel-fitimage.bbclass currently only supports a single kernel (no less or
 	# more) to be added to the FIT image along with 0 or more device trees and
 	# 0 or 1 ramdisk.
+        # It is also possible to include an initramfs bundle (kernel and rootfs in one binary)
+        # When the initramfs bundle is used ramdisk is disabled.
 	# If a device tree is to be part of the FIT image, then select
 	# the default configuration to be used is based on the dtbcount. If there is
 	# no dtb present than select the default configuation to be based on
@@ -479,13 +555,13 @@ fitimage_assemble() {
 			if [ "${dtb_ext}" = "dtbo" ]; then
 				fitimage_emit_section_config ${1} "" "${DTB}" "" "" "`expr ${i} = ${dtbcount}`"
 			else
-				fitimage_emit_section_config ${1} "${kernelcount}" "${DTB}" "${ramdiskcount}" "${setupcount}" "`expr ${i} = ${dtbcount}`"
+				fitimage_emit_section_config ${1} "${kernelcount}" "${DTB}" "${ramdiskcount}" "${bootscr_id}" "${setupcount}" "`expr ${i} = ${dtbcount}`"
 			fi
 			i=`expr ${i} + 1`
 		done
 	else
 		defaultconfigcount=1
-		fitimage_emit_section_config ${1} "${kernelcount}" "" "${ramdiskcount}" "${setupcount}" "${defaultconfigcount}"
+		fitimage_emit_section_config ${1} "${kernelcount}" "" "${ramdiskcount}" "${bootscr_id}"  "${setupcount}" "${defaultconfigcount}"
 	fi
 
 	fitimage_emit_section_maint ${1} sectend
@@ -493,7 +569,7 @@ fitimage_assemble() {
 	fitimage_emit_section_maint ${1} fitend
 
 	#
-	# Step 6: Assemble the image
+	# Step 7: Assemble the image
 	#
 	uboot-mkimage \
 		${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
@@ -501,7 +577,7 @@ fitimage_assemble() {
 		arch/${ARCH}/boot/${2}
 
 	#
-	# Step 7: Sign the image and add public key to U-Boot dtb
+	# Step 8: Sign the image and add public key to U-Boot dtb
 	#
 	if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
 		add_key_to_u_boot=""
@@ -532,7 +608,11 @@ do_assemble_fitimage_initramfs() {
 	if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage" && \
 		test -n "${INITRAMFS_IMAGE}" ; then
 		cd ${B}
-		fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1
+		if [ "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then
+			fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage ""
+		else
+			fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1
+		fi
 	fi
 }
 
@@ -571,22 +651,27 @@ kernel_do_deploy[vardepsexclude] = "DATETIME"
 kernel_do_deploy_append() {
 	# Update deploy directory
 	if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage"; then
-		echo "Copying fit-image.its source file..."
-		install -m 0644 ${B}/fit-image.its "$deployDir/fitImage-its-${KERNEL_FIT_NAME}.its"
-		ln -snf fitImage-its-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${KERNEL_FIT_LINK_NAME}"
 
-		echo "Copying linux.bin file..."
-		install -m 0644 ${B}/linux.bin $deployDir/fitImage-linux.bin-${KERNEL_FIT_NAME}.bin
-		ln -snf fitImage-linux.bin-${KERNEL_FIT_NAME}.bin "$deployDir/fitImage-linux.bin-${KERNEL_FIT_LINK_NAME}"
+		if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
+			echo "Copying fit-image.its source file..."
+			install -m 0644 ${B}/fit-image.its "$deployDir/fitImage-its-${KERNEL_FIT_NAME}.its"
+			ln -snf fitImage-its-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${KERNEL_FIT_LINK_NAME}"
+
+			echo "Copying linux.bin file..."
+			install -m 0644 ${B}/linux.bin $deployDir/fitImage-linux.bin-${KERNEL_FIT_NAME}.bin
+			ln -snf fitImage-linux.bin-${KERNEL_FIT_NAME}.bin "$deployDir/fitImage-linux.bin-${KERNEL_FIT_LINK_NAME}"
+		fi
 
 		if [ -n "${INITRAMFS_IMAGE}" ]; then
 			echo "Copying fit-image-${INITRAMFS_IMAGE}.its source file..."
 			install -m 0644 ${B}/fit-image-${INITRAMFS_IMAGE}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its"
 			ln -snf fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}"
 
-			echo "Copying fitImage-${INITRAMFS_IMAGE} file..."
-			install -m 0644 ${B}/arch/${ARCH}/boot/fitImage-${INITRAMFS_IMAGE} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.bin"
-			ln -snf fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.bin "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}"
+			if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
+				echo "Copying fitImage-${INITRAMFS_IMAGE} file..."
+				install -m 0644 ${B}/arch/${ARCH}/boot/fitImage-${INITRAMFS_IMAGE} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.bin"
+				ln -snf fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.bin "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}"
+			fi
 		fi
 		if [ "${UBOOT_SIGN_ENABLE}" = "1" -a -n "${UBOOT_DTB_BINARY}" ] ; then
 			# UBOOT_DTB_IMAGE is a realfile, but we can't use
@@ -596,3 +681,18 @@ kernel_do_deploy_append() {
 		fi
 	fi
 }
+
+# The function below performs the following in case of initramfs bundles:
+# - Removes do_assemble_fitimage. FIT generation is done through
+#   do_assemble_fitimage_initramfs. do_assemble_fitimage is not needed
+#   and should not be part of the tasks to be executed.
+# - Since do_generate_rsa_keys is inserted by default
+#   between do_compile and do_assemble_fitimage, this is
+#   not suitable in case of initramfs bundles.  do_generate_rsa_keys
+#   should be between do_bundle_initramfs and do_assemble_fitimage_initramfs.
+python () {
+    if d.getVar('INITRAMFS_IMAGE_BUNDLE') == "1":
+        bb.build.deltask('do_assemble_fitimage', d)
+        bb.build.deltask('generate_rsa_keys', d)
+        bb.build.addtask('generate_rsa_keys', 'do_assemble_fitimage_initramfs', 'do_bundle_initramfs', d)
+}
\ No newline at end of file
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [meta-oe][PATCH 2/2] oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs bundle and boot script
  2020-10-13 11:32 [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Abdellatif El Khlifi
  2020-10-13 11:32 ` [meta-oe][PATCH 1/2] " Abdellatif El Khlifi
@ 2020-10-13 11:32 ` Abdellatif El Khlifi
  2020-10-15 22:21 ` [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Richard Purdie
  2 siblings, 0 replies; 5+ messages in thread
From: Abdellatif El Khlifi @ 2020-10-13 11:32 UTC (permalink / raw)
  To: openembedded-core, Lakshmi.Kailasanathan, Ross.Burton
  Cc: nd, Abdellatif El Khlifi

From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>

- This commit allows to test the initramfs bundle feature through a new testcase that  checks
if FIT image and Image Tree Source (ITS) are built and the Image Tree Source has the correct
initramfs bundle fields.
The FIT settings are automatically read from the current machine conf file or from local.conf.

This testcase can be run through the following command:

oe-selftest -r imagefeatures.ImageFeatures.test_signed_fit_image_initramfs

- This commit also allows to test the u-boot script feature through a new testcase that checks
if FIT image and Image Tree Source are built and the Image Tree Source has the correct
uboot script fields.
The FIT settings are automatically read from the current machine conf file or from local.conf.

This testcase can be run through the following command:

oe-selftest -r imagefeatures.ImageFeatures.test_signed_fit_image_bootscr

Change-Id: I2d4e670ca9cd4971194edccf9fa6c5ede6627f31
Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
---
 meta/lib/oeqa/selftest/cases/imagefeatures.py | 215 ++++++++++++++++++
 1 file changed, 215 insertions(+)

diff --git a/meta/lib/oeqa/selftest/cases/imagefeatures.py b/meta/lib/oeqa/selftest/cases/imagefeatures.py
index f7a2533746..69c4313c5e 100644
--- a/meta/lib/oeqa/selftest/cases/imagefeatures.py
+++ b/meta/lib/oeqa/selftest/cases/imagefeatures.py
@@ -7,6 +7,7 @@ from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
 from oeqa.utils.sshcontrol import SSHControl
 import os
 import json
+import re
 
 class ImageFeatures(OESelftestTestCase):
 
@@ -278,6 +279,7 @@ PNBLACKLIST[busybox] = "Don't build this"
         """
         config = """
 # Enable creation of fitImage
+
 KERNEL_IMAGETYPE = "Image"
 KERNEL_IMAGETYPES += " fitImage "
 KERNEL_CLASSES = " kernel-fitimage "
@@ -337,6 +339,219 @@ UBOOT_ENTRYPOINT = "0x80080000"
                 "Fields in Image Tree Source File %s did not match, error in finding %s"
                 % (fitimage_its_path, its_field_check[field_index]))
 
+    def test_signed_fit_image_initramfs(self):
+        """
+        Summary:     Check if FIT image and Image Tree Source (its) are built
+                     and the Image Tree Source has the correct initramfs bundle fields.
+                     The FIT settings are automatically read from the current machine
+                     conf file or from local.conf , no need to set values in this function
+        Expected:    1. fitImage and fitImage ITS are built with initramfs bundle support
+                     2. All the fields in the kernel node are as expected (matching the
+                        conf settings)
+                     3. The kernel is included in all the available configurations and
+                        its hash is included in the configuration signature
+        Usage:      Set the following variables in the machine conf file:
+
+                    INITRAMFS_IMAGE_BUNDLE = "1"
+                    INITRAMFS_IMAGE = "<the initramfs image>"
+                    UBOOT_CONFIG ??= "FIT"
+                    UBOOT_CONFIG[FIT] = "<machine>_defconfig"
+                    KERNEL_CLASSES = " kernel-fitimage "
+                    KERNEL_IMAGETYPES = "fitImage"
+                    UBOOT_SIGN_ENABLE = "1"
+                    UBOOT_SIGN_KEYNAME = "<key name>"
+                    UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}"
+                    UBOOT_DTB_BINARY = "u-boot.dtb"
+                    UBOOT_ENTRYPOINT  = "<initramfs bundle address in RAM>"
+                    UBOOT_LOADADDRESS = "<initramfs bundle address in RAM>"
+                    UBOOT_DTB_LOADADDRESS = "<DTB address in RAM>"
+                    UBOOT_ARCH = "arm"
+                    UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000"
+                    UBOOT_EXTLINUX = "0"
+                    KERNEL_IMAGETYPE_REPLACEMENT = "<the value set in the kernel-fitimage.bbclass>"
+                    FIT_HASH_ALG = "<sha algorithm>"
+
+        Product:     oe-core
+        Author:      Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+        """
+
+        # fitImage is created as part of linux recipe
+        bitbake("virtual/kernel")
+
+        image_type = get_bb_var('INITRAMFS_IMAGE')
+        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
+        machine = get_bb_var('MACHINE')
+        fitimage_its_path = os.path.join(deploy_dir_image,
+                    "fitImage-its-%s-%s-%s" % (image_type, machine, machine))
+        fitimage_path = os.path.join(deploy_dir_image,"fitImage")
+
+        self.assertTrue(os.path.exists(fitimage_its_path),
+            "%s image tree source doesn't exist" % (fitimage_its_path))
+        self.assertTrue(os.path.exists(fitimage_path),
+            "%s FIT image doesn't exist" % (fitimage_path))
+
+        kernel_load = str(get_bb_var('UBOOT_LOADADDRESS'))
+        kernel_entry = str(get_bb_var('UBOOT_ENTRYPOINT'))
+        initramfs_bundle_format = str(get_bb_var('KERNEL_IMAGETYPE_REPLACEMENT'))
+        uboot_arch = str(get_bb_var('UBOOT_ARCH'))
+        initramfs_bundle = "arch/" + uboot_arch + "/boot/" + initramfs_bundle_format + ".initramfs"
+        fit_hash_alg = str(get_bb_var('FIT_HASH_ALG'))
+
+        its_file = open(fitimage_its_path)
+
+        its_lines = [line.strip() for line in its_file.readlines()]
+
+        exp_node_lines = [
+            'kernel@1 {',
+            'description = "Linux kernel";',
+            'data = /incbin/("' + initramfs_bundle + '");',
+            'type = "kernel";',
+            'arch = "' + uboot_arch + '";',
+            'os = "linux";',
+            'compression = "none";',
+            'load = <' + kernel_load + '>;',
+            'entry = <' + kernel_entry + '>;',
+            'hash@1 {',
+            'algo = "' + fit_hash_alg +'";',
+            '};',
+            '};'
+        ]
+
+        node_str = exp_node_lines[0]
+
+        test_passed = False
+
+        if node_str in its_lines:
+            node_start_idx = its_lines.index(node_str)
+            node = its_lines[node_start_idx:(node_start_idx + len(exp_node_lines))]
+            if node != exp_node_lines:
+                self.assertTrue(test_passed == True,"kernel node does not match expectation")
+
+        rx_configs = re.compile("^conf@.*")
+        its_configs = list(filter(rx_configs.match, its_lines))
+
+        for cfg_str in its_configs:
+            cfg_start_idx = its_lines.index(cfg_str)
+            line_idx = cfg_start_idx + 2
+            node_end = False
+            while node_end == False:
+                if its_lines[line_idx] == "};" and its_lines[line_idx-1] == "};" :
+                    node_end = True
+                line_idx = line_idx + 1
+
+            node = its_lines[cfg_start_idx:line_idx]
+            rx_desc_line = re.compile("^description.*1 Linux kernel.*")
+            if len(list(filter(rx_desc_line.match, node))) != 1:
+                self.assertTrue(test_passed == True,"kernel keyword not found in the description line")
+                break
+
+            if 'kernel = "kernel@1";' not in node:
+                self.assertTrue(test_passed == True,"kernel line not found")
+                break
+
+            rx_sign_line = re.compile("^sign-images.*kernel.*")
+            if len(list(filter(rx_sign_line.match, node))) != 1:
+                self.assertTrue(test_passed == True,"kernel hash not signed")
+                break
+
+            test_passed = True
+
+    def test_signed_fit_image_bootscr(self):
+        """
+        Summary:     Check if FIT image and Image Tree Source (its) are built
+                     and the Image Tree Source has the correct uboot script fields.
+                     The FIT settings are automatically read from the current machine
+                     conf file or from local.conf , no need to set values in this function
+        Expected:    1. fitImage and fitImage ITS are built with uboot script support
+                     2. All the fields in the uboot script node are as expected (matching the
+                        conf settings)
+                     3. The uboot script is included in all the available configurations and
+                        its hash is included in the configuration signature
+        Usage:      In addition to the settings related to the FIT, make sure the
+                    following variables are set in the machine conf file:
+
+                    UBOOT_ENV_SUFFIX = "scr"
+                    UBOOT_ENV_BINARY = "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}"
+
+        Product:     oe-core
+        Author:      Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+        """
+
+        # fitImage is created as part of linux recipe
+        bitbake("virtual/kernel")
+
+        image_type = get_bb_var('INITRAMFS_IMAGE')
+        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
+        machine = get_bb_var('MACHINE')
+        fitimage_its_path = os.path.join(deploy_dir_image,
+                    "fitImage-its-%s-%s-%s" % (image_type, machine, machine))
+        fitimage_path = os.path.join(deploy_dir_image,"fitImage")
+
+        self.assertTrue(os.path.exists(fitimage_its_path),
+            "%s image tree source doesn't exist" % (fitimage_its_path))
+        self.assertTrue(os.path.exists(fitimage_path),
+            "%s FIT image doesn't exist" % (fitimage_path))
+
+        uboot_arch = str(get_bb_var('UBOOT_ARCH'))
+        fit_hash_alg = str(get_bb_var('FIT_HASH_ALG'))
+        uboot_env_bin = str(get_bb_var('UBOOT_ENV_BINARY'))
+
+        its_file = open(fitimage_its_path)
+
+        its_lines = [line.strip() for line in its_file.readlines()]
+
+        exp_node_lines = [
+            'bootscr@' + uboot_env_bin + ' {',
+            'description = "U-boot script";',
+            'data = /incbin/("' + uboot_env_bin + '");',
+            'type = "script";',
+            'arch = "' + uboot_arch + '";',
+            'compression = "none";',
+            'hash@1 {',
+            'algo = "' + fit_hash_alg +'";',
+            '};',
+            '};'
+        ]
+
+        node_str = exp_node_lines[0]
+
+        test_passed = False
+
+        if node_str in its_lines:
+            node_start_idx = its_lines.index(node_str)
+            node = its_lines[node_start_idx:(node_start_idx + len(exp_node_lines))]
+            if node != exp_node_lines:
+                self.assertTrue(test_passed == True,"uboot script node does not match expectation")
+
+        rx_configs = re.compile("^conf@.*")
+        its_configs = list(filter(rx_configs.match, its_lines))
+
+        for cfg_str in its_configs:
+            cfg_start_idx = its_lines.index(cfg_str)
+            line_idx = cfg_start_idx + 2
+            node_end = False
+            while node_end == False:
+                if its_lines[line_idx] == "};" and its_lines[line_idx-1] == "};" :
+                    node_end = True
+                line_idx = line_idx + 1
+
+            node = its_lines[cfg_start_idx:line_idx]
+            rx_desc_line = re.compile("^description.*u-boot script.*")
+            if len(list(filter(rx_desc_line.match, node))) != 1:
+                self.assertTrue(test_passed == True,"uboot script keyword not found in the description line")
+                break
+
+            if 'bootscr = "bootscr@' + uboot_env_bin + '";' not in node:
+                self.assertTrue(test_passed == True,"uboot script line not found")
+                break
+
+            rx_sign_line = re.compile("^sign-images.*bootscr.*")
+            if len(list(filter(rx_sign_line.match, node))) != 1:
+                self.assertTrue(test_passed == True,"uboot script hash not signed")
+                break
+
+            test_passed = True
+
     def test_image_gen_debugfs(self):
         """
         Summary:     Check debugfs generation
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script
  2020-10-13 11:32 [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Abdellatif El Khlifi
  2020-10-13 11:32 ` [meta-oe][PATCH 1/2] " Abdellatif El Khlifi
  2020-10-13 11:32 ` [meta-oe][PATCH 2/2] oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs bundle and boot script Abdellatif El Khlifi
@ 2020-10-15 22:21 ` Richard Purdie
  2020-10-16  9:58   ` Abdellatif El Khlifi
  2 siblings, 1 reply; 5+ messages in thread
From: Richard Purdie @ 2020-10-15 22:21 UTC (permalink / raw)
  To: Abdellatif El Khlifi, openembedded-core, Lakshmi.Kailasanathan,
	Ross.Burton
  Cc: nd

On Tue, 2020-10-13 at 12:32 +0100, Abdellatif El Khlifi wrote:
> From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
> 
> This patchset adds Initramfs bundle support to the FIT image kernel class in
> addition to u-boot boot script capability.
> 
> A third patch will be sent which adds the description of the new features in
> the Yocto reference manual.
> 
> Abdellatif El Khlifi (2):
>   kernel-fitimage: adding support for Initramfs bundle and u-boot script
>   oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs
>     bundle and boot script
> 
>  meta/classes/kernel-fitimage.bbclass          | 148 ++++++++++--
>  meta/lib/oeqa/selftest/cases/imagefeatures.py | 215 ++++++++++++++++++
>  2 files changed, 339 insertions(+), 24 deletions(-)

Unfortunately this failed on the autobuilder in both the test it adds
and in other related ones:

https://autobuilder.yoctoproject.org/typhoon/#/builders/79/builds/1462/steps/8/logs/step2d
https://autobuilder.yoctoproject.org/typhoon/#/builders/80/builds/1447

and others builds too.

Cheers,

Richard


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script
  2020-10-15 22:21 ` [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Richard Purdie
@ 2020-10-16  9:58   ` Abdellatif El Khlifi
  0 siblings, 0 replies; 5+ messages in thread
From: Abdellatif El Khlifi @ 2020-10-16  9:58 UTC (permalink / raw)
  To: Richard Purdie; +Cc: nd, openembedded-core, Lakshmi Kailasanathan, Ross Burton

[-- Attachment #1: Type: text/plain, Size: 3456 bytes --]

Hi Richard,

Thanks for the feedback.

I'd like to make sure the configurations listed in the test cases "Usage" section are provided before running the tests. Without these, the tests will not pass of course.

So, for the test_signed_fit_image_initramfs, please set the following variables in the machine conf file:

                    INITRAMFS_IMAGE_BUNDLE = "1"
                    INITRAMFS_IMAGE = "<the initramfs image>"
                    UBOOT_CONFIG ??= "FIT"
                    UBOOT_CONFIG[FIT] = "<machine>_defconfig"
                    KERNEL_CLASSES = " kernel-fitimage "
                    KERNEL_IMAGETYPES = "fitImage"
                    UBOOT_SIGN_ENABLE = "1"
                    UBOOT_SIGN_KEYNAME = "<key name>"
                    UBOOT_SIGN_KEYDIR ?= "${DEPLOY_DIR_IMAGE}"
                    UBOOT_DTB_BINARY = "u-boot.dtb"
                    UBOOT_ENTRYPOINT  = "<initramfs bundle address in RAM>"
                    UBOOT_LOADADDRESS = "<initramfs bundle address in RAM>"
                    UBOOT_DTB_LOADADDRESS = "<DTB address in RAM>"
                    UBOOT_ARCH = "arm"
                    UBOOT_MKIMAGE_DTCOPTS = "-I dts -O dtb -p 2000"
                    UBOOT_EXTLINUX = "0"
                    KERNEL_IMAGETYPE_REPLACEMENT = "<the value set in the kernel-fitimage.bbclass, for ARM 32-bit it's zImage >"
                    FIT_HASH_ALG = "<sha algorithm>"

And for test_signed_fit_image_bootscr, in addition to the settings above, please set the following additional variables in the machine conf file:

                    UBOOT_ENV_SUFFIX = "scr"
                    UBOOT_ENV_BINARY = "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}"

For more information about the test cases, please check the test cases documentation in imagefeatures.py (Summary, Expected, Usage).

Many thanks,

Abdel

________________________________
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Sent: 15 October 2020 23:21
To: Abdellatif El Khlifi <Abdellatif.ElKhlifi@arm.com>; openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org>; Lakshmi Kailasanathan <Lakshmi.Kailasanathan@arm.com>; Ross Burton <Ross.Burton@arm.com>
Cc: nd <nd@arm.com>
Subject: Re: [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script

On Tue, 2020-10-13 at 12:32 +0100, Abdellatif El Khlifi wrote:
> From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
>
> This patchset adds Initramfs bundle support to the FIT image kernel class in
> addition to u-boot boot script capability.
>
> A third patch will be sent which adds the description of the new features in
> the Yocto reference manual.
>
> Abdellatif El Khlifi (2):
>   kernel-fitimage: adding support for Initramfs bundle and u-boot script
>   oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs
>     bundle and boot script
>
>  meta/classes/kernel-fitimage.bbclass          | 148 ++++++++++--
>  meta/lib/oeqa/selftest/cases/imagefeatures.py | 215 ++++++++++++++++++
>  2 files changed, 339 insertions(+), 24 deletions(-)

Unfortunately this failed on the autobuilder in both the test it adds
and in other related ones:

https://autobuilder.yoctoproject.org/typhoon/#/builders/79/builds/1462/steps/8/logs/step2d
https://autobuilder.yoctoproject.org/typhoon/#/builders/80/builds/1447

and others builds too.

Cheers,

Richard


[-- Attachment #2: Type: text/html, Size: 8103 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-10-16  9:59 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-13 11:32 [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Abdellatif El Khlifi
2020-10-13 11:32 ` [meta-oe][PATCH 1/2] " Abdellatif El Khlifi
2020-10-13 11:32 ` [meta-oe][PATCH 2/2] oeqa/selftest/imagefeatures: adding fitImage testcases for initramfs bundle and boot script Abdellatif El Khlifi
2020-10-15 22:21 ` [OE-core] [meta-oe][PATCH 0/2] kernel-fitimage: adding support for Initramfs bundle and u-boot script Richard Purdie
2020-10-16  9:58   ` Abdellatif El Khlifi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.