This patch adds testcases which test dtc when used to convert between
different dtb versions.  These tests uncovered a couple of bugs
handling old dtb versions, which are also fixed.

Signed-off-by: David Gibson <[EMAIL PROTECTED]>

Index: dtc/tests/run_tests.sh
===================================================================
--- dtc.orig/tests/run_tests.sh 2008-02-28 16:58:46.000000000 +1100
+++ dtc/tests/run_tests.sh      2008-02-28 20:53:39.000000000 +1100
@@ -173,6 +173,19 @@
        run_test dtbs_equal_ordered $tree odts_$tree.test.dtb
     done
 
+    # Check version conversions
+    for tree in test_tree1.dtb ; do
+        for aver in 1 2 3 16 17; do
+            atree="ov${aver}_$tree.test.dtb"
+            run_test dtc.sh -I dtb -O dtb -V$aver -o $atree $tree
+            for bver in 16 17; do
+                btree="ov${bver}_$atree"
+                run_test dtc.sh -I dtb -O dtb -V$bver -o $btree $atree
+                run_test dtbs_equal_ordered $btree $tree
+            done
+        done
+    done
+
     # Check some checks
     run_test dtc-checkfails.sh duplicate_node_names -- -I dts -O dtb 
dup-nodename.dts
     run_test dtc-checkfails.sh duplicate_property_names -- -I dts -O dtb 
dup-propname.dts
Index: dtc/flattree.c
===================================================================
--- dtc.orig/flattree.c 2008-02-28 17:02:36.000000000 +1100
+++ dtc/flattree.c      2008-02-28 20:53:39.000000000 +1100
@@ -410,7 +410,7 @@
         * the reserve buffer, add the reserve map terminating zeroes,
         * the device tree itself, and finally the strings.
         */
-       blob = data_append_data(blob, &fdt, sizeof(fdt));
+       blob = data_append_data(blob, &fdt, vi->hdr_size);
        blob = data_append_align(blob, 8);
        blob = data_merge(blob, reservebuf);
        blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
@@ -809,7 +809,7 @@
 
 struct boot_info *dt_from_blob(FILE *f)
 {
-       u32 magic, totalsize, version, size_str, size_dt;
+       u32 magic, totalsize, version, size_dt;
        u32 off_dt, off_str, off_mem_rsvmap;
        int rc;
        char *blob;
@@ -889,11 +889,13 @@
        if (off_str > totalsize)
                die("String table offset exceeds total size\n");
 
-       size_str = -1;
        if (version >= 3) {
-               size_str = be32_to_cpu(fdt->size_dt_strings);
+               u32 size_str = be32_to_cpu(fdt->size_dt_strings);
                if (off_str+size_str > totalsize)
                        die("String table extends past total size\n");
+               inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
+       } else {
+               inbuf_init(&strbuf, blob + off_str, blob + totalsize);
        }
 
        if (version >= 17) {
@@ -911,10 +913,6 @@
        inbuf_init(&memresvbuf,
                   blob + off_mem_rsvmap, blob + totalsize);
        inbuf_init(&dtbuf, blob + off_dt, blob + totalsize);
-       if (size_str >= 0)
-               inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
-       else
-               inbuf_init(&strbuf, blob + off_str, blob + totalsize);
 
        reservelist = flat_read_mem_reserve(&memresvbuf);
 

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to