From b0465eb88f0406ba286df9ee056b9a62c8ab9c80 Mon Sep 17 00:00:00 2001 From: Ilias Apalodimas Date: Thu, 7 Aug 2025 11:08:14 +0300 Subject: test/py: Correctly restore the DT after capsule tests Some capsule tests are changing the sandbox DT to test various features, e.g authenticated capsule updates, versioning support etc. However, no one restores the original DT and the CI pops errors looking like /u-boot Bloblist at 100 not found (err=-2) Failed to find FDT file '/tmp/sandbox/persistent-data/scratch/EFI/CapsuleTestData/test_ver.dtb' initcall_run_f(): initcall fdtdec_setup() failed if sandbox is restarted. So let's restore the proper DT after done with the capsule testing. Signed-off-by: Ilias Apalodimas Reviewed-by: Tom Rini --- test/py/tests/test_efi_capsule/capsule_common.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'test') diff --git a/test/py/tests/test_efi_capsule/capsule_common.py b/test/py/tests/test_efi_capsule/capsule_common.py index 04dabc176c4..8c66411929e 100644 --- a/test/py/tests/test_efi_capsule/capsule_common.py +++ b/test/py/tests/test_efi_capsule/capsule_common.py @@ -137,6 +137,8 @@ def do_reboot_dtb_specified(u_boot_config, ubman, dtb_filename): dtb_filename -- DTB file name. """ mnt_point = u_boot_config.persistent_data_dir + '/scratch' + old_dtb = ubman.config.dtb ubman.config.dtb = mnt_point + CAPSULE_DATA_DIR \ + f'/{dtb_filename}' ubman.restart_uboot() + ubman.config.dtb = old_dtb -- cgit v1.3.1 From 5096f81bda1cfac2a8a325e850442bf463be2f00 Mon Sep 17 00:00:00 2001 From: Ilias Apalodimas Date: Thu, 7 Aug 2025 11:08:15 +0300 Subject: test/py: Read from the correct offset when initializing capsules The current code writes values to a flash offset defined by a function argument. However, when reading it back we always read from a static offset. Adjust the reads to use the correct offset. Signed-off-by: Ilias Apalodimas Reviewed-by: Tom Rini --- test/py/tests/test_efi_capsule/capsule_common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test') diff --git a/test/py/tests/test_efi_capsule/capsule_common.py b/test/py/tests/test_efi_capsule/capsule_common.py index 8c66411929e..8aaddfc19d6 100644 --- a/test/py/tests/test_efi_capsule/capsule_common.py +++ b/test/py/tests/test_efi_capsule/capsule_common.py @@ -42,7 +42,7 @@ def init_content(ubman, target, filename, expected): 'sf probe 0:0', f'fatload host 0:1 4000000 {CAPSULE_DATA_DIR}/{filename}', f'sf write 4000000 {target} 10', - 'sf read 5000000 100000 10', + f'sf read 5000000 {target} 10', 'md.b 5000000 10']) assert expected in ''.join(output) -- cgit v1.3.1 From fa2a2e20d0b4d7af92ee118d66f3245055cc9ba3 Mon Sep 17 00:00:00 2001 From: Ilias Apalodimas Date: Thu, 7 Aug 2025 11:08:16 +0300 Subject: test/py: Fix race conditions on EFI capsule tests efi_capsule_data() is called in each of the EFI tests to create and setup the files we need. However, it also recreates the spi.bin file that holds the SPI flash contents we rely on for the test validation. This leads to weird errors since reading from the flash returns 0, instead of the expected value if the file has been recreated. Always restart our sandbox instance if the files are recreated. Signed-off-by: Ilias Apalodimas --- test/py/tests/test_efi_capsule/conftest.py | 1 + 1 file changed, 1 insertion(+) (limited to 'test') diff --git a/test/py/tests/test_efi_capsule/conftest.py b/test/py/tests/test_efi_capsule/conftest.py index 961d2e0b3c1..45c06c42fd2 100644 --- a/test/py/tests/test_efi_capsule/conftest.py +++ b/test/py/tests/test_efi_capsule/conftest.py @@ -103,6 +103,7 @@ def efi_capsule_data(request, ubman): pytest.skip('Setup failed: %s' % exception.cmd) return else: + ubman.restart_uboot() yield image_path finally: call('rm -rf %s' % mnt_point, shell=True) -- cgit v1.3.1 From fc2686d2a87391dd1b165e44ffd525b61c93e521 Mon Sep 17 00:00:00 2001 From: Ilias Apalodimas Date: Thu, 7 Aug 2025 11:08:17 +0300 Subject: test/py: Fix capsule update tests Capsule updates tests have been skipped since commit 659f97eb1fc3 ("scripts/Makefile.lib: EFI: Use capsule CRT instead of ESL file") Remove that check since it's not needed anymore and re-enable the tests. Fixes: 659f97eb1fc3 ("scripts/Makefile.lib: EFI: Use capsule CRT instead of ESL file") Signed-off-by: Ilias Apalodimas --- test/py/tests/test_efi_capsule/conftest.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'test') diff --git a/test/py/tests/test_efi_capsule/conftest.py b/test/py/tests/test_efi_capsule/conftest.py index 45c06c42fd2..ad0cda59ebf 100644 --- a/test/py/tests/test_efi_capsule/conftest.py +++ b/test/py/tests/test_efi_capsule/conftest.py @@ -44,8 +44,6 @@ def efi_capsule_data(request, ubman): % (key_dir, data_dir), shell=True) check_call('cp %s/capsule_pub_key_good.crt %s/SIGNER.crt' % (key_dir, data_dir), shell=True) - check_call('cp %s/capsule_pub_esl_good.esl %s/SIGNER.esl' - % (key_dir, data_dir), shell=True) check_call('cp %s/capsule_priv_key_bad.key %s/SIGNER2.key' % (key_dir, data_dir), shell=True) -- cgit v1.3.1 From c9ffeefeb3efedd754e3ffa3440bfeb15cea00c3 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Mon, 18 Aug 2025 10:54:06 -0600 Subject: test: Update logic for video test The video test here is specific to the sandbox SDL video driver, so only build it when that is enabled rather than VIDEO is enabled. Reported-by: Alison Chaiken Signed-off-by: Tom Rini --- test/dm/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test') diff --git a/test/dm/Makefile b/test/dm/Makefile index 474e77a2151..2db0e3b8dfd 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -126,7 +126,7 @@ obj-$(CONFIG_TEE) += tee.o obj-$(CONFIG_TIMER) += timer.o obj-$(CONFIG_TPM_V2) += tpm.o obj-$(CONFIG_DM_USB) += usb.o -obj-$(CONFIG_VIDEO) += video.o +obj-$(CONFIG_VIDEO_SANDBOX_SDL) += video.o ifeq ($(CONFIG_VIRTIO_SANDBOX),y) obj-y += virtio.o obj-$(CONFIG_VIRTIO_RNG) += virtio_device.o -- cgit v1.3.1 From 6dfd14e1228e6e14462f377987bc896d6b7f1dd5 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 3 Sep 2025 00:01:55 +0200 Subject: mkimage: Add support for bundling TFA BL31 in mkimage -f auto Introduce two new parameters to be used with mkimage -f auto to bundle TFA BL31 image into fitImage, using auto-generated fitImage. Add -y to specify TFA BL31 file name and -Y to specify TFA BL31 load and entry point address. This is meant to be used with systems which boot all of TFA BL31, Linux and its DT from a single fitImage, all booted by U-Boot. Example invocation: " $ mkimage -E -A arm64 -C none -e 0x50200000 -a 0x50200000 -f auto \ -d arch/arm64/boot/Image \ -b arch/arm64/boot/dts/renesas/r8a779g3-sparrow-hawk.dtb \ -y ../tfa/build/rcar_gen4/release/bl31.bin -Y 0x46400000 \ /path/to/output/fitImage " Documentation update and test are also included, the test validates both positive and negative test cases, where fitImage does not include TFA BL31 and does include TFA BL31 blobs. Signed-off-by: Marek Vasut --- doc/mkimage.1 | 12 +++++++ include/image.h | 1 + test/py/tests/test_fit_auto_signed.py | 67 +++++++++++++++++++++++++++++++++++ tools/fit_image.c | 52 +++++++++++++++++++++++++-- tools/imagetool.h | 2 ++ tools/mkimage.c | 15 +++++++- 6 files changed, 146 insertions(+), 3 deletions(-) (limited to 'test') diff --git a/doc/mkimage.1 b/doc/mkimage.1 index d0a038a880a..75b6b48a0cf 100644 --- a/doc/mkimage.1 +++ b/doc/mkimage.1 @@ -239,6 +239,18 @@ Set the command will not load the image data, and instead will assume it is already accessible at the load address (such as via memory-mapped flash). . +.TP +.B \-y +.TQ +.B \-\-tfa-bl31-file +Append TFA BL31 file to the image. +. +.TP +.B \-Y +.TQ +.B \-\-tfa-bl31-addr +Set TFA BL31 file load and entry point address. +. .SS Options for creating FIT images . .TP diff --git a/include/image.h b/include/image.h index b695cc39447..fc2f2487095 100644 --- a/include/image.h +++ b/include/image.h @@ -1104,6 +1104,7 @@ int booti_setup(ulong image, ulong *relocated_addr, ulong *size, #define FIT_STANDALONE_PROP "standalone" #define FIT_SCRIPT_PROP "script" #define FIT_PHASE_PROP "phase" +#define FIT_TFA_BL31_PROP "tfa-bl31" #define FIT_MAX_HASH_LEN HASH_MAX_DIGEST_SIZE diff --git a/test/py/tests/test_fit_auto_signed.py b/test/py/tests/test_fit_auto_signed.py index cdfd341c6f5..0b5dbd5401c 100644 --- a/test/py/tests/test_fit_auto_signed.py +++ b/test/py/tests/test_fit_auto_signed.py @@ -117,6 +117,23 @@ class SignedFitHelper(object): algo = self.__fdt_get_string(f'{node}/signature', 'algo') assert algo == sign_algo + "\n", "Missing expected signature algo!" + def check_fit_loadables(self, present): + """Test that loadables contains both kernel and TFA BL31 entries. + + Each configuration must have a loadables property which lists both + kernel-1 and tfa-bl31-1 strings in the string list. + """ + if present: + assert "/images/tfa-bl31-1" in self.images_nodes + else: + assert "/images/tfa-bl31-1" not in self.images_nodes + for node in self.confgs_nodes: + loadables = self.__fdt_get_string(f'{node}', 'loadables') + assert "kernel-1" in loadables + if present: + assert "tfa-bl31-1" in loadables + else: + assert "tfa-bl31-1" not in loadables @pytest.mark.buildconfigspec('fit_signature') @pytest.mark.requiredtool('fdtget') @@ -139,6 +156,7 @@ def test_fit_auto_signed(ubman): kernel_file = f'{tempdir}/vmlinuz' dt1_file = f'{tempdir}/dt-1.dtb' dt2_file = f'{tempdir}/dt-2.dtb' + tfa_file = f'{tempdir}/tfa-bl31.bin' key_name = 'sign-key' sign_algo = 'sha256,rsa4096' key_file = f'{tempdir}/{key_name}.key' @@ -154,6 +172,9 @@ def test_fit_auto_signed(ubman): with open(dt2_file, 'wb') as fd: fd.write(os.urandom(256)) + with open(tfa_file, 'wb') as fd: + fd.write(os.urandom(256)) + # Create 4096 RSA key and write to file to be read by mkimage key = RSA.generate(bits=4096) verifier = pkcs1_15.new(key) @@ -173,6 +194,8 @@ def test_fit_auto_signed(ubman): fit.check_fit_crc32_images() + fit.check_fit_loadables(present=False) + # 2 - Create auto FIT with signed images, and verify it utils.run_and_log(ubman, mkimage + ' -fauto' + b_args + s_args + " " + fit_file) @@ -183,6 +206,8 @@ def test_fit_auto_signed(ubman): fit.check_fit_signed_images(key_name, sign_algo, verifier) + fit.check_fit_loadables(present=False) + # 3 - Create auto FIT with signed configs and hashed images, and verify it utils.run_and_log(ubman, mkimage + ' -fauto-conf' + b_args + s_args + " " + fit_file) @@ -192,3 +217,45 @@ def test_fit_auto_signed(ubman): raise ValueError('FIT-3 has no "/image" nor "/configuration" nodes') fit.check_fit_signed_confgs(key_name, sign_algo) + + fit.check_fit_loadables(present=False) + + # Run the same tests as 1/2/3 above, but this time with TFA BL31 + # options -y tfa-bl31.bin -Y 0x12340000 to cover both mkimage with + # and without TFA BL31 use cases. + b_args = " -d" + kernel_file + " -b" + dt1_file + " -b" + dt2_file + " -y" + tfa_file + " -Y 0x12340000" + + # 4 - Create auto FIT with images crc32 checksum, and verify it + utils.run_and_log(ubman, mkimage + ' -fauto' + b_args + " " + fit_file) + + fit = SignedFitHelper(ubman, fit_file) + if fit.build_nodes_sets() == 0: + raise ValueError('FIT-4 has no "/image" nor "/configuration" nodes') + + fit.check_fit_crc32_images() + + fit.check_fit_loadables(present=True) + + # 5 - Create auto FIT with signed images, and verify it + utils.run_and_log(ubman, mkimage + ' -fauto' + b_args + s_args + " " + + fit_file) + + fit = SignedFitHelper(ubman, fit_file) + if fit.build_nodes_sets() == 0: + raise ValueError('FIT-5 has no "/image" nor "/configuration" nodes') + + fit.check_fit_signed_images(key_name, sign_algo, verifier) + + fit.check_fit_loadables(present=True) + + # 6 - Create auto FIT with signed configs and hashed images, and verify it + utils.run_and_log(ubman, mkimage + ' -fauto-conf' + b_args + s_args + " " + + fit_file) + + fit = SignedFitHelper(ubman, fit_file) + if fit.build_nodes_sets() == 0: + raise ValueError('FIT-6 has no "/image" nor "/configuration" nodes') + + fit.check_fit_signed_confgs(key_name, sign_algo) + + fit.check_fit_loadables(present=True) diff --git a/tools/fit_image.c b/tools/fit_image.c index 331be5ae71d..10849733816 100644 --- a/tools/fit_image.c +++ b/tools/fit_image.c @@ -173,6 +173,13 @@ static int fit_calc_size(struct image_tool_params *params) total_size += size; } + if (params->fit_tfa_bl31) { + size = imagetool_get_filesize(params, params->fit_tfa_bl31); + if (size < 0) + return -1; + total_size += size; + } + for (cont = params->content_head; cont; cont = cont->next) { size = imagetool_get_filesize(params, cont->fname); if (size < 0) @@ -402,6 +409,30 @@ static int fit_write_images(struct image_tool_params *params, char *fdt) fdt_end_node(fdt); } + /* And a TFA BL31 file if available */ + if (params->fit_tfa_bl31) { + fdt_begin_node(fdt, FIT_TFA_BL31_PROP "-1"); + + fdt_property_string(fdt, FIT_TYPE_PROP, FIT_TFA_BL31_PROP); + fdt_property_string(fdt, FIT_OS_PROP, + genimg_get_os_short_name(params->os)); + fdt_property_string(fdt, FIT_ARCH_PROP, + genimg_get_arch_short_name(params->arch)); + get_basename(str, sizeof(str), params->fit_tfa_bl31); + fdt_property_string(fdt, FIT_DESC_PROP, str); + + ret = fdt_property_file(params, fdt, FIT_DATA_PROP, + params->fit_tfa_bl31); + if (ret) + return ret; + fdt_property_u32(fdt, FIT_LOAD_PROP, params->fit_tfa_bl31_addr); + fdt_property_u32(fdt, FIT_ENTRY_PROP, params->fit_tfa_bl31_addr); + fit_add_hash_or_sign(params, fdt, true); + if (ret) + return ret; + fdt_end_node(fdt); + } + fdt_end_node(fdt); return 0; @@ -421,7 +452,7 @@ static void fit_write_configs(struct image_tool_params *params, char *fdt) struct content_info *cont; const char *typename; char str[100]; - int upto; + int upto, len; fdt_begin_node(fdt, "configurations"); fdt_property_string(fdt, FIT_DEFAULT_PROP, "conf-1"); @@ -439,8 +470,16 @@ static void fit_write_configs(struct image_tool_params *params, char *fdt) typename = genimg_get_type_short_name(params->fit_image_type); snprintf(str, sizeof(str), "%s-1", typename); + len = strlen(str); fdt_property_string(fdt, typename, str); - fdt_property_string(fdt, FIT_LOADABLE_PROP, str); + + if (params->fit_tfa_bl31) { + snprintf(str, sizeof(str), "%s-1." FIT_TFA_BL31_PROP "-1", typename); + str[len] = 0; + len += strlen(FIT_TFA_BL31_PROP "-1") + 1; + } + + fdt_property(fdt, FIT_LOADABLE_PROP, str, len + 1); if (params->fit_ramdisk) fdt_property_string(fdt, FIT_RAMDISK_PROP, @@ -456,8 +495,17 @@ static void fit_write_configs(struct image_tool_params *params, char *fdt) fdt_begin_node(fdt, "conf-1"); typename = genimg_get_type_short_name(params->fit_image_type); snprintf(str, sizeof(str), "%s-1", typename); + len = strlen(str); fdt_property_string(fdt, typename, str); + if (params->fit_tfa_bl31) { + snprintf(str, sizeof(str), "%s-1." FIT_TFA_BL31_PROP "-1", typename); + str[len] = 0; + len += strlen(FIT_TFA_BL31_PROP "-1") + 1; + } + + fdt_property(fdt, FIT_LOADABLE_PROP, str, len + 1); + if (params->fit_ramdisk) fdt_property_string(fdt, FIT_RAMDISK_PROP, FIT_RAMDISK_PROP "-1"); diff --git a/tools/imagetool.h b/tools/imagetool.h index 57be608210a..866b8834fd7 100644 --- a/tools/imagetool.h +++ b/tools/imagetool.h @@ -99,6 +99,8 @@ struct image_tool_params { const char *engine_id; /* Engine to use for signing */ bool reset_timestamp; /* Reset the timestamp on an existing image */ struct image_summary summary; /* results of signing process */ + char *fit_tfa_bl31; /* TFA BL31 file to include */ + unsigned int fit_tfa_bl31_addr; /* TFA BL31 load and entry point address */ }; /* diff --git a/tools/mkimage.c b/tools/mkimage.c index 847453970ab..12183270776 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -160,7 +160,7 @@ static int add_content(int type, const char *fname) } static const char optstring[] = - "a:A:b:B:c:C:d:D:e:Ef:Fg:G:i:k:K:ln:N:o:O:p:qrR:stT:vVx"; + "a:A:b:B:c:C:d:D:e:Ef:Fg:G:i:k:K:ln:N:o:O:p:qrR:stT:vVxy:Y:"; static const struct option longopts[] = { { "load-address", required_argument, NULL, 'a' }, @@ -196,6 +196,8 @@ static const struct option longopts[] = { { "verbose", no_argument, NULL, 'v' }, { "version", no_argument, NULL, 'V' }, { "xip", no_argument, NULL, 'x' }, + { "tfa-bl31-file", no_argument, NULL, 'y' }, + { "tfa-bl31-addr", no_argument, NULL, 'Y' }, { /* sentinel */ }, }; @@ -367,6 +369,17 @@ static void process_args(int argc, char **argv) case 'x': params.xflag++; break; + case 'y': + params.fit_tfa_bl31 = optarg; + break; + case 'Y': + params.fit_tfa_bl31_addr = strtoull(optarg, &ptr, 16); + if (*ptr) { + fprintf(stderr, "%s: invalid TFA BL31 address %s\n", + params.cmdname, optarg); + exit(EXIT_FAILURE); + } + break; default: usage("Invalid option"); } -- cgit v1.3.1 From 8f3d3510e31ebc7b2057f431322a7174b6b60ea6 Mon Sep 17 00:00:00 2001 From: Aristo Chen Date: Sun, 14 Sep 2025 10:59:31 +0000 Subject: test: Add test case for FIT image load address overlap detection Add a new test case to verify that mkimage properly detects and reports memory region overlaps in FIT image configurations. The test creates a FIT image with kernel and FDT components that have the same load address (0x40000), which should trigger the overlap detection logic and cause mkimage to fail with an appropriate error message. Test verifies: - mkimage returns non-zero exit code when overlap is detected - Error message contains "Error: Overlap detected:" - Error message identifies the specific overlapping components (kernel@1 and fdt@1) This test ensures the overlap detection feature works correctly and prevents deployment of FIT images with conflicting memory layouts that could cause runtime failures. Signed-off-by: Aristo Chen --- test/py/tests/test_fit_mkimage_validate.py | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'test') diff --git a/test/py/tests/test_fit_mkimage_validate.py b/test/py/tests/test_fit_mkimage_validate.py index 170b2a8cbbb..27299a58f33 100644 --- a/test/py/tests/test_fit_mkimage_validate.py +++ b/test/py/tests/test_fit_mkimage_validate.py @@ -103,3 +103,68 @@ def test_fit_invalid_default_config(ubman): assert result.returncode != 0, "mkimage should fail due to missing default config" assert re.search(r"Default configuration '.*' not found under /configurations", result.stderr) + +def test_fit_load_addr_overlap(ubman): + """Test that mkimage fails when load address overlap""" + + its_fname = fit_util.make_fname(ubman, "invalid.its") + itb_fname = fit_util.make_fname(ubman, "invalid.itb") + kernel = fit_util.make_kernel(ubman, 'kernel.bin', 'kernel') + fdt = fit_util.make_dtb(ubman, ''' +/dts-v1/; +/ { + model = "Test FDT"; + compatible = "test"; +}; +''', 'test') + + # Write ITS with an invalid reference to a nonexistent default config + its_text = ''' +/dts-v1/; + +/ { + images { + kernel@1 { + description = "Test Kernel"; + data = /incbin/("kernel.bin"); + type = "kernel"; + arch = "sandbox"; + os = "linux"; + compression = "none"; + load = <0x40000>; + entry = <0x40000>; + }; + fdt@1 { + description = "Test FDT"; + data = /incbin/("test.dtb"); + type = "flat_dt"; + arch = "sandbox"; + os = "linux"; + compression = "none"; + load = <0x40000>; + entry = <0x40000>; + }; + }; + + configurations { + default = "conf@1"; + conf@1 { + kernel = "kernel@1"; + fdt = "fdt@1"; + }; + }; +}; +''' + + with open(its_fname, 'w') as f: + f.write(its_text) + + mkimage = os.path.join(ubman.config.build_dir, 'tools/mkimage') + cmd = [mkimage, '-f', its_fname, itb_fname] + + result = subprocess.run(cmd, capture_output=True, text=True) + + assert result.returncode != 0, "mkimage should fail due to memory overlap" + assert "Error: Overlap detected:" in result.stderr + # Check that it identifies the specific overlapping components + assert "kernel@1" in result.stderr and "fdt@1" in result.stderr -- cgit v1.3.1 From e482fdbbca935de32400054eb532de45b1cc01cb Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 24 Sep 2025 07:50:44 -0600 Subject: Revert "Merge patch series "mkimage: Detect FIT image load address overlaps and fix related test/DTS issues"" This reverts commit 4d84fa1261eb27d57687f2e4c404a78b8653c183, reversing changes made to b82a1fa7ddc7f3be2f3b75898d5dc44c34420bdd. I had missed some feedback on this series from earlier, and we have since had reports of regressions due to this as well. For now, revert this. Signed-off-by: Tom Rini --- arch/arm/dts/k3-am625-phycore-som-binman.dtsi | 22 +++--- arch/arm/dts/k3-am625-sk-binman.dtsi | 16 ++-- arch/arm/dts/k3-am625-verdin-wifi-dev-binman.dtsi | 16 ++-- arch/arm/dts/k3-am62a-phycore-som-binman.dtsi | 10 +-- arch/arm/dts/k3-am62a-sk-binman.dtsi | 4 +- arch/arm/dts/k3-am642-phycore-som-binman.dtsi | 6 +- test/py/tests/test_fit_mkimage_validate.py | 65 ---------------- tools/binman/entries.rst | 18 ----- tools/binman/ftest.py | 4 +- tools/binman/test/276_fit_firmware_loadables.dts | 4 +- tools/binman/test/340_fit_signature.dts | 4 +- tools/binman/test/342_fit_signature.dts | 4 +- tools/binman/test/Makefile | 6 +- tools/binman/test/elf_sections_tee.c | 1 - tools/binman/test/elf_sections_tee.lds | 32 -------- tools/fit_image.c | 90 +---------------------- tools/mkimage.c | 3 +- 17 files changed, 48 insertions(+), 257 deletions(-) delete mode 120000 tools/binman/test/elf_sections_tee.c delete mode 100644 tools/binman/test/elf_sections_tee.lds (limited to 'test') diff --git a/arch/arm/dts/k3-am625-phycore-som-binman.dtsi b/arch/arm/dts/k3-am625-phycore-som-binman.dtsi index 4344cefeba3..a9bd5a2be84 100644 --- a/arch/arm/dts/k3-am625-phycore-som-binman.dtsi +++ b/arch/arm/dts/k3-am625-phycore-som-binman.dtsi @@ -234,8 +234,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9dc10000>; - entry = <0x9dc10000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -247,8 +247,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-gp"; - load = <0x9dc20000>; - entry = <0x9dc20000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_gp"; }; @@ -322,7 +322,7 @@ description = "k3-am6xx-phycore-disable-spi-nor"; type = "flat_dt"; compression = "none"; - load = <0x8F002000>; + load = <0x8F001000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_spi_not_dtbo>; @@ -337,7 +337,7 @@ description = "k3-am6xx-phycore-disable-eth-phy"; type = "flat_dt"; compression = "none"; - load = <0x8F004000>; + load = <0x8F002000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_eth_phy_dtbo>; @@ -352,7 +352,7 @@ description = "k3-am6xx-phycore-qspi-nor"; type = "flat_dt"; compression = "none"; - load = <0x8F006000>; + load = <0x8F003000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_qspi_nor_dtbo>; @@ -479,8 +479,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9dc10000>; - entry = <0x9dc10000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -492,8 +492,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-gp"; - load = <0x9dc20000>; - entry = <0x9dc20000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_gp"; }; diff --git a/arch/arm/dts/k3-am625-sk-binman.dtsi b/arch/arm/dts/k3-am625-sk-binman.dtsi index 1619f733a0d..f743c4353b4 100644 --- a/arch/arm/dts/k3-am625-sk-binman.dtsi +++ b/arch/arm/dts/k3-am625-sk-binman.dtsi @@ -231,8 +231,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9dc10000>; - entry = <0x9dc10000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -244,8 +244,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-gp"; - load = <0x9dc20000>; - entry = <0x9dc20000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_gp"; }; @@ -362,8 +362,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9dc10000>; - entry = <0x9dc10000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -375,8 +375,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-gp"; - load = <0x9dc20000>; - entry = <0x9dc20000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_gp"; }; diff --git a/arch/arm/dts/k3-am625-verdin-wifi-dev-binman.dtsi b/arch/arm/dts/k3-am625-verdin-wifi-dev-binman.dtsi index 6c4ad72d936..65fef6e4790 100644 --- a/arch/arm/dts/k3-am625-verdin-wifi-dev-binman.dtsi +++ b/arch/arm/dts/k3-am625-verdin-wifi-dev-binman.dtsi @@ -219,8 +219,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9dc10000>; - entry = <0x9dc10000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -232,8 +232,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-gp"; - load = <0x9dc20000>; - entry = <0x9dc20000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_gp"; }; @@ -346,8 +346,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9dc10000>; - entry = <0x9dc10000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -359,8 +359,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-gp"; - load = <0x9dc20000>; - entry = <0x9dc20000>; + load = <0x9dc00000>; + entry = <0x9dc00000>; blob-ext { filename = "tifsstub.bin_gp"; }; diff --git a/arch/arm/dts/k3-am62a-phycore-som-binman.dtsi b/arch/arm/dts/k3-am62a-phycore-som-binman.dtsi index 786c7a2d458..a284226320c 100644 --- a/arch/arm/dts/k3-am62a-phycore-som-binman.dtsi +++ b/arch/arm/dts/k3-am62a-phycore-som-binman.dtsi @@ -184,8 +184,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9ca10000>; - entry = <0x9ca10000>; + load = <0x9ca00000>; + entry = <0x9ca00000>; blob-ext { filename = "tifsstub.bin_fs"; }; @@ -260,7 +260,7 @@ description = "k3-am6xx-phycore-disable-spi-nor"; type = "flat_dt"; compression = "none"; - load = <0x8F002000>; + load = <0x8F001000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_spi_not_dtbo>; @@ -275,7 +275,7 @@ description = "k3-am6xx-phycore-disable-eth-phy"; type = "flat_dt"; compression = "none"; - load = <0x8F004000>; + load = <0x8F002000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_eth_phy_dtbo>; @@ -290,7 +290,7 @@ description = "k3-am6xx-phycore-qspi-nor"; type = "flat_dt"; compression = "none"; - load = <0x8F006000>; + load = <0x8F003000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_qspi_nor_dtbo>; diff --git a/arch/arm/dts/k3-am62a-sk-binman.dtsi b/arch/arm/dts/k3-am62a-sk-binman.dtsi index 214acd7f0f7..e64c165ecbf 100644 --- a/arch/arm/dts/k3-am62a-sk-binman.dtsi +++ b/arch/arm/dts/k3-am62a-sk-binman.dtsi @@ -168,8 +168,8 @@ arch = "arm32"; compression = "none"; os = "tifsstub-fs"; - load = <0x9ca10000>; - entry = <0x9ca10000>; + load = <0x9ca00000>; + entry = <0x9ca00000>; blob-ext { filename = "tifsstub.bin_fs"; }; diff --git a/arch/arm/dts/k3-am642-phycore-som-binman.dtsi b/arch/arm/dts/k3-am642-phycore-som-binman.dtsi index 59d8902bf48..966905bd64d 100644 --- a/arch/arm/dts/k3-am642-phycore-som-binman.dtsi +++ b/arch/arm/dts/k3-am642-phycore-som-binman.dtsi @@ -371,7 +371,7 @@ description = "k3-am6xx-phycore-disable-spi-nor"; type = "flat_dt"; compression = "none"; - load = <0x8F002000>; + load = <0x8F001000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_spi_not_dtbo>; @@ -386,7 +386,7 @@ description = "k3-am6xx-phycore-disable-eth-phy"; type = "flat_dt"; compression = "none"; - load = <0x8F004000>; + load = <0x8F002000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_eth_phy_dtbo>; @@ -401,7 +401,7 @@ description = "k3-am6xx-phycore-qspi-nor"; type = "flat_dt"; compression = "none"; - load = <0x8F006000>; + load = <0x8F003000>; arch = "arm"; ti-secure { content = <&am6xx_phycore_disable_qspi_nor_dtbo>; diff --git a/test/py/tests/test_fit_mkimage_validate.py b/test/py/tests/test_fit_mkimage_validate.py index 27299a58f33..170b2a8cbbb 100644 --- a/test/py/tests/test_fit_mkimage_validate.py +++ b/test/py/tests/test_fit_mkimage_validate.py @@ -103,68 +103,3 @@ def test_fit_invalid_default_config(ubman): assert result.returncode != 0, "mkimage should fail due to missing default config" assert re.search(r"Default configuration '.*' not found under /configurations", result.stderr) - -def test_fit_load_addr_overlap(ubman): - """Test that mkimage fails when load address overlap""" - - its_fname = fit_util.make_fname(ubman, "invalid.its") - itb_fname = fit_util.make_fname(ubman, "invalid.itb") - kernel = fit_util.make_kernel(ubman, 'kernel.bin', 'kernel') - fdt = fit_util.make_dtb(ubman, ''' -/dts-v1/; -/ { - model = "Test FDT"; - compatible = "test"; -}; -''', 'test') - - # Write ITS with an invalid reference to a nonexistent default config - its_text = ''' -/dts-v1/; - -/ { - images { - kernel@1 { - description = "Test Kernel"; - data = /incbin/("kernel.bin"); - type = "kernel"; - arch = "sandbox"; - os = "linux"; - compression = "none"; - load = <0x40000>; - entry = <0x40000>; - }; - fdt@1 { - description = "Test FDT"; - data = /incbin/("test.dtb"); - type = "flat_dt"; - arch = "sandbox"; - os = "linux"; - compression = "none"; - load = <0x40000>; - entry = <0x40000>; - }; - }; - - configurations { - default = "conf@1"; - conf@1 { - kernel = "kernel@1"; - fdt = "fdt@1"; - }; - }; -}; -''' - - with open(its_fname, 'w') as f: - f.write(its_text) - - mkimage = os.path.join(ubman.config.build_dir, 'tools/mkimage') - cmd = [mkimage, '-f', its_fname, itb_fname] - - result = subprocess.run(cmd, capture_output=True, text=True) - - assert result.returncode != 0, "mkimage should fail due to memory overlap" - assert "Error: Overlap detected:" in result.stderr - # Check that it identifies the specific overlapping components - assert "kernel@1" in result.stderr and "fdt@1" in result.stderr diff --git a/tools/binman/entries.rst b/tools/binman/entries.rst index 173b7eef6cc..8922d6cd070 100644 --- a/tools/binman/entries.rst +++ b/tools/binman/entries.rst @@ -1050,24 +1050,6 @@ split-elf Generates a `load = <...>` property with the load address of the segment - Note: The load address comes from the ELF file's program header or - linker script. To determine where an ELF file will be loaded, you can: - - 1. Use readelf to examine the program headers: - ``readelf -l your_elf_file.elf`` - Look for the LOAD segments and their VirtAddr (Virtual Address) - - 2. Check the linker script (.lds file) used to build the ELF: - Look for the `. =
;` statements which set the location - counter and determine load addresses for different sections - - 3. Use objdump to see section addresses: - ``objdump -h your_elf_file.elf`` - - For example, in binman tests, elf_sections.lds sets ATF load address - to 0x00000010, while elf_sections_tee.lds sets TEE load address to - 0x00100010 to avoid memory overlap conflicts. - fit,entry Generates a `entry = <...>` property with the entry address of the ELF. This is only produced for the first entry diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 0c2dbf333c0..925c39a530e 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -252,7 +252,7 @@ class TestFunctional(unittest.TestCase): TestFunctional._MakeInputFile('bl31.elf', tools.read_file(cls.ElfTestFile('elf_sections'))) TestFunctional.tee_elf_path = TestFunctional._MakeInputFile('tee.elf', - tools.read_file(cls.ElfTestFile('elf_sections_tee'))) + tools.read_file(cls.ElfTestFile('elf_sections'))) # Newer OP_TEE file in v1 binary format cls.make_tee_bin('tee.bin') @@ -7997,7 +7997,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap 'Node \'/binman/fit\': multiple key paths found', str(e.exception)) - def testFitSignNoSignatureNodes(self): + def testFitSignNoSingatureNodes(self): """Test that fit,sign doens't raise error if no signature nodes found""" if not elf.ELF_TOOLS: self.skipTest('Python elftools not available') diff --git a/tools/binman/test/276_fit_firmware_loadables.dts b/tools/binman/test/276_fit_firmware_loadables.dts index d344036a11a..2f79cdc9bb8 100644 --- a/tools/binman/test/276_fit_firmware_loadables.dts +++ b/tools/binman/test/276_fit_firmware_loadables.dts @@ -19,8 +19,8 @@ arch = "arm64"; os = "u-boot"; compression = "none"; - load = <0x00002000>; - entry = <0x00002000>; + load = <0x00000000>; + entry = <0x00000000>; u-boot-nodtb { }; diff --git a/tools/binman/test/340_fit_signature.dts b/tools/binman/test/340_fit_signature.dts index 1c25d52cba4..9dce62e52de 100644 --- a/tools/binman/test/340_fit_signature.dts +++ b/tools/binman/test/340_fit_signature.dts @@ -20,8 +20,8 @@ arch = "arm64"; os = "u-boot"; compression = "none"; - load = <0x00002000>; - entry = <0x00002000>; + load = <0x00000000>; + entry = <0x00000000>; u-boot-nodtb { }; diff --git a/tools/binman/test/342_fit_signature.dts b/tools/binman/test/342_fit_signature.dts index 2ac600b1c70..267105d0f68 100644 --- a/tools/binman/test/342_fit_signature.dts +++ b/tools/binman/test/342_fit_signature.dts @@ -20,8 +20,8 @@ arch = "arm64"; os = "u-boot"; compression = "none"; - load = <0x00002000>; - entry = <0x00002000>; + load = <0x00000000>; + entry = <0x00000000>; u-boot-nodtb { }; diff --git a/tools/binman/test/Makefile b/tools/binman/test/Makefile index 66279e0e207..4d152eee9c0 100644 --- a/tools/binman/test/Makefile +++ b/tools/binman/test/Makefile @@ -30,13 +30,12 @@ LDS_BINMAN_BAD := -T $(SRC)u_boot_binman_syms_bad.lds LDS_BINMAN_X86 := -T $(SRC)u_boot_binman_syms_x86.lds LDS_BINMAN_EMBED := -T $(SRC)u_boot_binman_embed.lds LDS_EFL_SECTIONS := -T $(SRC)elf_sections.lds -LDS_EFL_SECTIONS_TEE := -T $(SRC)elf_sections_tee.lds LDS_BLOB := -T $(SRC)blob_syms.lds TARGETS = u_boot_ucode_ptr u_boot_no_ucode_ptr bss_data bss_data_zero \ u_boot_binman_syms u_boot_binman_syms.bin u_boot_binman_syms_bad \ u_boot_binman_syms_size u_boot_binman_syms_x86 embed_data \ - u_boot_binman_embed u_boot_binman_embed_sm elf_sections elf_sections_tee blob_syms.bin + u_boot_binman_embed u_boot_binman_embed_sm elf_sections blob_syms.bin all: $(TARGETS) @@ -85,9 +84,6 @@ blob_syms: blob_syms.c elf_sections: CFLAGS += $(LDS_EFL_SECTIONS) elf_sections: elf_sections.c -elf_sections_tee: CFLAGS += $(LDS_EFL_SECTIONS_TEE) -elf_sections_tee: elf_sections_tee.c - clean: rm -f $(TARGETS) diff --git a/tools/binman/test/elf_sections_tee.c b/tools/binman/test/elf_sections_tee.c deleted file mode 120000 index 01b200a365e..00000000000 --- a/tools/binman/test/elf_sections_tee.c +++ /dev/null @@ -1 +0,0 @@ -elf_sections.c \ No newline at end of file diff --git a/tools/binman/test/elf_sections_tee.lds b/tools/binman/test/elf_sections_tee.lds deleted file mode 100644 index 97e5e5f5d94..00000000000 --- a/tools/binman/test/elf_sections_tee.lds +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (c) 2016 Google, Inc - * Copyright (c) 2025 Canonical Ltd. - */ - -OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") -OUTPUT_ARCH(i386) -ENTRY(_start) - -SECTIONS -{ - . = 0x00100010; - _start = .; - - . = ALIGN(4); - .text : - { - *(.text*) - } - - . = 0x00101000; - .sram : - { - *(.sram*) - } - - /DISCARD/ : { - *(.comment) - *(.dyn*) - } -} diff --git a/tools/fit_image.c b/tools/fit_image.c index 12f4cdb2875..10849733816 100644 --- a/tools/fit_image.c +++ b/tools/fit_image.c @@ -22,20 +22,6 @@ #include #include -struct fit_region { - ulong load; - ulong size; - const char *name; -}; - -static int regions_overlap(const struct fit_region *a, const struct fit_region *b) -{ - ulong a_end = a->load + a->size; - ulong b_end = b->load + b->size; - - return !(a_end <= b->load || b_end <= a->load); -} - static struct legacy_img_hdr header; static int fit_estimate_hash_sig_size(struct image_tool_params *params, const char *fname) @@ -837,12 +823,9 @@ static int fit_import_data(struct image_tool_params *params, const char *fname) } fdt_for_each_subnode(node, fdt, confs) { - struct fit_region *regions = NULL; - unsigned int img_count = 0; - unsigned int regions_allocated = 0; const char *conf_name = fdt_get_name(fdt, node, NULL); - for (unsigned int i = 0; i < ARRAY_SIZE(props); i++) { + for (int i = 0; i < ARRAY_SIZE(props); i++) { int count = fdt_stringlist_count(fdt, node, props[i]); if (count < 0) @@ -863,79 +846,8 @@ static int fit_import_data(struct image_tool_params *params, const char *fname) ret = FDT_ERR_NOTFOUND; goto err_munmap; } - - ulong img_load = 0; - int img_size = 0; - - if (fit_image_get_load(fdt, img, &img_load)) { - fprintf(stderr, - "Warning: not able to get `load` of node '%s'\n", - img_name); - // Skip checking the components that do not have a - // definition for `load` - continue; - } - const char *img_data = fdt_getprop(fdt, img, - FIT_DATA_PROP, - &img_size); - - if (!img_data || !img_size) - continue; - - // Check if we've already added this image to avoid duplicates - for (unsigned int k = 0; k < img_count; k++) { - if (!strcmp(regions[k].name, img_name)) - goto next_node; - } - - // Expand regions array if needed - if (img_count >= regions_allocated) { - unsigned int new_size = regions_allocated ? - regions_allocated * 2 : 8; - struct fit_region *new_regions = realloc(regions, - new_size * sizeof(struct fit_region)); - if (!new_regions) { - fprintf(stderr, - "Failed to allocate memory for regions in config %s\n", - fdt_get_name(fdt, node, NULL)); - free(regions); - ret = -ENOMEM; - goto err_munmap; - } - regions = new_regions; - regions_allocated = new_size; - } - - regions[img_count].load = img_load; - regions[img_count].size = img_size; - regions[img_count].name = img_name; - img_count++; -next_node:; - } - } - - // Check for overlap within this config only - for (unsigned int i = 0; i < img_count; i++) { - for (unsigned int j = i + 1; j < img_count; j++) { - if (regions_overlap(®ions[i], ®ions[j])) { - fprintf(stderr, - "[Config: %s] Error: Overlap detected:\n" - " - %s: [0x%lx - 0x%lx]\n" - " - %s: [0x%lx - 0x%lx]\n", - fdt_get_name(fdt, node, NULL), - regions[i].name, regions[i].load, - regions[i].load + regions[i].size, - regions[j].name, regions[j].load, - regions[j].load + regions[j].size); - ret = FDT_ERR_BADSTRUCTURE; - free(regions); - goto err_munmap; - } } } - - // Clean up allocated memory for this configuration - free(regions); } munmap(old_fdt, sbuf.st_size); diff --git a/tools/mkimage.c b/tools/mkimage.c index e96fb7e42db..12183270776 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -533,8 +533,7 @@ int main(int argc, char **argv) retval = tparams->fflag_handle(¶ms); if (retval != EXIT_SUCCESS) { - if (retval == FDT_ERR_NOTFOUND || - retval == FDT_ERR_BADSTRUCTURE) { + if (retval == FDT_ERR_NOTFOUND) { // Already printed error, exit cleanly exit(EXIT_FAILURE); } -- cgit v1.3.1 From 44c4919e9dd6c162b237633ba689441eca9a149c Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Mon, 15 Sep 2025 15:41:55 +0200 Subject: test: Fix optee unit test This was apparently not built for several years: Since a2535243e011, optee_copy_fdt_nodes implicitly works against the U-Boot dt. We therefore have to tweak its reference before using the function and restore things afterwards. If it had been built, actually trying it out would have failed next: We need CONFIG_OPTEE_LIB to actually build the function that is primarily being tested here. And we need to re-initialize target fdt, now that the tests may run in random order. Fixes: a2535243e011 ("lib: optee: migration optee_copy_fdt_nodes for OF_LIVE support") Fixes: ba2feaf41435 ("test: Split optee tests into three functions") Signed-off-by: Jan Kiszka --- test/optee/Kconfig | 1 + test/optee/optee.c | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 11 deletions(-) (limited to 'test') diff --git a/test/optee/Kconfig b/test/optee/Kconfig index 63e2cbf79c7..ebf8d07c41c 100644 --- a/test/optee/Kconfig +++ b/test/optee/Kconfig @@ -1,6 +1,7 @@ config UT_OPTEE bool "Enable OP-TEE Unit Tests" depends on OF_CONTROL && OPTEE + select OPTEE_LIB default y help This enables the 'ut optee' command which runs a series of unit diff --git a/test/optee/optee.c b/test/optee/optee.c index 658621fa2fa..7e1c8d04a11 100644 --- a/test/optee/optee.c +++ b/test/optee/optee.c @@ -5,16 +5,20 @@ #include #include +#include #include #include #include #include +#include #include #include #include +DECLARE_GLOBAL_DATA_PTR; + /* 4k ought to be enough for anybody */ #define FDT_COPY_SIZE (4 * SZ_1K) @@ -40,14 +44,6 @@ static int optee_test_init(struct unit_test_state *uts) if (!fdt) return ret; - /* - * Resize the FDT to 4k so that we have room to operate on - * - * (and relocate it since the memory might be mapped - * read-only) - */ - ut_assertok(fdt_open_into(fdt_base, fdt, FDT_COPY_SIZE)); - return 0; } OPTEE_TEST_INIT(optee_test_init, 0); @@ -127,9 +123,21 @@ static int optee_fdt_protected_memory(struct unit_test_state *uts) static int optee_fdt_copy_empty(struct unit_test_state *uts) { void *fdt_no_optee = &__dtb_test_optee_no_optee_begin; + const void *fdt_blob = gd->fdt_blob; + + /* + * Resize the FDT to 4k so that we have room to operate on + * + * (and relocate it since the memory might be mapped + * read-only) + */ + ut_assertok(fdt_open_into(&__dtb_test_optee_base_begin, fdt, + FDT_COPY_SIZE)); /* This should still run successfully */ - ut_assertok(optee_copy_fdt_nodes(fdt_no_optee, fdt)); + gd->fdt_blob = fdt_no_optee; + ut_assertok(optee_copy_fdt_nodes(fdt)); + gd->fdt_blob = fdt_blob; expect_success = false; ut_assertok(optee_fdt_firmware(uts)); @@ -143,8 +151,14 @@ OPTEE_TEST(optee_fdt_copy_empty, 0); static int optee_fdt_copy_prefilled(struct unit_test_state *uts) { void *fdt_optee = &__dtb_test_optee_optee_begin; + const void *fdt_blob = gd->fdt_blob; - ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt)); + ut_assertok(fdt_open_into(&__dtb_test_optee_base_begin, fdt, + FDT_COPY_SIZE)); + + gd->fdt_blob = fdt_optee; + ut_assertok(optee_copy_fdt_nodes(fdt)); + gd->fdt_blob = fdt_blob; expect_success = true; ut_assertok(optee_fdt_firmware(uts)); @@ -158,9 +172,15 @@ OPTEE_TEST(optee_fdt_copy_prefilled, 0); static int optee_fdt_copy_already_filled(struct unit_test_state *uts) { void *fdt_optee = &__dtb_test_optee_optee_begin; + const void *fdt_blob = gd->fdt_blob; + + ut_assertok(fdt_open_into(&__dtb_test_optee_base_begin, fdt, + FDT_COPY_SIZE)); ut_assertok(fdt_open_into(fdt_optee, fdt, FDT_COPY_SIZE)); - ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt)); + gd->fdt_blob = fdt_optee; + ut_assertok(optee_copy_fdt_nodes(fdt)); + gd->fdt_blob = fdt_blob; expect_success = true; ut_assertok(optee_fdt_firmware(uts)); -- cgit v1.3.1