diff options
author | Simon Glass <sjg@chromium.org> | 2014-06-02 22:04:53 -0600 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2014-06-11 16:25:46 -0400 |
commit | a9468115699de562f08796bf2eabd832435bedec (patch) | |
tree | a5c4ad46d6492738cdb1f7dd867f88ba4368fd90 /tools/fit_common.c | |
parent | ef0af64b1c45b8ee28db12c16c4ee881ee328e44 (diff) | |
download | u-boot-a9468115699de562f08796bf2eabd832435bedec.tar.gz |
mkimage: Automatically make space in FDT when full
When adding hashes or signatures, the target FDT may be full. Detect this
and automatically try again after making 1KB of space.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools/fit_common.c')
-rw-r--r-- | tools/fit_common.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/tools/fit_common.c b/tools/fit_common.c index 286f357ab1..81ba698abd 100644 --- a/tools/fit_common.c +++ b/tools/fit_common.c @@ -38,8 +38,8 @@ int fit_check_image_types(uint8_t type) return EXIT_FAILURE; } -int mmap_fdt(const char *cmdname, const char *fname, void **blobp, - struct stat *sbuf, bool delete_on_error) +int mmap_fdt(const char *cmdname, const char *fname, size_t size_inc, + void **blobp, struct stat *sbuf, bool delete_on_error) { void *ptr; int fd; @@ -59,6 +59,15 @@ int mmap_fdt(const char *cmdname, const char *fname, void **blobp, goto err; } + if (size_inc) { + sbuf->st_size += size_inc; + if (ftruncate(fd, sbuf->st_size)) { + fprintf(stderr, "%s: Can't expand %s: %s\n", + cmdname, fname, strerror(errno)); + goto err; + } + } + errno = 0; ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if ((ptr == MAP_FAILED) || (errno != 0)) { @@ -73,6 +82,18 @@ int mmap_fdt(const char *cmdname, const char *fname, void **blobp, goto err; } + /* expand if needed */ + if (size_inc) { + int ret; + + ret = fdt_open_into(ptr, ptr, sbuf->st_size); + if (ret) { + fprintf(stderr, "%s: Cannot expand FDT: %s\n", + cmdname, fdt_strerror(ret)); + goto err; + } + } + *blobp = ptr; return fd; |