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 >