[RFC PATCH 05/15] libfdt: Introduce fdt_first_node()
Herve Codina <[email protected]> Tue, 10 Feb 2026 18:33:33 +0100
| Newsgroups | org.kernel.vger.devicetree-spec,org.kernel.vger.devicetree-compiler,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
In several places, libfdt assumes that a FDT_BEGIN_NODE tag is present at the offset 0 of the structure block. This assumption is not correct. Indeed, a FDT_NOP can be present at the offset 0 and this is a legit case. Introduce fdt_first_node() in order to get the offset of the first node (first FDT_BEGIN_NODE tag) available in a fdt blob. Signed-off-by: Herve Codina <[email protected]> --- libfdt/fdt.c | 25 +++++++++++++++++++++++++ libfdt/libfdt_internal.h | 1 + 2 files changed, 26 insertions(+) diff --git a/libfdt/fdt.c b/libfdt/fdt.c index 56d4dcb..676c7d7 100644 --- a/libfdt/fdt.c +++ b/libfdt/fdt.c @@ -252,6 +252,31 @@ int fdt_check_prop_offset_(const void *fdt, int offset) return offset; } +int fdt_first_node(const void *fdt) +{ + int nextoffset = 0; + int offset; + uint32_t tag; + + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + switch (tag) { + case FDT_END_NODE: + case FDT_PROP: + return -FDT_ERR_BADSTRUCTURE; + + case FDT_BEGIN_NODE: + return offset; + + default: + break; + } + } while (tag != FDT_END); + + return (nextoffset < 0) ? nextoffset : -FDT_ERR_NOTFOUND; +} + int fdt_next_node(const void *fdt, int offset, int *depth) { int nextoffset = 0; diff --git a/libfdt/libfdt_internal.h b/libfdt/libfdt_internal.h index 0e103ca..4c15264 100644 --- a/libfdt/libfdt_internal.h +++ b/libfdt/libfdt_internal.h @@ -32,6 +32,7 @@ static inline const char *fdt_find_string_(const char *strtab, int tabsize, } int fdt_node_end_offset_(void *fdt, int nodeoffset); +int fdt_first_node(const void *fdt); static inline const void *fdt_offset_ptr_(const void *fdt, int offset) { -- 2.52.0