All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
To: Wang YanQing <udknight@gmail.com>
Cc: tjd21@cl.cam.ac.uk, kexec@lists.infradead.org,
	horms@verge.net.au, ebiederm@xmission.com, hari@in.ibm.com,
	zhangyanfei.yes@gmail.com
Subject: Re: [PATCH v2]kexec:i386:kexec-bzImage: Fix pass garbage command line to new kernel
Date: Mon, 08 Apr 2013 17:51:52 +0800	[thread overview]
Message-ID: <51629338.5080906@cn.fujitsu.com> (raw)
In-Reply-To: <20130408094358.GB23828@udknight>

于 2013年04月08日 17:43, Wang YanQing 写道:
> 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

I don't think the patch is necessary, please see below.

> ]
> 
> Signed-off-by: Wang YanQing <udknight@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,
>  					 &regs16, sizeof(regs16));
>  	}
>  	elf_rel_set_symbol(&info->rhdr, "entry32_regs", &regs32, 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;

This is obviously wrong. 
Purgatory may append a kexec_jump_back_entry= argument into the commandline. It is
an argument belongs to the commandline. So why there is a buf filled with 0 
(alloc_command_line_len) before it in the commandline buf.

>  	elf_rel_set_symbol(&info->rhdr, "cmdline_end", &cmdline_end,
>  			   sizeof(unsigned long));
>  


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2013-04-08 10:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-08  9:43 [PATCH v2]kexec:i386:kexec-bzImage: Fix pass garbage command line to new kernel Wang YanQing
2013-04-08  9:51 ` Zhang Yanfei [this message]
2013-04-09  0:57   ` Wang YanQing
2013-04-09  1:08   ` Wang YanQing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51629338.5080906@cn.fujitsu.com \
    --to=zhangyanfei@cn.fujitsu.com \
    --cc=ebiederm@xmission.com \
    --cc=hari@in.ibm.com \
    --cc=horms@verge.net.au \
    --cc=kexec@lists.infradead.org \
    --cc=tjd21@cl.cam.ac.uk \
    --cc=udknight@gmail.com \
    --cc=zhangyanfei.yes@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.