Re: [PATCH 6/6] Restore phandle references from __fixups__ node
David Gibson <[email protected]> Thu, 21 Aug 2025 14:31:37 +1000
| Newsgroups | org.kernel.vger.devicetree-compiler |
|---|---|
| Message-ID | <aKahKWCQhFt_o0Jp@zatzit> |
On Wed, Aug 20, 2025 at 03:11:32PM +0200, Uwe Kleine-König wrote: > The __fixups__ node contains information about labels. Parse its > properties to create phandle markers which improve the resulting dts > when decompiling a device tree blob. > > Signed-off-by: Uwe Kleine-König <[email protected]> Reviewed-by: David Gibson <[email protected]> > --- > dtc.c | 1 + > dtc.h | 3 ++ > livetree.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > treesource.c | 6 ++++ > 4 files changed, 106 insertions(+) > > diff --git a/dtc.c b/dtc.c > index 9f90b373967d..6dae60de0ea5 100644 > --- a/dtc.c > +++ b/dtc.c > @@ -343,6 +343,7 @@ int main(int argc, char *argv[]) > if (generate_symbols) > generate_label_tree(dti, "__symbols__", true); > > + fixup_phandles(dti, "__fixups__"); > local_fixup_phandles(dti, "__local_fixups__"); > > if (generate_fixups) { > diff --git a/dtc.h b/dtc.h > index d07a583441f6..7231200e5d02 100644 > --- a/dtc.h > +++ b/dtc.h > @@ -342,6 +342,7 @@ void sort_tree(struct dt_info *dti); > void generate_labels_from_tree(struct dt_info *dti, const char *name); > void generate_label_tree(struct dt_info *dti, const char *name, bool allocph); > void generate_fixups_tree(struct dt_info *dti, const char *name); > +void fixup_phandles(struct dt_info *dti, const char *name); > void generate_local_fixups_tree(struct dt_info *dti, const char *name); > void local_fixup_phandles(struct dt_info *dti, const char *name); > > @@ -359,6 +360,8 @@ struct dt_info *dt_from_blob(const char *fname); > > /* Tree source */ > > +void property_add_marker(struct property *prop, > + enum markertype type, unsigned int offset, char *ref); > void add_phandle_marker(struct dt_info *dti, struct property *prop, unsigned int offset); > void dt_to_source(FILE *f, struct dt_info *dti); > struct dt_info *dt_from_source(const char *f); > diff --git a/livetree.c b/livetree.c > index 3dbef9071017..5d72abceb526 100644 > --- a/livetree.c > +++ b/livetree.c > @@ -1151,6 +1151,102 @@ void generate_fixups_tree(struct dt_info *dti, const char *name) > name); > } > > +void fixup_phandles(struct dt_info *dti, const char *name) > +{ > + struct node *an; > + struct property *fp; > + > + an = get_subnode(dti->dt, name); > + if (!an) > + return; > + > + for_each_property(an, fp) { > + char *fnext = fp->val.val; > + char *fv; > + unsigned int fl; > + > + while ((fl = fp->val.len - (fnext - fp->val.val))) { > + char *propname, *soffset; > + struct node *n; > + struct property *p; > + long offset; > + > + fv = fnext; > + fnext = memchr(fv, 0, fl); > + > + if (!fnext) { > + if (quiet < 1) > + fprintf(stderr, "Warning: Malformed fixup entry for label %s\n", > + fp->name); > + break; > + } > + fnext += 1; > + > + propname = memchr(fv, ':', fnext - 1 - fv); > + if (!propname) { > + if (quiet < 1) > + fprintf(stderr, "Warning: Malformed fixup entry for label %s\n", > + fp->name); > + continue; > + } > + propname++; > + > + soffset = memchr(propname, ':', fnext - 1 - propname); > + if (!soffset) { > + if (quiet < 1) > + fprintf(stderr, "Warning: Malformed fixup entry for label %s\n", > + fp->name); > + continue; > + } > + soffset++; > + > + /* > + * temporarily modify the property to not have to create > + * a copy for the node path. > + */ > + *(propname - 1) = '\0'; > + > + n = get_node_by_path(dti->dt, fv); > + if (!n && quiet < 1) > + fprintf(stderr, "Warning: Label %s references non-existing node %s\n", > + fp->name, fv); > + > + *(propname - 1) = ':'; > + > + if (!n) > + continue; > + > + /* > + * temporarily modify the property to not have to create > + * a copy for the property name. > + */ > + *(soffset - 1) = '\0'; > + > + p = get_property(n, propname); > + > + if (!p && quiet < 1) > + fprintf(stderr, "Warning: Label %s references non-existing property %s in node %s\n", > + fp->name, n->fullpath, propname); > + > + *(soffset - 1) = ':'; > + > + if (!p) > + continue; > + > + offset = strtol(soffset, NULL, 0); > + if (offset < 0 || offset + 4 > p->val.len) { > + if (quiet < 1) > + fprintf(stderr, > + "Warning: Label %s contains invalid offset for property %s in node %s\n", > + fp->name, p->name, n->fullpath); > + continue; > + } > + > + property_add_marker(p, REF_PHANDLE, offset, fp->name); > + } > + } > +} > + > void generate_local_fixups_tree(struct dt_info *dti, const char *name) > { > if (!any_local_fixup_tree(dti, dti->dt)) > diff --git a/treesource.c b/treesource.c > index 5b8d7a679519..6cd996f0d17b 100644 > --- a/treesource.c > +++ b/treesource.c > @@ -173,6 +173,12 @@ static struct marker **add_marker(struct marker **mi, > return &nm->next; > } > > +void property_add_marker(struct property *prop, > + enum markertype type, unsigned int offset, char *ref) > +{ > + add_marker(&prop->val.markers, type, offset, ref); > +} > + > static void add_string_markers(struct property *prop, unsigned int offset, int len) > { > int l; -- David Gibson (he or they) | 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
signature.asc
(application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmimoSgACgkQzQJF27ox 2GfHihAAlxVe+3m4FZGQGpWZCUa10bXBUFgknYAT637aqEguJOe1zXiPUKih2S83 aS448H4C6UTQOUP+498Vw5Fsj0nahnM24xld/PnDa+BysDv8SlTRieHTCWx7JT3z EPn5oaYKbOmh6ODYGcci/73JQ5jf/FM0EWz/q4TMKeJLU/17sjOa6drAjtJBdEco LN80yufIaCHJ+Xx2ZFDh8D+r51PzBboMiSYW9XsuCo4PiJ3xCP9LJrCptNM6Z5wX b0OBO0/dUJLJKqQm15GRIBEkHPzLqh0k5LvmcEyJ0wTZYseQZDTERzwMIOWFVyy1 QG6x0D8eHibZX5u/28XzpuGhN9Nn+V94KtZr8SOTptWHHIDH1mqKCY1vJRuOgXd3 GY+Es8UH1wEUP0p9ikxJ61HNG9V6ZvAKF+szhhXizu2Jh+xZRm38oLzqULZ5lGmA eEs27eVMqHU5qlmggSV4B1oBRZoJMTmZoFdiTP37uXBDrZCayAUrodQIR+0M2QWb pOAcwaIwcCS9iQjNvhaoKGBbd8ENB1chmQ4ozsI2CQfMmJh3TMIxadDDqGhPleQt ECCx9BEY0XyBlzseznUiYIfi/asonsVxC77P6aoRbxmCBVa8BIiP5aOEalvndXN5 TcXBqp6SeHjBQTY9eUsQ/l5pS8VIG7wiKHbBS+aDchM2umJCXHo= =pqwf -----END PGP SIGNATURE-----