| From cc5e7b02a3be57709a1aed6e34be100b82a71620 Mon Sep 17 00:00:00 2001 |
| From: David Ng <dave@codeaurora.org> |
| Date: Fri, 27 Jul 2012 17:15:03 -0700 |
| Subject: [PATCH 1/2] mkbootimg: Add --dt parameter to specify DT image |
| |
| New optional --dt parameter to specify a kernel device |
| tree image. |
| |
| Change-Id: Ie29a11cbf4138426bfd19ae486d69a5fcbd8f442 |
| |
| Upstream-Status: Inappropriate |
| --- |
| system/core/mkbootimg/bootimg.h | 7 +++++-- |
| system/core/mkbootimg/mkbootimg.c | 21 +++++++++++++++++++++ |
| 2 files changed, 26 insertions(+), 2 deletions(-) |
| |
| --- a/system/core/mkbootimg/bootimg.h |
| +++ b/system/core/mkbootimg/bootimg.h |
| @@ -41,8 +41,8 @@ struct boot_img_hdr |
| |
| unsigned tags_addr; /* physical addr for kernel tags */ |
| unsigned page_size; /* flash page size we assume */ |
| - unsigned unused[2]; /* future expansion: should be 0 */ |
| - |
| + unsigned dt_size; /* device tree in bytes */ |
| + unsigned unused; /* future expansion: should be 0 */ |
| unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ |
| |
| unsigned char cmdline[BOOT_ARGS_SIZE]; |
| @@ -64,10 +64,13 @@ struct boot_img_hdr |
| ** +-----------------+ |
| ** | second stage | o pages |
| ** +-----------------+ |
| +** | device tree | p pages |
| +** +-----------------+ |
| ** |
| ** n = (kernel_size + page_size - 1) / page_size |
| ** m = (ramdisk_size + page_size - 1) / page_size |
| ** o = (second_size + page_size - 1) / page_size |
| +** p = (dt_size + page_size - 1) / page_size |
| ** |
| ** 0. all entities are page_size aligned in flash |
| ** 1. kernel and ramdisk are required (size != 0) |
| --- a/system/core/mkbootimg/mkbootimg.c |
| +++ b/system/core/mkbootimg/mkbootimg.c |
| @@ -65,6 +65,7 @@ int usage(void) |
| " [ --board <boardname> ]\n" |
| " [ --base <address> ]\n" |
| " [ --pagesize <pagesize> ]\n" |
| + " [ --dt <filename> ]\n" |
| " -o|--output <filename>\n" |
| ); |
| return 1; |
| @@ -105,6 +106,8 @@ int main(int argc, char **argv) |
| char *cmdline = ""; |
| char *bootimg = 0; |
| char *board = ""; |
| + char *dt_fn = 0; |
| + void *dt_data = 0; |
| unsigned pagesize = 2048; |
| int fd; |
| SHA_CTX ctx; |
| @@ -158,6 +161,8 @@ int main(int argc, char **argv) |
| fprintf(stderr,"error: unsupported page size %d\n", pagesize); |
| return -1; |
| } |
| + } else if(!strcmp(arg, "--dt")) { |
| + dt_fn = val; |
| } else { |
| return usage(); |
| } |
| @@ -232,6 +237,14 @@ int main(int argc, char **argv) |
| } |
| } |
| |
| + if(dt_fn) { |
| + dt_data = load_file(dt_fn, &hdr.dt_size); |
| + if (dt_data == 0) { |
| + fprintf(stderr,"error: could not load device tree image '%s'\n", dt_fn); |
| + return 1; |
| + } |
| + } |
| + |
| /* put a hash of the contents in the header so boot images can be |
| * differentiated based on their first 2k. |
| */ |
| @@ -242,6 +255,10 @@ int main(int argc, char **argv) |
| SHA_update(&ctx, &hdr.ramdisk_size, sizeof(hdr.ramdisk_size)); |
| SHA_update(&ctx, second_data, hdr.second_size); |
| SHA_update(&ctx, &hdr.second_size, sizeof(hdr.second_size)); |
| + if(dt_data) { |
| + SHA_update(&ctx, dt_data, hdr.dt_size); |
| + SHA_update(&ctx, &hdr.dt_size, sizeof(hdr.dt_size)); |
| + } |
| sha = SHA_final(&ctx); |
| memcpy(hdr.id, sha, |
| SHA_DIGEST_SIZE > sizeof(hdr.id) ? sizeof(hdr.id) : SHA_DIGEST_SIZE); |
| @@ -266,6 +283,10 @@ int main(int argc, char **argv) |
| if(write_padding(fd, pagesize, hdr.second_size)) goto fail; |
| } |
| |
| + if(dt_data) { |
| + if(write(fd, dt_data, hdr.dt_size) != (ssize_t) hdr.dt_size) goto fail; |
| + if(write_padding(fd, pagesize, hdr.dt_size)) goto fail; |
| + } |
| return 0; |
| |
| fail: |