mirror of
https://github.com/dgibson/dtc.git
synced 2025-10-14 00:37:41 -04:00
dtc: Test and fix conversion to/from old dtb versions
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 <david@gibson.dropbear.id.au>
This commit is contained in:
parent
d028e84140
commit
a266e5c1e1
2 changed files with 19 additions and 8 deletions
14
flattree.c
14
flattree.c
|
@ -410,7 +410,7 @@ void dt_to_blob(FILE *f, struct boot_info *bi, int version,
|
||||||
* the reserve buffer, add the reserve map terminating zeroes,
|
* the reserve buffer, add the reserve map terminating zeroes,
|
||||||
* the device tree itself, and finally the strings.
|
* 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_append_align(blob, 8);
|
||||||
blob = data_merge(blob, reservebuf);
|
blob = data_merge(blob, reservebuf);
|
||||||
blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
|
blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
|
||||||
|
@ -809,7 +809,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,
|
||||||
|
|
||||||
struct boot_info *dt_from_blob(FILE *f)
|
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;
|
u32 off_dt, off_str, off_mem_rsvmap;
|
||||||
int rc;
|
int rc;
|
||||||
char *blob;
|
char *blob;
|
||||||
|
@ -889,11 +889,13 @@ struct boot_info *dt_from_blob(FILE *f)
|
||||||
if (off_str > totalsize)
|
if (off_str > totalsize)
|
||||||
die("String table offset exceeds total size\n");
|
die("String table offset exceeds total size\n");
|
||||||
|
|
||||||
size_str = -1;
|
|
||||||
if (version >= 3) {
|
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)
|
if (off_str+size_str > totalsize)
|
||||||
die("String table extends past total size\n");
|
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) {
|
if (version >= 17) {
|
||||||
|
@ -911,10 +913,6 @@ struct boot_info *dt_from_blob(FILE *f)
|
||||||
inbuf_init(&memresvbuf,
|
inbuf_init(&memresvbuf,
|
||||||
blob + off_mem_rsvmap, blob + totalsize);
|
blob + off_mem_rsvmap, blob + totalsize);
|
||||||
inbuf_init(&dtbuf, blob + off_dt, 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);
|
reservelist = flat_read_mem_reserve(&memresvbuf);
|
||||||
|
|
||||||
|
|
|
@ -172,6 +172,19 @@ dtc_tests () {
|
||||||
run_test dtbs_equal_ordered $tree odts_$tree.test.dtb
|
run_test dtbs_equal_ordered $tree odts_$tree.test.dtb
|
||||||
done
|
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
|
# Check some checks
|
||||||
run_test dtc-checkfails.sh duplicate_node_names -- -I dts -O dtb dup-nodename.dts
|
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
|
run_test dtc-checkfails.sh duplicate_property_names -- -I dts -O dtb dup-propname.dts
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue