I get garbage output of /proc/cmdline and in dmesg in new kernel context when I use kexec to load new kernel bzImage without append command line like below: kexec -l bzImage --initrd=/boot/initramfs kexec -e The reason is kernel copy the command line from the bootloader like below which copy/paste from linux/arch/x86/kernel/head_32.S: movl pa(boot_params) + NEW_CL_POINTER,%esi andl %esi,%esi jz 1f # No command line movl $pa(boot_command_line),%edi movl $(COMMAND_LINE_SIZE/4),%ecx This patch fix it. [ although another patch "kexec:i386/kexec-[bzImage|elf-x86]:x86_64/kexec-bzImage64: Use "\0" as command line instead of empty command line" has resolved the garbage output by put a '\0' at the start, but I thinks this patch has sense too, it stop kernel copy not command line data into the command line buffer in kernel ] Signed-off-by: Wang YanQing <udknight at gmail.com> --- Changes v1-v2: 1:Fix the wrong cmdline_end's value kexec/arch/i386/kexec-bzImage.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kexec/arch/i386/kexec-bzImage.c b/kexec/arch/i386/kexec-bzImage.c index 29f280d..2954f92 100644 --- a/kexec/arch/i386/kexec-bzImage.c +++ b/kexec/arch/i386/kexec-bzImage.c @@ -119,6 +119,7 @@ int do_bzImage_load(struct kexec_info *info, unsigned long cmdline_end; unsigned long kern16_size_needed; unsigned long heap_size = 0; + off_t alloc_command_line_len = 0; /* * Find out about the file I am about to load. @@ -145,10 +146,12 @@ int do_bzImage_load(struct kexec_info *info, dbgprintf("Kernel command line too long for kernel!\n"); return -1; } + alloc_command_line_len = (uintmax_t)setup_header.cmdline_size; } else { if (command_line_len > 255) { dbgprintf("WARNING: This kernel may only support 255 byte command lines\n"); } + alloc_command_line_len = 255; } if (setup_header.protocol_version >= 0x0205) { @@ -231,7 +234,7 @@ int do_bzImage_load(struct kexec_info *info, if (kern16_size_needed < 4096) kern16_size_needed = 4096; } - setup_size = kern16_size_needed + command_line_len + + setup_size = kern16_size_needed + alloc_command_line_len + PURGATORY_CMDLINE_SIZE; real_mode = xmalloc(setup_size); memset(real_mode, 0, setup_size); @@ -366,7 +369,7 @@ int do_bzImage_load(struct kexec_info *info, ®s16, sizeof(regs16)); } elf_rel_set_symbol(&info->rhdr, "entry32_regs", ®s32, sizeof(regs32)); - cmdline_end = setup_base + kern16_size_needed + command_line_len - 1; + cmdline_end = setup_base + kern16_size_needed + alloc_command_line_len - 1; elf_rel_set_symbol(&info->rhdr, "cmdline_end", &cmdline_end, sizeof(unsigned long)); -- 1.7.12.4.dirty