* [PATCH v2 1/2] u-boot: make initial environment binary image
@ 2025-11-17 16:12 pierre-loup.gosse
2025-11-17 16:12 ` [PATCH v2 2/2] oe-selftest: uboot: add test for building U-Boot initial env binary pierre-loup.gosse
0 siblings, 1 reply; 3+ messages in thread
From: pierre-loup.gosse @ 2025-11-17 16:12 UTC (permalink / raw)
To: openembedded-core; +Cc: Pierre-Loup GOSSE, Ross Burton
From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
Build the U-Boot initial environment binary image if
UBOOT_INITIAL_ENV_BINARY is set to "1". The environment partition size
(in bytes, hexadecimal or decimal) must be defined using
UBOOT_INITIAL_ENV_BINARY_SIZE.
If U-Boot environment redundancy is enabled,
UBOOT_INITIAL_ENV_BINARY_REDUND must be set to "1".
The resulting binary can be flashed using WIC at the environment offset,
overriding any existing environment if present, for example:
part --source rawcopy --sourceparams="file=u-boot-initial-env-sd.bin" --ondisk sda --no-table --offset 4096
Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
Cc: Ross Burton <ross.burton@arm.com>
---
Note: Once merged, a patch with the new variables will be submitted to the
documentation mailing list.
changes in v2:
- fix uboot_deploy_config (builddir was missing)
---
meta/classes-recipe/uboot-config.bbclass | 11 +++++++++
meta/recipes-bsp/u-boot/u-boot.inc | 30 ++++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/meta/classes-recipe/uboot-config.bbclass b/meta/classes-recipe/uboot-config.bbclass
index fd6c045142..81057b5cad 100644
--- a/meta/classes-recipe/uboot-config.bbclass
+++ b/meta/classes-recipe/uboot-config.bbclass
@@ -71,6 +71,14 @@ UBOOT_ENV_BINARY ?= "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}"
UBOOT_ENV_IMAGE ?= "${UBOOT_ENV}-${MACHINE}-${UBOOT_VERSION}.${UBOOT_ENV_SUFFIX}"
UBOOT_ENV_SYMLINK ?= "${UBOOT_ENV}-${MACHINE}.${UBOOT_ENV_SUFFIX}"
+# Enable the build of the U-Boot initial env binary image. The binary size is
+# required (i.e. the U-Boot partition environment size). Since the environment
+# layout with multiple copies is different, set UBOOT_INITIAL_ENV_BINARY_REDUND
+# to "1" if the U-Boot environment redundancy is enabled.
+UBOOT_INITIAL_ENV_BINARY ?= "0"
+UBOOT_INITIAL_ENV_BINARY_SIZE ?= ""
+UBOOT_INITIAL_ENV_BINARY_REDUND ?= "0"
+
# U-Boot EXTLINUX variables. U-Boot searches for /boot/extlinux/extlinux.conf
# to find EXTLINUX conf file.
UBOOT_EXTLINUX_INSTALL_DIR ?= "/boot/extlinux"
@@ -100,6 +108,9 @@ UBOOT_DTB_BINARY ??= ""
UBOOT_FIT_CHECK_SIGN ?= "uboot-fit_check_sign"
python () {
+ if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) and d.getVar('UBOOT_INITIAL_ENV_BINARY_SIZE') == "":
+ bb.fatal("UBOOT_INITIAL_ENV_BINARY requires setting the U-Boot partition environment size with the UBOOT_INITIAL_ENV_BINARY_SIZE variable")
+
ubootmachine = d.getVar("UBOOT_MACHINE")
ubootconfigflags = d.getVarFlags('UBOOT_CONFIG')
ubootbinary = d.getVar('UBOOT_BINARY')
diff --git a/meta/recipes-bsp/u-boot/u-boot.inc b/meta/recipes-bsp/u-boot/u-boot.inc
index 16c9836508..ffa9ef2d59 100644
--- a/meta/recipes-bsp/u-boot/u-boot.inc
+++ b/meta/recipes-bsp/u-boot/u-boot.inc
@@ -4,6 +4,7 @@ PROVIDES = "virtual/bootloader"
PACKAGE_ARCH = "${MACHINE_ARCH}"
DEPENDS += "${@bb.utils.contains('UBOOT_ENV_SUFFIX', 'scr', 'u-boot-mkimage-native', '', d)}"
+DEPENDS += "${@ 'u-boot-mkenvimage-native' if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) else ''}"
inherit uboot-config uboot-extlinux-config uboot-sign deploy python3native kernel-arch
@@ -104,6 +105,10 @@ uboot_compile_config () {
if [ -n "${UBOOT_INITIAL_ENV}" ]; then
oe_runmake -C ${S} O=${B}/${builddir} u-boot-initial-env
cp ${B}/${builddir}/u-boot-initial-env ${B}/${builddir}/u-boot-initial-env-${type}
+ if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then
+ uboot_compile_initial_env_binary
+ cp ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-initial-env-${type}.bin
+ fi
fi
}
@@ -123,7 +128,18 @@ uboot_compile () {
# Generate the uboot-initial-env
if [ -n "${UBOOT_INITIAL_ENV}" ]; then
oe_runmake -C ${S} O=${B} u-boot-initial-env
+ if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then
+ uboot_compile_initial_env_binary
+ fi
+ fi
+}
+
+uboot_compile_initial_env_binary() {
+ redund=""
+ if [ "${UBOOT_INITIAL_ENV_BINARY_REDUND}" = "1" ] ; then
+ redund="-r"
fi
+ uboot-mkenvimage -s ${UBOOT_INITIAL_ENV_BINARY_SIZE} ${redund} -o ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-initial-env
}
do_install () {
@@ -388,9 +404,16 @@ uboot_deploy_config () {
# Deploy the uboot-initial-env
if [ -n "${UBOOT_INITIAL_ENV}" ]; then
install -D -m 644 ${B}/${builddir}/u-boot-initial-env-${type} ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}
+ if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+ install -D -m 644 ${B}/${builddir}/u-boot-initial-env-${type}.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin
+ fi
cd ${DEPLOYDIR}
ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}
ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${type}
+ if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+ ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}.bin
+ ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${type}.bin
+ fi
fi
}
@@ -405,9 +428,16 @@ uboot_deploy () {
# Deploy the uboot-initial-env
if [ -n "${UBOOT_INITIAL_ENV}" ]; then
install -D -m 644 ${B}/u-boot-initial-env ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}
+ if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+ install -D -m 644 ${B}/u-boot-initial-env.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin
+ fi
cd ${DEPLOYDIR}
ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE}
ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}
+ if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+ ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}.bin
+ ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}.bin
+ fi
fi
}
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH v2 2/2] oe-selftest: uboot: add test for building U-Boot initial env binary
2025-11-17 16:12 [PATCH v2 1/2] u-boot: make initial environment binary image pierre-loup.gosse
@ 2025-11-17 16:12 ` pierre-loup.gosse
2025-11-19 17:41 ` [OE-core] " Mathieu Dubois-Briand
0 siblings, 1 reply; 3+ messages in thread
From: pierre-loup.gosse @ 2025-11-17 16:12 UTC (permalink / raw)
To: openembedded-core; +Cc: Pierre-Loup GOSSE, Ross Burton
From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
This adds two new selftest cases `test_uboot_initial_env_binary` and
`test_uboot_config_initial_env_binary` to verify the build of the U-Boot
initial env binary with the mkimage tool.
Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
Cc: Ross Burton <ross.burton@arm.com>
---
changes in v2:
- add tests
---
meta/lib/oeqa/selftest/cases/uboot.py | 52 +++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/meta/lib/oeqa/selftest/cases/uboot.py b/meta/lib/oeqa/selftest/cases/uboot.py
index 980ea327f0..e2478d3dfd 100644
--- a/meta/lib/oeqa/selftest/cases/uboot.py
+++ b/meta/lib/oeqa/selftest/cases/uboot.py
@@ -5,6 +5,9 @@
# SPDX-License-Identifier: MIT
#
+import os
+import textwrap
+
from oeqa.selftest.case import OESelftestTestCase
from oeqa.utils.commands import bitbake, runqemu, get_bb_var, get_bb_vars, runCmd
from oeqa.core.decorator.data import skipIfNotArch, skipIfNotBuildArch
@@ -96,3 +99,52 @@ QB_DRIVE_TYPE = "/dev/vd"
self.assertTrue("Machine model: linux,dummy-virt" in output, msg=output)
# with KVM enabled
self.assertTrue("KVM: hypervisor services detected" in output, msg=output)
+
+ def test_uboot_initial_env_binary(self):
+ """
+ Tests building the initial U-Boot environment in binary format with
+ the U-Boot mkimage tool.
+ We assume that the uboot-mkenvimage tool generates a correct binary.
+ """
+
+ self.write_config(textwrap.dedent("""
+ UBOOT_INITIAL_ENV_BINARY = "1"
+ UBOOT_INITIAL_ENV_BINARY_SIZE = "0x4000"
+ UBOOT_INITIAL_ENV_BINARY_REDUND = "1"
+ """))
+
+ bitbake("u-boot")
+
+ bb_vars = get_bb_vars(["DEPLOYDIR", "UBOOT_INITIAL_ENV"], "u-boot")
+
+ uboot_initial_env_binary_path = os.path.realpath(os.path.join(
+ bb_vars["DEPLOYDIR"], "%s.bin" % bb_vars["UBOOT_INITIAL_ENV"]
+ ))
+
+ self.assertExists(uboot_initial_env_binary_path)
+
+ def test_uboot_config_initial_env_binary(self):
+ """
+ Tests building the initial U-Boot environment in binary format with
+ the U-Boot mkimage tool for a U-Boot config.
+ We assume that the uboot-mkenvimage tool generates a correct binary.
+ """
+
+ self.write_config(textwrap.dedent("""
+ UBOOT_MACHINE = ""
+ UBOOT_CONFIG = "test"
+ UBOOT_CONFIG[test] = "qemu-x86_64_defconfig"
+ UBOOT_INITIAL_ENV_BINARY = "1"
+ UBOOT_INITIAL_ENV_BINARY_SIZE = "0x4000"
+ UBOOT_INITIAL_ENV_BINARY_REDUND = "1"
+ """))
+
+ bitbake("u-boot")
+
+ bb_vars = get_bb_vars(["DEPLOYDIR", "UBOOT_INITIAL_ENV"], "u-boot")
+
+ uboot_initial_env_binary_path = os.path.realpath(os.path.join(
+ bb_vars["DEPLOYDIR"], "%s-test.bin" % bb_vars["UBOOT_INITIAL_ENV"]
+ ))
+
+ self.assertExists(uboot_initial_env_binary_path)
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [OE-core] [PATCH v2 2/2] oe-selftest: uboot: add test for building U-Boot initial env binary
2025-11-17 16:12 ` [PATCH v2 2/2] oe-selftest: uboot: add test for building U-Boot initial env binary pierre-loup.gosse
@ 2025-11-19 17:41 ` Mathieu Dubois-Briand
0 siblings, 0 replies; 3+ messages in thread
From: Mathieu Dubois-Briand @ 2025-11-19 17:41 UTC (permalink / raw)
To: pierre-loup.gosse, openembedded-core; +Cc: Ross Burton
On Mon Nov 17, 2025 at 5:12 PM CET, Pierre-loup GOSSE via lists.openembedded.org wrote:
> From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
>
> This adds two new selftest cases `test_uboot_initial_env_binary` and
> `test_uboot_config_initial_env_binary` to verify the build of the U-Boot
> initial env binary with the mkimage tool.
>
> Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
> Cc: Ross Burton <ross.burton@arm.com>
> ---
Hi Pierre-Loup,
Thanks for your patch.
It looks like this is failing when building on ARM machines:
2025-11-19 10:13:26,832 - oe-selftest - INFO - uboot.UBootTest.test_uboot_config_initial_env_binary (subunit.RemotedTestCase)
2025-11-19 10:13:26,836 - oe-selftest - INFO - ... FAIL
...
ERROR: u-boot-1_2025.10-r0 do_compile: oe_runmake failed
ERROR: u-boot-1_2025.10-r0 do_compile: Execution of '/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/temp/run.do_compile.1762173' failed with exit code 1
...
| aarch64-poky-linux-gcc --sysroot=/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/recipe-sysroot -ffile-prefix-map=/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/sources/u-boot-2025.10=/usr/src/debug/u-boot/2025.10 -ffile-prefix-map=/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/build=/usr/src/debug/u-boot/2025.10 -ffile-prefix-map=/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/recipe-sysroot= -ffile-prefix-map=/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/recipe-sysroot-native= -E -Wall -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Wno-format-security -std=gnu11 -ffreestanding -fno-builtin -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -Wno-int-in-bool-context -Wno-address-of-packed-member -O2 -fno-stack-protector -fno-delete-null-pointer-checks -Wno-zero-length-bounds -Wno-array-bounds -Wno-stringop-overflow -Wno-maybe-uninitialized -fmacro-prefix-map=/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/sources/u-boot-2025.10/= -gdwarf-4 -fstack-usage -Wno-format-nonliteral -Wno-address-of-packed-member -Wno-unused-but-set-variable -Wno-unused-but-set-variable -Werror=date-time -Wno-packed-not-aligned -Wno-pointer-sign -Wno-stringop-truncation -fno-strict-overflow -D__KERNEL__ -D__UBOOT__ -fomit-frame-pointer -fno-toplevel-reorder -fno-dwarf2-cfi-asm -fpic -fno-common -march=core2 -m64 -D__x86_64__ -fdata-sections -ffunction-sections -fvisibility=hidden -pipe -Iinclude -I/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/sources/u-boot-2025.10/include -I/srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/sources/u-boot-2025.10/arch/x86/include -include /srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/sources/u-boot-2025.10/include/linux/kconfig.h -nostdinc -isystem /srv/pokybuild/yocto-worker/oe-selftest-armhost/build/build-st-3996856/tmp/work/qemuarm64-poky-linux/u-boot/2025.10/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../lib/aarch64-poky-linux/gcc/aarch64-poky-linux/15.2.0/include -DCONFIG_XPL_BUILD -DCONFIG_SPL_BUILD -DDO_DEPS_ONLY -dM include/config.h > spl/u-boot.cfg.tmp && { grep 'define CONFIG_' spl/u-boot.cfg.tmp | sed '/define CONFIG_IS_ENABLED(/d;/define CONFIG_IF_ENABLED_INT(/d;/define CONFIG_VAL(/d;' > spl/u-boot.cfg; rm spl/u-boot.cfg.tmp; } || { rm spl/u-boot.cfg.tmp; false; }
| aarch64-poky-linux-gcc: error: unrecognized command-line option '-m64'
https://autobuilder.yoctoproject.org/valkyrie/#/builders/23/builds/2854
Can you have a look at the issue?
Thanks,
Mathieu
--
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-11-19 17:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-17 16:12 [PATCH v2 1/2] u-boot: make initial environment binary image pierre-loup.gosse
2025-11-17 16:12 ` [PATCH v2 2/2] oe-selftest: uboot: add test for building U-Boot initial env binary pierre-loup.gosse
2025-11-19 17:41 ` [OE-core] " Mathieu Dubois-Briand
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox