On Wed, May 13, 2015 at 12:05:54PM +0200, KarimAllah Ahmed wrote: > Any parameter passed after '--' in the kernel command-line will not be parsed > by the kernel at all, instead it will be passed directly to init process. > > Currently the kernel appends elfcorehdr=<paddr> to the cmdline passed from kexec > load, and if this command-line is used to pass parameters to init process this > means that 'elfcorehdr' will not be parsed as a kernel parameter at all which > will be a problem for vmcore subsystem since it will know nothing about the > location of the ELF structure! > > Prepending 'elfcorehdr' instead of appending it fixes this problem since it > ensures that it always comes before '--' and so it's always parsed as a kernel > command-line parameter. > > Even with this patch things can still go wrong if 'CONFIG_CMDLINE' was also used > to embedd a command-line to the crash dump kernel and this command-line contains > '--' since the current behavior of the kernel is to actually append the boot > loader command-line to the embedded command-line. > > Signed-off-by: KarimAllah Ahmed <karahmed at amazon.de> Looks good to me. We might require a similar change in kexec-tools for old systemcall? Acked-by: Vivek Goyal <vgoyal at redhat.com> Thanks Vivek > Cc: Thomas Gleixner <tglx at linutronix.de> > Cc: Ingo Molnar <mingo at redhat.com> > Cc: H. Peter Anvin <hpa at zytor.com> > Cc: Andrew Morton <akpm at linux-foundation.org> > Cc: Vivek Goyal <vgoyal at redhat.com> > Cc: Haren Myneni <hbabu at us.ibm.com> > Cc: Eric Biederman <ebiederm at xmission.com> > --- > arch/x86/kernel/kexec-bzimage64.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c > index ca05f86..ca83f7ac 100644 > --- a/arch/x86/kernel/kexec-bzimage64.c > +++ b/arch/x86/kernel/kexec-bzimage64.c > @@ -72,15 +72,16 @@ static int setup_cmdline(struct kimage *image, struct boot_params *params, > unsigned long cmdline_len) > { > char *cmdline_ptr = ((char *)params) + cmdline_offset; > - unsigned long cmdline_ptr_phys, len; > + unsigned long cmdline_ptr_phys, len = 0; > uint32_t cmdline_low_32, cmdline_ext_32; > > - memcpy(cmdline_ptr, cmdline, cmdline_len); > if (image->type == KEXEC_TYPE_CRASH) { > - len = sprintf(cmdline_ptr + cmdline_len - 1, > - " elfcorehdr=0x%lx", image->arch.elf_load_addr); > - cmdline_len += len; > + len = sprintf(cmdline_ptr, > + "elfcorehdr=0x%lx ", image->arch.elf_load_addr); > } > + memcpy(cmdline_ptr + len, cmdline, cmdline_len); > + cmdline_len += len; > + > cmdline_ptr[cmdline_len - 1] = '\0'; > > pr_debug("Final command line is: %s\n", cmdline_ptr); > -- > 1.7.9.5