diff options
Diffstat (limited to 'lib/libfdt/fdt_sw.c')
| -rw-r--r-- | lib/libfdt/fdt_sw.c | 32 | 
1 files changed, 32 insertions, 0 deletions
| diff --git a/lib/libfdt/fdt_sw.c b/lib/libfdt/fdt_sw.c index 580b57024ff..320a914991a 100644 --- a/lib/libfdt/fdt_sw.c +++ b/lib/libfdt/fdt_sw.c @@ -62,6 +62,38 @@ int fdt_create(void *buf, int bufsize)  	return 0;  } +int fdt_resize(void *fdt, void *buf, int bufsize) +{ +	size_t headsize, tailsize; +	char *oldtail, *newtail; + +	FDT_SW_CHECK_HEADER(fdt); + +	headsize = fdt_off_dt_struct(fdt); +	tailsize = fdt_size_dt_strings(fdt); + +	if ((headsize + tailsize) > bufsize) +		return -FDT_ERR_NOSPACE; + +	oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize; +	newtail = (char *)buf + bufsize - tailsize; + +	/* Two cases to avoid clobbering data if the old and new +	 * buffers partially overlap */ +	if (buf <= fdt) { +		memmove(buf, fdt, headsize); +		memmove(newtail, oldtail, tailsize); +	} else { +		memmove(newtail, oldtail, tailsize); +		memmove(buf, fdt, headsize); +	} + +	fdt_set_off_dt_strings(buf, bufsize); +	fdt_set_totalsize(buf, bufsize); + +	return 0; +} +  int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)  {  	struct fdt_reserve_entry *re; | 
