[PATCH] kexec, x86: fix kexec when boot_params.hardware_subarch != 0

Simon Horman horms at verge.net.au
Mon Mar 28 17:40:12 EDT 2011


On Mon, Mar 28, 2011 at 12:40:49PM -0700, Chris Leech wrote:
> kexec needs to keep the subarch setting the same as the running kernel
> in the boot parameters, or the kernel will die in early setup.  I ran
> into this with X86_SUBARCH_MRST, but it should apply to CE4100 and any
> future subarch that uses non-default early setup code.
> 
> This patch requires debugfs mounted at /sys/kernel/debug, as that's
> the only way I know of to get at the running kernels boot_params.
> Without debugfs mounted it falls back to the current behavior of
> assuming subarch 0.
> 
> Signed-off-by: Chris Leech <christopher.leech at linux.intel.com>
> ---
>  kexec/arch/i386/x86-linux-setup.c |   21 +++++++++++++++++++++
>  1 files changed, 21 insertions(+), 0 deletions(-)
> 
> diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
> index f843ca4..b7f8bd8 100644
> --- a/kexec/arch/i386/x86-linux-setup.c
> +++ b/kexec/arch/i386/x86-linux-setup.c
> @@ -20,6 +20,7 @@
>  #include <string.h>
>  #include <stdarg.h>
>  #include <stdlib.h>
> +#include <stddef.h>
>  #include <errno.h>
>  #include <limits.h>
>  #include <sys/types.h>
> @@ -396,12 +397,32 @@ out:
>  		real_mode->eddbuf_entries);
>  }
>  
> +#define BOOT_PARAMS_DBGFS	"/sys/kernel/debug/boot_params/data"
> +
> +void setup_subarch(struct x86_linux_param_header *real_mode)
> +{
> +	int data_file;
> +	const off_t offset = offsetof(typeof(*real_mode), hardware_subarch);
> +
> +	data_file = open(BOOT_PARAMS_DBGFS, O_RDONLY);
> +	if (data_file < 0)
> +		return;
> +	if (lseek(data_file, offset, SEEK_SET) < 0)
> +		goto close;
> +	read(data, &real_mode->hardware_subarch, sizeof(uint32_t));

Should data be data_file?

> +close:
> +	close(data_file);
> +}
> +
>  void setup_linux_system_parameters(struct x86_linux_param_header *real_mode,
>  					unsigned long kexec_flags)
>  {
>  	/* Fill in information the BIOS would usually provide */
>  	struct memory_range *range;
>  	int i, ranges;
> +
> +	/* get subarch from running kernel */
> +	setup_subarch(real_mode);
>  	
>  	/* Default screen size */
>  	real_mode->orig_x = 0;
> 
> 
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
> 



More information about the kexec mailing list