mirror of
https://github.com/dgibson/dtc.git
synced 2026-04-11 16:37:42 -04:00
Restore phandle references from __fixups__ node
Some checks failed
Build test / build-make (ubuntu) (push) Has been cancelled
Build test / build-make (alpine) (push) Has been cancelled
Build test / build-make (archlinux) (push) Has been cancelled
Build test / build-make (fedora) (push) Has been cancelled
Build test / build-meson (alpine) (push) Has been cancelled
Build test / build-meson (archlinux) (push) Has been cancelled
Build test / build-meson (fedora) (push) Has been cancelled
Build test / build-meson (ubuntu) (push) Has been cancelled
Build test / clang64 (push) Has been cancelled
Build test / mingw32 (push) Has been cancelled
Build test / mingw64 (push) Has been cancelled
Build test / ucrt64 (push) Has been cancelled
Some checks failed
Build test / build-make (ubuntu) (push) Has been cancelled
Build test / build-make (alpine) (push) Has been cancelled
Build test / build-make (archlinux) (push) Has been cancelled
Build test / build-make (fedora) (push) Has been cancelled
Build test / build-meson (alpine) (push) Has been cancelled
Build test / build-meson (archlinux) (push) Has been cancelled
Build test / build-meson (fedora) (push) Has been cancelled
Build test / build-meson (ubuntu) (push) Has been cancelled
Build test / clang64 (push) Has been cancelled
Build test / mingw32 (push) Has been cancelled
Build test / mingw64 (push) Has been cancelled
Build test / ucrt64 (push) Has been cancelled
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. Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com> Message-ID: <20250919092912.663304-14-u.kleine-koenig@baylibre.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
05c524db44
commit
a26ef6400b
4 changed files with 106 additions and 0 deletions
1
dtc.c
1
dtc.c
|
|
@ -343,6 +343,7 @@ int main(int argc, char *argv[])
|
||||||
if (generate_symbols)
|
if (generate_symbols)
|
||||||
generate_label_tree(dti, "__symbols__", true);
|
generate_label_tree(dti, "__symbols__", true);
|
||||||
|
|
||||||
|
fixup_phandles(dti, "__fixups__");
|
||||||
local_fixup_phandles(dti, "__local_fixups__");
|
local_fixup_phandles(dti, "__local_fixups__");
|
||||||
|
|
||||||
if (generate_fixups) {
|
if (generate_fixups) {
|
||||||
|
|
|
||||||
3
dtc.h
3
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_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_label_tree(struct dt_info *dti, const char *name, bool allocph);
|
||||||
void generate_fixups_tree(struct dt_info *dti, const char *name);
|
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 generate_local_fixups_tree(struct dt_info *dti, const char *name);
|
||||||
void local_fixup_phandles(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 */
|
/* 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 add_phandle_marker(struct dt_info *dti, struct property *prop, unsigned int offset);
|
||||||
void dt_to_source(FILE *f, struct dt_info *dti);
|
void dt_to_source(FILE *f, struct dt_info *dti);
|
||||||
struct dt_info *dt_from_source(const char *f);
|
struct dt_info *dt_from_source(const char *f);
|
||||||
|
|
|
||||||
96
livetree.c
96
livetree.c
|
|
@ -1151,6 +1151,102 @@ void generate_fixups_tree(struct dt_info *dti, const char *name)
|
||||||
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)
|
void generate_local_fixups_tree(struct dt_info *dti, const char *name)
|
||||||
{
|
{
|
||||||
if (!any_local_fixup_tree(dti, dti->dt))
|
if (!any_local_fixup_tree(dti, dti->dt))
|
||||||
|
|
|
||||||
|
|
@ -173,6 +173,12 @@ static struct marker **add_marker(struct marker **mi,
|
||||||
return &nm->next;
|
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)
|
static void add_string_markers(struct property *prop, unsigned int offset, int len)
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue