Browse Source

dtc: Correct invalid dts output with mixed phandles and integers

The handling of "type preservation" dts output is based on the idea of
"phandles with arguments" in properties, which isn't really a thing, other
than a fairly common convention about how bindings are written.  There's
nothing preventing a binding which freely mixes phandles and other integers
in an array of cells.

Currently write_propval() handles this incorrectly: specifically the case
of a phandle which follows a regular integer in a 32-bit cell array, but
without a new '< >' delimited causing an extra TYPE_UINT32 marker to be
inserted.  In this case it omits the necessary space between the integer
and the phandle reference, leading to output which can't be sent back into
dtc and parsed.

Correct this, and update tests to match.  I think this is more or less
correct for now, but really write_propval() is a big mess :(.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
David Gibson 1 year ago
parent
commit
3b02a94b48
  1. 1
      tests/type-preservation.dt.yaml
  2. 1
      tests/type-preservation.dts
  3. 2
      treesource.c

1
tests/type-preservation.dt.yaml

@ -15,6 +15,7 @@ @@ -15,6 +15,7 @@
a-string-with-nulls: ["foo\0bar", "baz"]
a-phandle: [[!phandle 0x1]]
a-phandle-with-args: [[!phandle 0x1, 0x0, 0x1], [!phandle 0x1, 0x2, 0x3]]
mixed-ints-and-phandles: [[0x1, !phandle 0x1, 0x2, !phandle 0x1]]
subsubnode:
compatible: ["subsubnode1", "subsubnode"]
phandle: [[0x1]]

1
tests/type-preservation.dts

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
a-string-with-nulls = "foo\0bar", "baz";
a-phandle = <&subsub1>;
a-phandle-with-args = <&subsub1 0x00 0x01>, <&subsub1 0x02 0x03>;
mixed-ints-and-phandles = <0x01 &subsub1 0x02 &subsub1>;

subsub1: subsubnode {
compatible = "subsubnode1", "subsubnode";

2
treesource.c

@ -241,6 +241,8 @@ static void write_propval(FILE *f, struct property *prop) @@ -241,6 +241,8 @@ static void write_propval(FILE *f, struct property *prop)
} else {
write_propval_int(f, p, chunk_len, 4);
}
if (data_len > chunk_len)
fputc(' ', f);
break;
case TYPE_UINT64:
write_propval_int(f, p, chunk_len, 8);

Loading…
Cancel
Save