]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/Library/FdtLib/fdt_rw.c
EmbeddedPkg/FdtLib: Update FdtLib to v1.4.5
[mirror_edk2.git] / EmbeddedPkg / Library / FdtLib / fdt_rw.c
index 7a2bcf3d07f8e19436a6673735d7db1ca037fdb3..863f2b2e0fc10080dc3a4ba05f8fcd44dddb9dba 100644 (file)
@@ -84,9 +84,9 @@ static int _fdt_rw_check_header(void *fdt)
 \r
 #define FDT_RW_CHECK_HEADER(fdt) \\r
        { \\r
-               int err; \\r
-               if ((err = _fdt_rw_check_header(fdt)) != 0) \\r
-                       return err; \\r
+               int __err; \\r
+               if ((__err = _fdt_rw_check_header(fdt)) != 0) \\r
+                       return __err; \\r
        }\r
 \r
 static inline int _fdt_data_size(void *fdt)\r
@@ -101,6 +101,8 @@ static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen)
 \r
        if (((p + oldlen) < p) || ((p + oldlen) > end))\r
                return -FDT_ERR_BADOFFSET;\r
+       if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))\r
+               return -FDT_ERR_BADOFFSET;\r
        if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))\r
                return -FDT_ERR_NOSPACE;\r
        memmove(p + newlen, p + oldlen, end - p - oldlen);\r
@@ -126,8 +128,7 @@ static int _fdt_splice_struct(void *fdt, void *p,
        int delta = newlen - oldlen;\r
        int err;\r
 \r
-       err = _fdt_splice(fdt, p, oldlen, newlen);\r
-       if (err)\r
+       if ((err = _fdt_splice(fdt, p, oldlen, newlen)))\r
                return err;\r
 \r
        fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);\r
@@ -141,8 +142,7 @@ static int _fdt_splice_string(void *fdt, int newlen)
                + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);\r
        int err;\r
 \r
-       err = _fdt_splice(fdt, p, 0, newlen);\r
-       if (err)\r
+       if ((err = _fdt_splice(fdt, p, 0, newlen)))\r
                return err;\r
 \r
        fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);\r
@@ -191,17 +191,13 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
 int fdt_del_mem_rsv(void *fdt, int n)\r
 {\r
        struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);\r
-       int err;\r
 \r
        FDT_RW_CHECK_HEADER(fdt);\r
 \r
        if (n >= fdt_num_mem_rsv(fdt))\r
                return -FDT_ERR_NOTFOUND;\r
 \r
-       err = _fdt_splice_mem_rsv(fdt, re, 1, 0);\r
-       if (err)\r
-               return err;\r
-       return 0;\r
+       return _fdt_splice_mem_rsv(fdt, re, 1, 0);\r
 }\r
 \r
 static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,\r
@@ -211,12 +207,11 @@ static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,
        int err;\r
 \r
        *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);\r
-       if (! (*prop))\r
+       if (!*prop)\r
                return oldlen;\r
 \r
-       err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),\r
-                     FDT_TAGALIGN(len));\r
-       if (err)\r
+       if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),\r
+                                     FDT_TAGALIGN(len))))\r
                return err;\r
 \r
        (*prop)->len = cpu_to_fdt32(len);\r
@@ -274,8 +269,8 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name)
        return 0;\r
 }\r
 \r
-int fdt_setprop(void *fdt, int nodeoffset, const char *name,\r
-               const void *val, int len)\r
+int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,\r
+                           int len, void **prop_data)\r
 {\r
        struct fdt_property *prop;\r
        int err;\r
@@ -288,7 +283,22 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
        if (err)\r
                return err;\r
 \r
-       memcpy(prop->data, val, len);\r
+       *prop_data = prop->data;\r
+       return 0;\r
+}\r
+\r
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,\r
+               const void *val, int len)\r
+{\r
+       void *prop_data;\r
+       int err;\r
+\r
+       err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data);\r
+       if (err)\r
+               return err;\r
+\r
+       if (len)\r
+               memcpy(prop_data, val, len);\r
        return 0;\r
 }\r
 \r
@@ -327,7 +337,7 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name)
        FDT_RW_CHECK_HEADER(fdt);\r
 \r
        prop = fdt_get_property_w(fdt, nodeoffset, name, &len);\r
-       if (! prop)\r
+       if (!prop)\r
                return len;\r
 \r
        proplen = sizeof(*prop) + FDT_TAGALIGN(len);\r