[PATCH,RFC] - make /proc/vmcore accesable on x86_64

Simon Horman horms at verge.net.au
Fri Oct 22 04:54:12 EDT 2010


On Tue, Oct 19, 2010 at 05:06:30PM +0200, Jiri Olsa wrote:
> hi,
> 
> I was playing around with preserve context feature on x86_64
> and was not able to get the /proc/vmcore in the kexec-ed
> kernel until I aplied attached patch.
> 
> I'm not at all sure this is right fix ;) but it seems
> that /proc/vmcore is not loaded since the machine field in the
> elf header is wrong.
> 
> 
> If the x86_64 arch returns 0 (KEXEC_ARCH_DEFAULT) then following
> condition in load_crashdump_segments function will fill 386 as the
> machine for the vmcore elf header..
> 
> ...
> 
>         if ((info->kexec_flags & KEXEC_ARCH_MASK) == KEXEC_ARCH_X86_64)
>         {
>                 elf_info.machine = EM_X86_64;
>         } else {
>                 elf_info.machine       = EM_386;
>                 elf_info.lowmem_limit  = X86_MAXMEM;
>                 elf_info.get_note_info = get_crash_notes;
>         }
> ...
> 
> ending with kexec-ed kernel failing check for the machine,
> and disabling vmcore interface...
> 
> 
> I'm guessing that the reason is the load_crashdump_segments function
> being shared among 32 and 64 bits.. but again, not sure ;)
> 
> 
> My goal is to share data within the host and kexec-ed kernel,
> so I'd like to use the /proc/vmcore for that.. any other
> ideas are welcome :)

This approach seems reasonable to me.
I'll push it if a I don't hear any objections
in the near future.

> 
> 
> thanks,
> jirka
> ---
> diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
> index 06e5ae9..40f989a 100644
> --- a/kexec/arch/i386/crashdump-x86.c
> +++ b/kexec/arch/i386/crashdump-x86.c
> @@ -691,6 +691,8 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
>  	struct memory_range *mem_range, *memmap_p;
>  	struct crash_elf_info elf_info;
>  
> +	memset(&elf_info, 0x0, sizeof(elf_info));
> +
>  	/* Constant parts of the elf_info */
>  	elf_info.data             = ELFDATA2LSB;
>  	elf_info.backup_src_start = BACKUP_SRC_START;
> diff --git a/kexec/arch/x86_64/kexec-x86_64.c b/kexec/arch/x86_64/kexec-x86_64.c
> index 3092643..c34fd92 100644
> --- a/kexec/arch/x86_64/kexec-x86_64.c
> +++ b/kexec/arch/x86_64/kexec-x86_64.c
> @@ -134,10 +134,7 @@ int arch_process_options(int argc, char **argv)
>  }
>  
>  const struct arch_map_entry arches[] = {
> -	/* For compatibility with older patches
> -	 * use KEXEC_ARCH_DEFAULT instead of KEXEC_ARCH_X86_64 here.
> -	 */
> -	{ "x86_64", KEXEC_ARCH_DEFAULT },
> +	{ "x86_64", KEXEC_ARCH_X86_64 },
>  	{ NULL, 0 },
>  };
>  
> 



More information about the kexec mailing list