diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2018-03-16 22:40:26 +1100 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2018-04-11 16:49:38 +1000 |
commit | b4d28f2d34ccdcbd18dfed86574c05d762f72327 (patch) | |
tree | 2e303eecff51f4706a7607aeb4bd52d57e72e703 | |
parent | 9f43feb601df38c5661f5969a6f6b2dc39d1473c (diff) | |
download | device-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.c | 20 | ||||
-rw-r--r-- | libfdt/libfdt.h | 10 | ||||
-rw-r--r-- | tests/mangle-layout.c | 8 |
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); |