summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2018-03-16 22:40:26 +1100
committerDavid Gibson <david@gibson.dropbear.id.au>2018-04-11 16:49:38 +1000
commitb4d28f2d34ccdcbd18dfed86574c05d762f72327 (patch)
tree2e303eecff51f4706a7607aeb4bd52d57e72e703
parent9f43feb601df38c5661f5969a6f6b2dc39d1473c (diff)
downloaddevice-tree-compiler-b4d28f2d34ccdcbd18dfed86574c05d762f72327.tar.gz
libfdt: Add fdt_header_size()
We have a couple of places within libfdt and its tests where we need to find the size of the header, based on the version. Add a helper function for it. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--libfdt/fdt.c20
-rw-r--r--libfdt/libfdt.h10
-rw-r--r--tests/mangle-layout.c8
3 files changed, 28 insertions, 10 deletions
diff --git a/libfdt/fdt.c b/libfdt/fdt.c
index 4503e9c..1e15613 100644
--- a/libfdt/fdt.c
+++ b/libfdt/fdt.c
@@ -91,21 +91,33 @@ static int check_block_(uint32_t hdrsize, uint32_t totalsize,
return 1;
}
+size_t fdt_header_size_(uint32_t version)
+{
+ if (version <= 1)
+ return FDT_V1_SIZE;
+ else if (version <= 2)
+ return FDT_V2_SIZE;
+ else if (version <= 3)
+ return FDT_V3_SIZE;
+ else if (version <= 16)
+ return FDT_V16_SIZE;
+ else
+ return FDT_V17_SIZE;
+}
+
int fdt_check_header(const void *fdt)
{
- size_t hdrsize = FDT_V16_SIZE;
+ size_t hdrsize;
if (fdt_magic(fdt) != FDT_MAGIC)
return -FDT_ERR_BADMAGIC;
+ hdrsize = fdt_header_size(fdt);
if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
|| (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION))
return -FDT_ERR_BADVERSION;
if (fdt_version(fdt) < fdt_last_comp_version(fdt))
return -FDT_ERR_BADVERSION;
- if (fdt_version(fdt) >= 17)
- hdrsize = FDT_V17_SIZE;
-
if ((fdt_totalsize(fdt) < hdrsize)
|| (fdt_totalsize(fdt) > INT_MAX))
return -FDT_ERR_TRUNCATED;
diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h
index 2c40bd8..9938fb8 100644
--- a/libfdt/libfdt.h
+++ b/libfdt/libfdt.h
@@ -245,6 +245,16 @@ fdt_set_hdr_(size_dt_struct);
#undef fdt_set_hdr_
/**
+ * fdt_header_size - return the size of the tree's header
+ * @fdt: pointer to a flattened device tree
+ */
+size_t fdt_header_size_(uint32_t version);
+static inline size_t fdt_header_size(const void *fdt)
+{
+ return fdt_header_size_(fdt_version(fdt));
+}
+
+/**
* fdt_check_header - sanity check a device tree or possible device tree
* @fdt: pointer to data which might be a flattened device tree
*
diff --git a/tests/mangle-layout.c b/tests/mangle-layout.c
index a76e51e..ae01a55 100644
--- a/tests/mangle-layout.c
+++ b/tests/mangle-layout.c
@@ -44,13 +44,9 @@ static void expand_buf(struct bufstate *buf, int newsize)
static void new_header(struct bufstate *buf, int version, const void *fdt)
{
- int hdrsize;
+ int hdrsize = fdt_header_size_(version);
- if (version == 16)
- hdrsize = FDT_V16_SIZE;
- else if (version == 17)
- hdrsize = FDT_V17_SIZE;
- else
+ if ((version != 16) && (version != 17))
CONFIG("Bad version %d", version);
expand_buf(buf, hdrsize);