libfdt: Downgrade to version 1.4.6-9
Version 1.4.7 introduces a big performance hit to functions that access
the FDT. Downgrade the library to version 1.4.6-9, before the changes
that introduce the problem. Version 1.4.6 isn't used because one of the
libfdt files (fdt_overlay.c) is missing the license header. This
problem is also fixed in 1.4.6-9.
This version corresponds to commit <aadd0b65c987> checks: centralize
printing of property names in failure messages.
Fixes ARM-software/tf-issues#643
Change-Id: I73c05f2b1f994bcdcc4366131ce0647553cdcfb8
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
diff --git a/lib/libfdt/fdt_sw.c b/lib/libfdt/fdt_sw.c
index 9fa4a94..6d33cc2 100644
--- a/lib/libfdt/fdt_sw.c
+++ b/lib/libfdt/fdt_sw.c
@@ -55,77 +55,21 @@
#include "libfdt_internal.h"
-static int fdt_sw_probe_(void *fdt)
+static int fdt_sw_check_header_(void *fdt)
{
- if (fdt_magic(fdt) == FDT_MAGIC)
- return -FDT_ERR_BADSTATE;
- else if (fdt_magic(fdt) != FDT_SW_MAGIC)
+ if (fdt_magic(fdt) != FDT_SW_MAGIC)
return -FDT_ERR_BADMAGIC;
- return 0;
-}
-
-#define FDT_SW_PROBE(fdt) \
- { \
- int err; \
- if ((err = fdt_sw_probe_(fdt)) != 0) \
- return err; \
- }
-
-/* 'memrsv' state: Initial state after fdt_create()
- *
- * Allowed functions:
- * fdt_add_reservmap_entry()
- * fdt_finish_reservemap() [moves to 'struct' state]
- */
-static int fdt_sw_probe_memrsv_(void *fdt)
-{
- int err = fdt_sw_probe_(fdt);
- if (err)
- return err;
-
- if (fdt_off_dt_strings(fdt) != 0)
- return -FDT_ERR_BADSTATE;
- return 0;
-}
-
-#define FDT_SW_PROBE_MEMRSV(fdt) \
- { \
- int err; \
- if ((err = fdt_sw_probe_memrsv_(fdt)) != 0) \
- return err; \
- }
-
-/* 'struct' state: Enter this state after fdt_finish_reservemap()
- *
- * Allowed functions:
- * fdt_begin_node()
- * fdt_end_node()
- * fdt_property*()
- * fdt_finish() [moves to 'complete' state]
- */
-static int fdt_sw_probe_struct_(void *fdt)
-{
- int err = fdt_sw_probe_(fdt);
- if (err)
- return err;
-
- if (fdt_off_dt_strings(fdt) != fdt_totalsize(fdt))
- return -FDT_ERR_BADSTATE;
+ /* FIXME: should check more details about the header state */
return 0;
}
-#define FDT_SW_PROBE_STRUCT(fdt) \
+#define FDT_SW_CHECK_HEADER(fdt) \
{ \
int err; \
- if ((err = fdt_sw_probe_struct_(fdt)) != 0) \
+ if ((err = fdt_sw_check_header_(fdt)) != 0) \
return err; \
}
-/* 'complete' state: Enter this state after fdt_finish()
- *
- * Allowed functions: none
- */
-
static void *fdt_grab_space_(void *fdt, size_t len)
{
int offset = fdt_size_dt_struct(fdt);
@@ -143,11 +87,9 @@
int fdt_create(void *buf, int bufsize)
{
- const size_t hdrsize = FDT_ALIGN(sizeof(struct fdt_header),
- sizeof(struct fdt_reserve_entry));
void *fdt = buf;
- if (bufsize < hdrsize)
+ if (bufsize < sizeof(struct fdt_header))
return -FDT_ERR_NOSPACE;
memset(buf, 0, bufsize);
@@ -157,9 +99,10 @@
fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
fdt_set_totalsize(fdt, bufsize);
- fdt_set_off_mem_rsvmap(fdt, hdrsize);
+ fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header),
+ sizeof(struct fdt_reserve_entry)));
fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
- fdt_set_off_dt_strings(fdt, 0);
+ fdt_set_off_dt_strings(fdt, bufsize);
return 0;
}
@@ -169,14 +112,11 @@
size_t headsize, tailsize;
char *oldtail, *newtail;
- FDT_SW_PROBE(fdt);
+ FDT_SW_CHECK_HEADER(fdt);
- headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
+ headsize = fdt_off_dt_struct(fdt);
tailsize = fdt_size_dt_strings(fdt);
- if ((headsize + tailsize) > fdt_totalsize(fdt))
- return -FDT_ERR_INTERNAL;
-
if ((headsize + tailsize) > bufsize)
return -FDT_ERR_NOSPACE;
@@ -193,9 +133,8 @@
memmove(buf, fdt, headsize);
}
+ fdt_set_off_dt_strings(buf, bufsize);
fdt_set_totalsize(buf, bufsize);
- if (fdt_off_dt_strings(buf))
- fdt_set_off_dt_strings(buf, bufsize);
return 0;
}
@@ -205,7 +144,10 @@
struct fdt_reserve_entry *re;
int offset;
- FDT_SW_PROBE_MEMRSV(fdt);
+ FDT_SW_CHECK_HEADER(fdt);
+
+ if (fdt_size_dt_struct(fdt))
+ return -FDT_ERR_BADSTATE;
offset = fdt_off_dt_struct(fdt);
if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
@@ -222,23 +164,16 @@
int fdt_finish_reservemap(void *fdt)
{
- int err = fdt_add_reservemap_entry(fdt, 0, 0);
-
- if (err)
- return err;
-
- fdt_set_off_dt_strings(fdt, fdt_totalsize(fdt));
- return 0;
+ return fdt_add_reservemap_entry(fdt, 0, 0);
}
int fdt_begin_node(void *fdt, const char *name)
{
struct fdt_node_header *nh;
- int namelen;
+ int namelen = strlen(name) + 1;
- FDT_SW_PROBE_STRUCT(fdt);
+ FDT_SW_CHECK_HEADER(fdt);
- namelen = strlen(name) + 1;
nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));
if (! nh)
return -FDT_ERR_NOSPACE;
@@ -252,7 +187,7 @@
{
fdt32_t *en;
- FDT_SW_PROBE_STRUCT(fdt);
+ FDT_SW_CHECK_HEADER(fdt);
en = fdt_grab_space_(fdt, FDT_TAGSIZE);
if (! en)
@@ -290,7 +225,7 @@
struct fdt_property *prop;
int nameoff;
- FDT_SW_PROBE_STRUCT(fdt);
+ FDT_SW_CHECK_HEADER(fdt);
nameoff = fdt_find_add_string_(fdt, name);
if (nameoff == 0)
@@ -327,7 +262,7 @@
uint32_t tag;
int offset, nextoffset;
- FDT_SW_PROBE_STRUCT(fdt);
+ FDT_SW_CHECK_HEADER(fdt);
/* Add terminator */
end = fdt_grab_space_(fdt, sizeof(*end));