kexec fails to boot kernels where CONFIG_RANDOMIZE_BASE=y is set
bhe at redhat.com
Fri Aug 22 07:59:22 PDT 2014
On 08/22/14 at 08:53am, Vivek Goyal wrote:
> On Fri, Aug 22, 2014 at 02:47:39PM +0200, Thomas D. wrote:
> > On 2014-08-22 14:38, Vivek Goyal wrote:
> > > So may be this failure happens because new kernel stomps over page tables
> > > of old kernel. But if that theory is right, then we should be able to
> > > kexec using 32bit entry point of bzImage.
> > >
> > > Thomas, have you had any success with that?
> > When I execute kexec with "--entry-32bit" (I understand that you asked
> > me to try that) the new kernel will boot as expected.
> Good to know that --entry-32bit option makes kexec work with kASLR
> enabled. So this indeed sounds like the issue of page tables being
> stomped over by new kernel.
I don't think page tables could be stomped over by new kernel.
The reason why --entry-32bit can work is kexec-tools get the memory near
the beginning of system RAM. You can check the value passed to argument
buf_end. when --entry-32bit it's 0, that means find memoey hole from low
But in 64bit mode, the buf_end is always -1, this cause all memory ready
for kernel/initrd is close to th end of system ram. On my PC with 16G
memory, all those memory around 16G. I changed buf_end to 1, then use
this to load bzImage64, it works too. And addr for
kernel/initrd/real_mode are all allocated from low to high. I don't know
why we need put kernel/initrd/xxx close to the end of system ram.
diff --git a/kexec/add_buffer.c b/kexec/add_buffer.c
index 4d4a55f..ce76669 100644
@@ -10,5 +10,5 @@ unsigned long add_buffer(struct kexec_info *info,
return add_buffer_virt(info, buf, bufsz, memsz, buf_align,
- buf_min, buf_max, buf_end);
+ buf_min, buf_max, 1);
> IIUC, there are bootloaders which can use 64bit entry point of kernel. I
> think they must run into similar issue too.
> kexec mailing list
> kexec at lists.infradead.org
More information about the kexec