On Mon, 2017-06-26 at 10:52 +0800, Dave Young wrote: > On 06/23/17 at 05:55pm, Hoeun Ryu wrote: > > > > Arm linux supports zImage with appended dtb > > (CONFIG_ARM_APPENDED_DTB) and > > the concatenated image is generated like `cat zImage dtb > > > zImage_w_dtb`. > > > > This patch is to support the concatednated zImage. This changes the > > priority of source of dtb file. > > > > ?1. --dtb dtb_file > > ?2. zImage_w_dtb <= newly added > > ?3. /sys/firmware/fdt > > ?4. /proc/device-tree > The original default fdt is /sys/firmware/fdt, after your changes it > becomes zImage attached dtb, presumably one knows his zImage appended > a > dtb it is fine, but if one does not notice it, it changes the > behavior > he expects. > > How about add a new option for zImage_dtb, like --zImage-dtb > It sounds good to me too. I think I can accept your suggestion in the next version if the others agree. Thank you for the review. > > > > > > Users don't need to specify dtb file in the command line and don't > > have to > > have /sys/firmware/fdt or /proc/device-tree if dtb is available in > > zImage. > > > > Signed-off-by: Hoeun Ryu <hoeun.ryu at gmail.com> > > --- > > ?kexec/arch/arm/kexec-arm.h????????|??1 + > > ?kexec/arch/arm/kexec-zImage-arm.c | 47 > > ++++++++++++++++++++++++++++++--------- > > ?2 files changed, 37 insertions(+), 11 deletions(-) > > > > diff --git a/kexec/arch/arm/kexec-arm.h b/kexec/arch/arm/kexec- > > arm.h > > index a74cce2..94695b7 100644 > > --- a/kexec/arch/arm/kexec-arm.h > > +++ b/kexec/arch/arm/kexec-arm.h > > @@ -4,6 +4,7 @@ > > ?#include <sys/types.h> > > ? > > ?#define SYSFS_FDT "/sys/firmware/fdt" > > +#define APPENDED_FDT ((char *)-1) /* it doesn't mean to be opened. > > */ > > ?#define BOOT_BLOCK_VERSION 17 > > ?#define BOOT_BLOCK_LAST_COMP_VERSION 16 > > ? > > diff --git a/kexec/arch/arm/kexec-zImage-arm.c > > b/kexec/arch/arm/kexec-zImage-arm.c > > index 7f02b93..59f0003 100644 > > --- a/kexec/arch/arm/kexec-zImage-arm.c > > +++ b/kexec/arch/arm/kexec-zImage-arm.c > > @@ -390,6 +390,7 @@ int zImage_arm_load(int argc, char **argv, > > const char *buf, off_t len, > > ? initrd_size = 0; > > ? use_atags = 0; > > ? dtb_file = NULL; > > + dtb_buf = NULL; > > ? while((opt = getopt_long(argc, argv, short_options, > > options, 0)) != -1) { > > ? switch(opt) { > > ? default: > > @@ -424,14 +425,6 @@ int zImage_arm_load(int argc, char **argv, > > const char *buf, off_t len, > > ? return -1; > > ? } > > ? > > - if (!use_atags && !dtb_file) { > > - int f; > > - > > - f = have_sysfs_fdt(); > > - if (f) > > - dtb_file = SYSFS_FDT; > > - } > > - > > ? if (command_line) { > > ? command_line_len = strlen(command_line) + 1; > > ? if (command_line_len > COMMAND_LINE_SIZE) > > @@ -440,9 +433,6 @@ int zImage_arm_load(int argc, char **argv, > > const char *buf, off_t len, > > ? if (ramdisk) > > ? ramdisk_buf = slurp_file(ramdisk, &initrd_size); > > ? > > - if (dtb_file) > > - dtb_buf = slurp_file(dtb_file, &dtb_length); > > - > > ? if (len > 0x34) { > > ? const struct zimage_header *hdr; > > ? off_t size; > > @@ -459,6 +449,25 @@ int zImage_arm_load(int argc, char **argv, > > const char *buf, off_t len, > > ? ??(unsigned long long)size, > > ? ??(unsigned long long)len); > > ? > > + /* check if zImage has an appended dtb */ > > + if (!dtb_file) { > > + if (fdt_check_header(buf + size) > > == 0) { > > + /* > > + ?* dtb_file won't be > > opened. It's set > > + ?* just to pass NULL > > checking. > > + ?*/ > > + dtb_file = APPENDED_FDT; > > + dtb_length = > > fdt_totalsize(buf + size); > > + dtb_buf = > > xmalloc(dtb_length); > > + memcpy(dtb_buf, buf+size, > > dtb_length); > > + > > + dbgprintf("found appended > > dtb, size 0x%llx\n", > > + ??(unsigned long > > long)dtb_length); > > + > > + > > + } > > + } > > + > > ? if (size > len) { > > ? fprintf(stderr, > > ? "zImage is truncated - > > file 0x%llx vs header 0x%llx\n", > > @@ -575,6 +584,22 @@ int zImage_arm_load(int argc, char **argv, > > const char *buf, off_t len, > > ? initrd_base = kernel_base + _ALIGN(len * 5, > > getpagesize()); > > ? } > > ? > > + if (!use_atags && !dtb_file) { > > + int f; > > + > > + f = have_sysfs_fdt(); > > + if (f) > > + dtb_file = SYSFS_FDT; > > + } > > + > > + /* > > + ?* dtb_buf can be allocated when checking zImage_with_dtb. > > + ?* dtb_buf won't be allocated in the logic if dtb_file is > > handed over > > + ?* in argv[]. > > + ?*/ > > + if (dtb_file && !dtb_buf) > > + dtb_buf = slurp_file(dtb_file, &dtb_length); > > + > > ? if (use_atags) { > > ? /* > > ? ?* use ATAGs from /proc/atags