Browse Source
This function is used to perform a full check of the device tree. Allow it to be excluded if all assumptions are enabled. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Message-Id: <20200220214557.176528-9-sjg@chromium.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>main
Simon Glass
5 years ago
committed by
David Gibson
3 changed files with 75 additions and 64 deletions
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) |
||||
/* |
||||
* libfdt - Flat Device Tree manipulation |
||||
* Copyright (C) 2006 David Gibson, IBM Corporation. |
||||
*/ |
||||
#include "libfdt_env.h" |
||||
|
||||
#include <fdt.h> |
||||
#include <libfdt.h> |
||||
|
||||
#include "libfdt_internal.h" |
||||
|
||||
int fdt_check_full(const void *fdt, size_t bufsize) |
||||
{ |
||||
int err; |
||||
int num_memrsv; |
||||
int offset, nextoffset = 0; |
||||
uint32_t tag; |
||||
unsigned int depth = 0; |
||||
const void *prop; |
||||
const char *propname; |
||||
|
||||
if (bufsize < FDT_V1_SIZE) |
||||
return -FDT_ERR_TRUNCATED; |
||||
err = fdt_check_header(fdt); |
||||
if (err != 0) |
||||
return err; |
||||
if (bufsize < fdt_totalsize(fdt)) |
||||
return -FDT_ERR_TRUNCATED; |
||||
|
||||
num_memrsv = fdt_num_mem_rsv(fdt); |
||||
if (num_memrsv < 0) |
||||
return num_memrsv; |
||||
|
||||
while (1) { |
||||
offset = nextoffset; |
||||
tag = fdt_next_tag(fdt, offset, &nextoffset); |
||||
|
||||
if (nextoffset < 0) |
||||
return nextoffset; |
||||
|
||||
switch (tag) { |
||||
case FDT_NOP: |
||||
break; |
||||
|
||||
case FDT_END: |
||||
if (depth != 0) |
||||
return -FDT_ERR_BADSTRUCTURE; |
||||
return 0; |
||||
|
||||
case FDT_BEGIN_NODE: |
||||
depth++; |
||||
if (depth > INT_MAX) |
||||
return -FDT_ERR_BADSTRUCTURE; |
||||
break; |
||||
|
||||
case FDT_END_NODE: |
||||
if (depth == 0) |
||||
return -FDT_ERR_BADSTRUCTURE; |
||||
depth--; |
||||
break; |
||||
|
||||
case FDT_PROP: |
||||
prop = fdt_getprop_by_offset(fdt, offset, &propname, |
||||
&err); |
||||
if (!prop) |
||||
return err; |
||||
break; |
||||
|
||||
default: |
||||
return -FDT_ERR_INTERNAL; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue