Re: [PATCH] x86, boot: Allow 64bit EFI kernel to be loaded above 4G

From: Yinghai Lu
Date: Fri Feb 20 2015 - 18:53:18 EST


On Fri, Feb 20, 2015 at 1:28 AM, Baoquan He <bhe@xxxxxxxxxx> wrote:
>
> Actually kexec is a bootloader which can put kernel at any address. This
> is done in user space program kexec-tools. However kexec-tools make
> kernel jump from 64bit into 64bit directly, and has built ident mapping
> of whole physical memory. I have tried this and it works. kexec is
> mainly used for kernel developer, kaslr is meaningless for kexec.
>
> However kaslr focus on normal kernel, and jump from 32bit to 64bit mode.
> I can't figure out a way to work around this.
>
> Now I just want to figure out what register setting cause GPF when
> reload kernel above 4G in this jumping from 32bit to 64bit way.

Then you are not setting the ident mapping correctly.

you should make sure add extra ident mapping for the new [output,
output+output_len - 1].
bootloader only cover old [output, output+output_len - 1]

and you should check if the mapping is present before add new one,
otherwise will overrite
the one from 64bit bootloader like kexec-tools or grub2-x86_64 etc.

You could use kernel_ident_mapping_init() from arch/x86/mm/init_64.c
--- may need to cut and paste or split and include to
arch/x86/boot/compressed/misc.c
also you need to find some pages for alloc_pgt_page.

Thanks

Yinghai
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/