]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/Library/FdtLib/fdt_sw.c
EmbeddedPkg/GdbSerialLib: avoid left shift of negative quantity
[mirror_edk2.git] / EmbeddedPkg / Library / FdtLib / fdt_sw.c
index 240fabc554248ebb085d38751624b79726e50f7c..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
@@ -153,7 +185,7 @@ int fdt_begin_node(void *fdt, const char *name)
 \r
 int fdt_end_node(void *fdt)\r
 {\r
-       uint32_t *en;\r
+       fdt32_t *en;\r
 \r
        FDT_SW_CHECK_HEADER(fdt);\r
 \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,14 +238,26 @@ 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
 int fdt_finish(void *fdt)\r
 {\r
        char *p = (char *)fdt;\r
-       uint32_t *end;\r
+       fdt32_t *end;\r
        int oldstroffset, newstroffset;\r
        uint32_t tag;\r
        int offset, nextoffset;\r