From ede25deae69872417579a46a4476bbf1620657e2 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 1 Dec 2006 15:02:10 +1100 Subject: [PATCH] libfdt: Export accessors for header fields This patch adds exported accessor macros for the various flat device tree header fields to libfdt.h. This necessitates moving some of the byte-swapping functions. Signed-off-by: David Gibson --- fdt.c | 2 +- fdt_ro.c | 16 ++++++---------- fdt_sw.c | 41 ++++++++++++++++++----------------------- libfdt.h | 12 +++++++++++- libfdt_env.h | 5 ++++- libfdt_internal.h | 2 +- tests/dumptrees.c | 2 +- tests/tests.h | 12 ------------ 8 files changed, 42 insertions(+), 50 deletions(-) diff --git a/fdt.c b/fdt.c index 03f1a0d..b24a3fe 100644 --- a/fdt.c +++ b/fdt.c @@ -27,7 +27,7 @@ void *fdt_offset_ptr(const struct fdt_header *fdt, int offset, int len) { void *p; - p = (void *)fdt + fdt32_to_cpu(fdt->off_dt_struct) + offset; + p = (void *)fdt + fdt_off_dt_struct(fdt) + offset; if (p + len < p) return NULL; diff --git a/fdt_ro.c b/fdt_ro.c index 43a79e5..db5281c 100644 --- a/fdt_ro.c +++ b/fdt_ro.c @@ -25,19 +25,15 @@ static int check_header(const struct fdt_header *fdt) { - uint32_t magic = fdt32_to_cpu(fdt->magic); - uint32_t version = fdt32_to_cpu(fdt->version); - uint32_t last_comp_version = fdt32_to_cpu(fdt->last_comp_version); - - if (magic == FDT_MAGIC) { + if (fdt_magic(fdt) == FDT_MAGIC) { /* Complete tree */ - if (version < FDT_FIRST_SUPPORTED_VERSION) + if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) return FDT_ERR_BADVERSION; - if (last_comp_version > FDT_LAST_SUPPORTED_VERSION) + if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) return FDT_ERR_BADVERSION; - } else if (magic == SW_MAGIC) { + } else if (fdt_magic(fdt) == SW_MAGIC) { /* Unfinished sequential-write blob */ - if (SW_SIZE_DT_STRUCT(fdt) == 0) + if (sw_size_dt_struct(fdt) == 0) return FDT_ERR_BADSTATE; } else { return FDT_ERR_BADMAGIC; @@ -73,7 +69,7 @@ static int offset_streq(const struct fdt_header *fdt, int offset, char *fdt_string(const struct fdt_header *fdt, int stroffset) { - return (char *)fdt + fdt32_to_cpu(fdt->off_dt_strings) + stroffset; + return (char *)fdt + fdt_off_dt_strings(fdt) + stroffset; } int fdt_property_offset(const struct fdt_header *fdt, int nodeoffset, diff --git a/fdt_sw.c b/fdt_sw.c index 84a38d8..b2545b9 100644 --- a/fdt_sw.c +++ b/fdt_sw.c @@ -25,24 +25,23 @@ static int check_header_sw(struct fdt_header *fdt) { - if (fdt32_to_cpu(fdt->magic) != SW_MAGIC) + if (fdt_magic(fdt) != SW_MAGIC) return FDT_ERR_BADMAGIC; return 0; } static void *grab_space(struct fdt_header *fdt, int len) { - int off_dt_struct = fdt32_to_cpu(fdt->off_dt_struct); - int offset = fdt32_to_cpu(SW_SIZE_DT_STRUCT(fdt)); + int offset = sw_size_dt_struct(fdt); int spaceleft; - spaceleft = fdt32_to_cpu(fdt->totalsize) - off_dt_struct - - fdt32_to_cpu(fdt->size_dt_strings); + spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt) + - fdt_size_dt_strings(fdt); if ((offset + len < offset) || (offset + len > spaceleft)) return NULL; - SW_SIZE_DT_STRUCT(fdt) = cpu_to_fdt32(offset + len); + fdt->version = cpu_to_fdt32(offset + len); return fdt_offset_ptr(fdt, offset, len); } @@ -74,11 +73,11 @@ int fdt_add_reservemap_entry(struct fdt_header *fdt, uint64_t addr, uint64_t siz if (err) return err; - if (SW_SIZE_DT_STRUCT(fdt)) + if (sw_size_dt_struct(fdt)) return FDT_ERR_BADSTATE; - offset = fdt32_to_cpu(fdt->off_dt_struct); - if ((offset + sizeof(*re)) > fdt32_to_cpu(fdt->totalsize)) + offset = fdt_off_dt_struct(fdt); + if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) return FDT_ERR_NOSPACE; re = (struct fdt_reserve_entry *)((void *)fdt + offset); @@ -131,9 +130,8 @@ int fdt_end_node(struct fdt_header *fdt) static int find_add_string(struct fdt_header *fdt, const char *s) { - int totalsize = fdt32_to_cpu(fdt->totalsize); - char *strtab = (char *)fdt + totalsize; - int strtabsize = fdt32_to_cpu(fdt->size_dt_strings); + char *strtab = (char *)fdt + fdt_totalsize(fdt); + int strtabsize = fdt_size_dt_strings(fdt); int len = strlen(s) + 1; int struct_top, offset; @@ -149,9 +147,8 @@ static int find_add_string(struct fdt_header *fdt, const char *s) /* Add it */ offset = -strtabsize - len; - struct_top = fdt32_to_cpu(fdt->off_dt_struct) - + fdt32_to_cpu(SW_SIZE_DT_STRUCT(fdt)); - if (totalsize + offset < struct_top) + struct_top = fdt_off_dt_struct(fdt) + sw_size_dt_struct(fdt); + if (fdt_totalsize(fdt) + offset < struct_top) return 0; /* no more room :( */ memcpy(strtab + offset, s, len); @@ -188,7 +185,7 @@ int fdt_finish(struct fdt_header *fdt) int err = check_header_sw(fdt); char *p = (char *)fdt; uint32_t *end; - int oldstroffset, newstroffset, strsize; + int oldstroffset, newstroffset; uint32_t tag; int offset, nextoffset; @@ -202,11 +199,9 @@ int fdt_finish(struct fdt_header *fdt) *end = cpu_to_fdt32(FDT_END); /* Relocate the string table */ - strsize = fdt32_to_cpu(fdt->size_dt_strings); - oldstroffset = fdt32_to_cpu(fdt->totalsize) - strsize; - newstroffset = fdt32_to_cpu(fdt->off_dt_struct) - + fdt32_to_cpu(SW_SIZE_DT_STRUCT(fdt)); - memmove(p + newstroffset, p + oldstroffset, strsize); + oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt); + newstroffset = fdt_off_dt_struct(fdt) + sw_size_dt_struct(fdt); + memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt)); fdt->off_dt_strings = fdt32_to_cpu(newstroffset); /* Walk the structure, correcting string offsets */ @@ -221,14 +216,14 @@ int fdt_finish(struct fdt_header *fdt) return FDT_ERR_BADSTRUCTURE; nameoff = fdt32_to_cpu(prop->nameoff); - nameoff += strsize; + nameoff += fdt_size_dt_strings(fdt); prop->nameoff = cpu_to_fdt32(nameoff); } offset = nextoffset; } /* Finally, adjust the header */ - fdt->totalsize = cpu_to_fdt32(newstroffset + strsize); + fdt->totalsize = cpu_to_fdt32(newstroffset + fdt_size_dt_strings(fdt)); fdt->version = cpu_to_fdt32(FDT_LAST_SUPPORTED_VERSION); fdt->last_comp_version= cpu_to_fdt32(FDT_FIRST_SUPPORTED_VERSION); fdt->magic = cpu_to_fdt32(FDT_MAGIC); diff --git a/libfdt.h b/libfdt.h index b58ae0f..d4f98dc 100644 --- a/libfdt.h +++ b/libfdt.h @@ -20,6 +20,7 @@ */ #include +#include #define FDT_FIRST_SUPPORTED_VERSION 0x10 #define FDT_LAST_SUPPORTED_VERSION 0x10 @@ -42,7 +43,16 @@ #define FDT_ERR_MAX 13 -/* Offset handling functions */ +#define fdt_magic(fdt) (fdt32_to_cpu(fdt)->magic) +#define fdt_totalsize(fdt) (fdt32_to_cpu(fdt)->totalsize) +#define fdt_off_dt_struct(fdt) (fdt32_to_cpu(fdt)->off_dt_struct) +#define fdt_off_dt_strings(fdt) (fdt32_to_cpu(fdt)->off_dt_strings) +#define fdt_off_mem_rsvmap(fdt) (fdt32_to_cpu(fdt)->off_mem_rsvmap) +#define fdt_version(fdt) (fdt32_to_cpu(fdt)->version) +#define fdt_last_comp_version(fdt) (fdt32_to_cpu(fdt)->last_comp_version) +#define fdt_boot_cpuid_phys(fdt) (fdt32_to_cpu(fdt)->boot_cpuid_phys) +#define fdt_size_dt_strings(fdt) (fdt32_to_cpu(fdt)->size_dt_strings) + void *fdt_offset_ptr(const struct fdt_header *fdt, int offset, int checklen); #define fdt_offset_ptr_typed(fdt, offset, var) \ diff --git a/libfdt_env.h b/libfdt_env.h index a9b196f..59f2536 100644 --- a/libfdt_env.h +++ b/libfdt_env.h @@ -1,3 +1,6 @@ +#ifndef _LIBFDT_ENV_H +#define _LIBFDT_ENV_H + #include #include #include @@ -16,4 +19,4 @@ #define cpu_to_fdt64(x) (bswap_64((x))) #endif -#include "libfdt.h" +#endif /* _LIBFDT_ENV_H */ diff --git a/libfdt_internal.h b/libfdt_internal.h index 0bc2786..06fa1cc 100644 --- a/libfdt_internal.h +++ b/libfdt_internal.h @@ -35,6 +35,6 @@ struct fdt_property *_fdt_getprop(const struct fdt_header *fdt, int nodeoffset, #define PTR_ERROR(code) (void *)(-(code)) #define SW_MAGIC (~FDT_MAGIC) -#define SW_SIZE_DT_STRUCT(fdt) ((fdt)->version) +#define sw_size_dt_struct(fdt) (fdt32_to_cpu(((fdt)->version))) #endif /* _LIBFDT_INTERNAL_H */ diff --git a/tests/dumptrees.c b/tests/dumptrees.c index d7e110d..f0a9b2c 100644 --- a/tests/dumptrees.c +++ b/tests/dumptrees.c @@ -4,8 +4,8 @@ #include #include +#include -#include "tests.h" #include "testdata.h" struct { diff --git a/tests/tests.h b/tests/tests.h index 64ab64f..732e6a4 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -37,18 +37,6 @@ void test_init(int argc, char *argv[]); #define streq(s1, s2) (strcmp((s1),(s2)) == 0) -#if __BYTE_ORDER == __BIG_ENDIAN -#define fdt32_to_cpu(x) (x) -#define cpu_to_fdt32(x) (x) -#define fdt64_to_cpu(x) (x) -#define cpu_to_fdt64(x) (x) -#else -#define fdt32_to_cpu(x) (bswap_32((x))) -#define cpu_to_fdt32(x) (bswap_32((x))) -#define fdt64_to_cpu(x) (bswap_64((x))) -#define cpu_to_fdt64(x) (bswap_64((x))) -#endif - /* Each test case must define this function */ void cleanup(void);