Browse Source

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>
main
Fabrice Gasnier 6 years ago committed by David Gibson
parent
commit
ad57e4574a
  1. 4
      tests/overlay_base.dts
  2. 32
      tests/overlay_overlay_long_path.dts
  3. 8
      tests/run_tests.sh

4
tests/overlay_base.dts

@ -14,6 +14,10 @@


subtest: sub-test-node { subtest: sub-test-node {
sub-test-property; sub-test-property;

subtest_with_long_path: sub-test-node-with-very-long-target-path {
long-test-path-property;
};
}; };
}; };
}; };

32
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";
};
};

8
tests/run_tests.sh

@ -941,6 +941,14 @@ fdtoverlay_tests() {


# test that baz correctly inserted the property # 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} 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 () { pylibfdt_tests () {

Loading…
Cancel
Save