[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