diff options
-rw-r--r-- | kexec/arch/arm/kexec-zImage-arm.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/kexec/arch/arm/kexec-zImage-arm.c b/kexec/arch/arm/kexec-zImage-arm.c index bfbf290..220826e 100644 --- a/kexec/arch/arm/kexec-zImage-arm.c +++ b/kexec/arch/arm/kexec-zImage-arm.c @@ -282,7 +282,7 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len, { unsigned long base; unsigned int atag_offset = 0x1000; /* 4k offset from memory start */ - unsigned int offset = 0x8000; /* 32k offset from memory start */ + unsigned int extra_size = 0; const char *command_line; char *modified_cmdline = NULL; off_t command_line_len; @@ -360,6 +360,13 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len, ramdisk_buf = slurp_file(ramdisk, &initrd_size); } + if (dtb_file) { + dtb_buf = slurp_file(dtb_file, &dtb_length); + extra_size = _ALIGN(dtb_length, getpagesize()); + } else if (use_atags) { + extra_size = 0x8000; /* 32k should be plenty for ATAGs */ + } + /* * If we are loading a dump capture kernel, we need to update kernel * command line and also add some additional segments. @@ -398,7 +405,8 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len, } base = start; } else { - base = locate_hole(info,len+offset,0,0,ULONG_MAX,INT_MAX); + base = locate_hole(info, len + extra_size, 0, 0, + ULONG_MAX, INT_MAX); } if (base == ULONG_MAX) @@ -428,8 +436,6 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len, * Read a user-specified DTB file. */ if (dtb_file) { - dtb_buf = slurp_file(dtb_file, &dtb_length); - if (fdt_check_header(dtb_buf) != 0) { fprintf(stderr, "Invalid FDT buffer.\n"); return -1; @@ -452,11 +458,6 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len, create_flatten_tree(&dtb_buf, &dtb_length, command_line); } - if (base + atag_offset + dtb_length > base + offset) { - fprintf(stderr, "DTB too large!\n"); - return -1; - } - if (ramdisk) { add_segment(info, ramdisk_buf, initrd_size, initrd_base, initrd_size); @@ -485,9 +486,9 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len, dtb_offset, dtb_length); } - add_segment(info, buf, len, base + offset, len); + add_segment(info, buf, len, base + extra_size, len); - info->entry = (void*)base + offset; + info->entry = (void*)base + extra_size; return 0; } |