diff options
Diffstat (limited to 'scripts/dtc/libfdt/fdt_sw.c')
| -rw-r--r-- | scripts/dtc/libfdt/fdt_sw.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/scripts/dtc/libfdt/fdt_sw.c b/scripts/dtc/libfdt/fdt_sw.c index 55ebebf1eb20..6a804859fd0c 100644 --- a/scripts/dtc/libfdt/fdt_sw.c +++ b/scripts/dtc/libfdt/fdt_sw.c | |||
| @@ -107,6 +107,38 @@ int fdt_create(void *buf, int bufsize) | |||
| 107 | return 0; | 107 | return 0; |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | int fdt_resize(void *fdt, void *buf, int bufsize) | ||
| 111 | { | ||
| 112 | size_t headsize, tailsize; | ||
| 113 | char *oldtail, *newtail; | ||
| 114 | |||
| 115 | FDT_SW_CHECK_HEADER(fdt); | ||
| 116 | |||
| 117 | headsize = fdt_off_dt_struct(fdt); | ||
| 118 | tailsize = fdt_size_dt_strings(fdt); | ||
| 119 | |||
| 120 | if ((headsize + tailsize) > bufsize) | ||
| 121 | return -FDT_ERR_NOSPACE; | ||
| 122 | |||
| 123 | oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize; | ||
| 124 | newtail = (char *)buf + bufsize - tailsize; | ||
| 125 | |||
| 126 | /* Two cases to avoid clobbering data if the old and new | ||
| 127 | * buffers partially overlap */ | ||
| 128 | if (buf <= fdt) { | ||
| 129 | memmove(buf, fdt, headsize); | ||
| 130 | memmove(newtail, oldtail, tailsize); | ||
| 131 | } else { | ||
| 132 | memmove(newtail, oldtail, tailsize); | ||
| 133 | memmove(buf, fdt, headsize); | ||
| 134 | } | ||
| 135 | |||
| 136 | fdt_set_off_dt_strings(buf, bufsize); | ||
| 137 | fdt_set_totalsize(buf, bufsize); | ||
| 138 | |||
| 139 | return 0; | ||
| 140 | } | ||
| 141 | |||
| 110 | int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) | 142 | int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) |
| 111 | { | 143 | { |
| 112 | struct fdt_reserve_entry *re; | 144 | struct fdt_reserve_entry *re; |
| @@ -153,7 +185,7 @@ int fdt_begin_node(void *fdt, const char *name) | |||
| 153 | 185 | ||
| 154 | int fdt_end_node(void *fdt) | 186 | int fdt_end_node(void *fdt) |
| 155 | { | 187 | { |
| 156 | uint32_t *en; | 188 | fdt32_t *en; |
| 157 | 189 | ||
| 158 | FDT_SW_CHECK_HEADER(fdt); | 190 | FDT_SW_CHECK_HEADER(fdt); |
| 159 | 191 | ||
| @@ -213,7 +245,7 @@ int fdt_property(void *fdt, const char *name, const void *val, int len) | |||
| 213 | int fdt_finish(void *fdt) | 245 | int fdt_finish(void *fdt) |
| 214 | { | 246 | { |
| 215 | char *p = (char *)fdt; | 247 | char *p = (char *)fdt; |
| 216 | uint32_t *end; | 248 | fdt32_t *end; |
| 217 | int oldstroffset, newstroffset; | 249 | int oldstroffset, newstroffset; |
| 218 | uint32_t tag; | 250 | uint32_t tag; |
| 219 | int offset, nextoffset; | 251 | int offset, nextoffset; |
