diff options
author | Fabrice Gasnier <fabrice.gasnier@st.com> | 2018-10-03 09:55:02 +0200 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2019-06-30 15:48:40 +1000 |
commit | ad57e4574a379e8f383058f730e4e8e1939b4fc7 (patch) | |
tree | 2ffbf0117c53571ab6fdbd3234b36c514b3cf7bd /tests | |
parent | bbe3b36f542bb2c274f5fd030456ea840cc31d94 (diff) | |
download | dtc-ad57e4574a379e8f383058f730e4e8e1939b4fc7.zip dtc-ad57e4574a379e8f383058f730e4e8e1939b4fc7.tar.gz dtc-ad57e4574a379e8f383058f730e4e8e1939b4fc7.tar.bz2 |
tests: Add a failed test case for 'fdtoverlay' with long target path
This adds a test case to demonstrate some issue seen when applying
overlays using 'fdtoverlay'. It fails with FDT_ERR_NOSPACE:
- with long target path
- symbols in order to use these nodes in possible subsequent overlay.
This is seen with this patch, by running:
$ make check # Reports a failed test
$ ./fdtoverlay -i tests/overlay_base.test.dtb -o out.dtb \
tests/overlay_overlay_long_path.fdoverlay.test.dtb
Failed to apply tests/overlay_overlay_long_path.fdoverlay.test.dtb (-3)
This overlay fails to apply, because dtb size is close to modulo 1024
bytes chunk: utilfdt_read() -> utilfdt_read_err() -> bufsize = 1024.
As there is not much extra space in the blob to resolve symbols (long
target path), it fails with FDT_ERR_NOSPACE. In fdtoverlay, size is :
/* grow the blob to worst case */
blob_len = fdt_totalsize(blob) + total_len;
I can see assumption is made that result should be lower than:
- base fdt size + overlay size. Is there a simple way to find to know
what the final size is?
I'm not sure what the correct fix might be, for such (worst) case?
Similar issue is also seen in u-boot/common/image-fit.c that implements
similar approach (e.g. base fdt size + overlay size).
Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Message-Id: <1538553302-1353-1-git-send-email-fabrice.gasnier@st.com>
[dwg: To avoid breaking bisection, I committed this after a fix, so
the "failed" description is no longer accurate]
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/overlay_base.dts | 4 | ||||
-rw-r--r-- | tests/overlay_overlay_long_path.dts | 32 | ||||
-rwxr-xr-x | tests/run_tests.sh | 8 |
3 files changed, 44 insertions, 0 deletions
diff --git a/tests/overlay_base.dts b/tests/overlay_base.dts index 2603adb..a5e55b2 100644 --- a/tests/overlay_base.dts +++ b/tests/overlay_base.dts @@ -14,6 +14,10 @@ subtest: sub-test-node { sub-test-property; + + subtest_with_long_path: sub-test-node-with-very-long-target-path { + long-test-path-property; + }; }; }; }; diff --git a/tests/overlay_overlay_long_path.dts b/tests/overlay_overlay_long_path.dts new file mode 100644 index 0000000..4f0d40b --- /dev/null +++ b/tests/overlay_overlay_long_path.dts @@ -0,0 +1,32 @@ +/dts-v1/; +/plugin/; + +&subtest_with_long_path { + lpath_0: test-0 { + prop = "lpath"; + }; + + lpath_1: test-1 { + prop = "lpath"; + }; + + lpath_2: test-2 { + prop = "lpath"; + }; + + lpath_3: test-3 { + prop = "lpath"; + }; + + lpath_4: test-4 { + prop = "lpath"; + }; + + lpath_5: test-5 { + prop = "lpath"; + }; + + lpath_6: test-6 { + prop = "lpath"; + }; +}; diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 646a4d9..d368ad5 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -941,6 +941,14 @@ fdtoverlay_tests() { # test that baz correctly inserted the property run_fdtoverlay_test baz "/foonode/barnode/baznode" "baz-property" "-ts" ${stacked_basedtb} ${stacked_targetdtb} ${stacked_bardtb} ${stacked_bazdtb} + + overlay_long_path=overlay_overlay_long_path.dts + overlay_long_pathdtb=overlay_overlay_long_path.fdoverlay.test.dtb + target_long_pathdtb=overlay_overlay_long_path_target.fdoverlay.test.dtb + run_dtc_test -@ -I dts -O dtb -o $overlay_long_pathdtb $overlay_long_path + + # test that fdtoverlay manages to apply overlays with long target path + run_fdtoverlay_test lpath "/test-node/sub-test-node/sub-test-node-with-very-long-target-path/test-0" "prop" "-ts" ${basedtb} ${target_long_pathdtb} ${overlay_long_pathdtb} } pylibfdt_tests () { |