[PATCH] prepend elfcorehdr instead of appending it to the crash-kernel command-line.

Vivek Goyal vgoyal at redhat.com
Thu May 14 07:34:37 PDT 2015


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



More information about the kexec mailing list