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,
> ®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;
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
next prev parent 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox