test: Detect a change in the device tree
authorSimon Glass <sjg@chromium.org>
Wed, 7 Sep 2022 02:27:06 +0000 (20:27 -0600)
committerTom Rini <trini@konsulko.com>
Thu, 29 Sep 2022 20:09:56 +0000 (16:09 -0400)
If the device tree changes during a test and we cannot restore it, mark
it as such so that future tests which need the live tree are skipped.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/asm-generic/global_data.h
test/test-main.c

index 4aeb61f08c4041578253db684fbe4682ce015f9a..2d55fe2ac0f5ffb0d7edfc780b93f2b27f453ec5 100644 (file)
@@ -646,6 +646,10 @@ enum gd_flags {
         * @GD_FLG_SMP_READY: SMP initialization is complete
         */
        GD_FLG_SMP_READY = 0x80000,
+       /**
+        * @GD_FLG_FDT_CHANGED: Device tree change has been detected by tests
+        */
+       GD_FLG_FDT_CHANGED = 0x100000,
 };
 
 #endif /* __ASSEMBLY__ */
index 082821ef3e032ea083f5f3d26a52905a2ff4d8c6..c12027ce68033672ce24e17d8dbb1e9f840ce2c2 100644 (file)
@@ -79,6 +79,10 @@ static int dm_test_pre_run(struct unit_test_state *uts)
 {
        bool of_live = uts->of_live;
 
+       if (of_live && (gd->flags & GD_FLG_FDT_CHANGED)) {
+               printf("Cannot run live tree test as device tree changed\n");
+               return -EFAULT;
+       }
        uts->root = NULL;
        uts->testdev = NULL;
        uts->force_fail_alloc = false;
@@ -113,9 +117,17 @@ static int dm_test_post_run(struct unit_test_state *uts)
                        uint chksum;
 
                        chksum = crc8(0, gd->fdt_blob, fdt_totalsize(gd->fdt_blob));
-
-                       if (chksum != uts->fdt_chksum)
+                       if (chksum != uts->fdt_chksum) {
+                               /*
+                                * We cannot run any more tests that need the
+                                * live tree, since its strings point into the
+                                * flat tree, which has changed. This likely
+                                * means that at least some of the pointers from
+                                * the live tree point to different things
+                                */
                                printf("Device tree changed: cannot run live tree tests\n");
+                               gd->flags |= GD_FLG_FDT_CHANGED;
+                       }
                        break;
                }
                case FDTCHK_NONE:
@@ -415,7 +427,8 @@ static int ut_run_test_live_flat(struct unit_test_state *uts,
         * or it is a core test.
         */
        if (!(test->flags & UT_TESTF_LIVE_TREE) &&
-           (!runs || ut_test_run_on_flattree(test))) {
+           (!runs || ut_test_run_on_flattree(test)) &&
+           !(gd->flags & GD_FLG_FDT_CHANGED)) {
                uts->of_live = false;
                ut_assertok(ut_run_test(uts, test, test->name));
                runs++;