]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/Library/FdtLib/fdt_sw.c
EmbeddedPkg/FdtLib: Update FdtLib to v1.4.5
[mirror_edk2.git] / EmbeddedPkg / Library / FdtLib / fdt_sw.c
index 991919b4364f807ae3d7d9959baf39ee7f98e58b..3c2c71018622e6820cb678c0be10ce174871d6ff 100644 (file)
@@ -107,6 +107,38 @@ int fdt_create(void *buf, int bufsize)
        return 0;\r
 }\r
 \r
+int fdt_resize(void *fdt, void *buf, int bufsize)\r
+{\r
+       size_t headsize, tailsize;\r
+       char *oldtail, *newtail;\r
+\r
+       FDT_SW_CHECK_HEADER(fdt);\r
+\r
+       headsize = fdt_off_dt_struct(fdt);\r
+       tailsize = fdt_size_dt_strings(fdt);\r
+\r
+       if ((headsize + tailsize) > bufsize)\r
+               return -FDT_ERR_NOSPACE;\r
+\r
+       oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize;\r
+       newtail = (char *)buf + bufsize - tailsize;\r
+\r
+       /* Two cases to avoid clobbering data if the old and new\r
+        * buffers partially overlap */\r
+       if (buf <= fdt) {\r
+               memmove(buf, fdt, headsize);\r
+               memmove(newtail, oldtail, tailsize);\r
+       } else {\r
+               memmove(newtail, oldtail, tailsize);\r
+               memmove(buf, fdt, headsize);\r
+       }\r
+\r
+       fdt_set_off_dt_strings(buf, bufsize);\r
+       fdt_set_totalsize(buf, bufsize);\r
+\r
+       return 0;\r
+}\r
+\r
 int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)\r
 {\r
        struct fdt_reserve_entry *re;\r
@@ -188,7 +220,7 @@ static int _fdt_find_add_string(void *fdt, const char *s)
        return offset;\r
 }\r
 \r
-int fdt_property(void *fdt, const char *name, const void *val, int len)\r
+int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)\r
 {\r
        struct fdt_property *prop;\r
        int nameoff;\r
@@ -206,7 +238,19 @@ int fdt_property(void *fdt, const char *name, const void *val, int len)
        prop->tag = cpu_to_fdt32(FDT_PROP);\r
        prop->nameoff = cpu_to_fdt32(nameoff);\r
        prop->len = cpu_to_fdt32(len);\r
-       memcpy(prop->data, val, len);\r
+       *valp = prop->data;\r
+       return 0;\r
+}\r
+\r
+int fdt_property(void *fdt, const char *name, const void *val, int len)\r
+{\r
+       void *ptr;\r
+       int ret;\r
+\r
+       ret = fdt_property_placeholder(fdt, name, len, &ptr);\r
+       if (ret)\r
+               return ret;\r
+       memcpy(ptr, val, len);\r
        return 0;\r
 }\r
 \r