56#include "libfdt_internal.h"
63 if (fdt_magic (fdt) == FDT_MAGIC) {
65 if (fdt_version (fdt) < FDT_FIRST_SUPPORTED_VERSION) {
66 return -FDT_ERR_BADVERSION;
69 if (fdt_last_comp_version (fdt) > FDT_LAST_SUPPORTED_VERSION) {
70 return -FDT_ERR_BADVERSION;
72 }
else if (fdt_magic (fdt) == FDT_SW_MAGIC) {
74 if (fdt_size_dt_struct (fdt) == 0) {
75 return -FDT_ERR_BADSTATE;
78 return -FDT_ERR_BADMAGIC;
91 unsigned absoffset = offset + fdt_off_dt_struct (fdt);
93 if ( (absoffset < offset)
94 || ((absoffset + len) < absoffset)
95 || ((absoffset + len) > fdt_totalsize (fdt)))
100 if (fdt_version (fdt) >= 0x11) {
101 if ( ((offset + len) < offset)
102 || ((offset + len) > fdt_size_dt_struct (fdt)))
108 return _fdt_offset_ptr (fdt, offset);
118 const fdt32_t *tagp, *lenp;
120 int offset = startoffset;
123 *nextoffset = -FDT_ERR_TRUNCATED;
124 tagp = fdt_offset_ptr (fdt, offset, FDT_TAGSIZE);
129 tag = fdt32_to_cpu (*tagp);
130 offset += FDT_TAGSIZE;
132 *nextoffset = -FDT_ERR_BADSTRUCTURE;
137 p = fdt_offset_ptr (fdt, offset++, 1);
138 }
while (p && (*p !=
'\0'));
147 lenp = fdt_offset_ptr (fdt, offset,
sizeof (*lenp));
154 + fdt32_to_cpu (*lenp);
166 if (!fdt_offset_ptr (fdt, startoffset, offset - startoffset)) {
170 *nextoffset = FDT_TAGALIGN (offset);
175_fdt_check_node_offset (
180 if ( (offset < 0) || (offset % FDT_TAGSIZE)
181 || (fdt_next_tag (fdt, offset, &offset) != FDT_BEGIN_NODE))
183 return -FDT_ERR_BADOFFSET;
190_fdt_check_prop_offset (
195 if ( (offset < 0) || (offset % FDT_TAGSIZE)
196 || (fdt_next_tag (fdt, offset, &offset) != FDT_PROP))
198 return -FDT_ERR_BADOFFSET;
215 if ((nextoffset = _fdt_check_node_offset (fdt, offset)) < 0) {
222 tag = fdt_next_tag (fdt, offset, &nextoffset);
237 if (depth && ((--(*depth)) < 0)) {
244 if ( (nextoffset >= 0)
245 || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth))
247 return -FDT_ERR_NOTFOUND;
252 }
while (tag != FDT_BEGIN_NODE);
265 offset = fdt_next_node (fdt, offset, &depth);
266 if ((offset < 0) || (depth != 1)) {
267 return -FDT_ERR_NOTFOUND;
286 offset = fdt_next_node (fdt, offset, &depth);
287 if ((offset < 0) || (depth < 1)) {
288 return -FDT_ERR_NOTFOUND;
302 int len = strlen (s) + 1;
303 const char *last = strtab + tabsize - len;
306 for (p = strtab; p <= last; p++) {
307 if (memcmp (p, s, len) == 0) {
322 FDT_CHECK_HEADER (fdt);
324 if (fdt_totalsize (fdt) > bufsize) {
325 return -FDT_ERR_NOSPACE;
328 memmove (buf, fdt, fdt_totalsize (fdt));