[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/EFI: avoid Xen image when looking for module/kexec position
commit e22e1c47958a4778cd7baa3980f74e52f525ba28 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Mar 20 09:27:12 2017 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Mon Mar 20 09:27:12 2017 +0100 x86/EFI: avoid Xen image when looking for module/kexec position When booting straight from EFI, we don't further try to relocate Xen. As a result, so far we also didn't avoid the area Xen uses when looking for a location to put modules or the kexec area. Introduce a fake module slot to deal with that without having to fiddle with a lot of code. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/x86/efi/efi-boot.h | 6 +++++- xen/arch/x86/setup.c | 22 +++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index 15f6d2e..0e1c190 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -13,7 +13,11 @@ static struct file __initdata ucode; static multiboot_info_t __initdata mbi = { .flags = MBI_MODULES | MBI_LOADERNAME }; -static module_t __initdata mb_modules[4]; +/* + * The array size needs to be one larger than the number of modules we + * support - see __start_xen(). + */ +static module_t __initdata mb_modules[5]; static void __init edd_put_string(u8 *dst, size_t n, const char *src) { diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 7ff62a7..1cd290e 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -887,6 +887,16 @@ void __init noreturn __start_xen(unsigned long mbi_p) mod[i].reserved = 0; } + if ( efi_enabled(EFI_LOADER) ) + { + /* + * This needs to remain in sync with xen_in_range() and the + * respective reserve_e820_ram() invocation below. + */ + mod[mbi->mods_count].mod_start = virt_to_mfn(_stext); + mod[mbi->mods_count].mod_end = __2M_rwdata_end - _stext; + } + modules_headroom = bzimage_headroom(bootstrap_map(mod), mod->mod_end); bootstrap_map(NULL); @@ -1067,8 +1077,10 @@ void __init noreturn __start_xen(unsigned long mbi_p) if ( mod[j].reserved ) continue; - /* Don't overlap with other modules. */ - end = consider_modules(s, e, size, mod, mbi->mods_count, j); + /* Don't overlap with other modules (or Xen itself). */ + end = consider_modules(s, e, size, mod, + mbi->mods_count + efi_enabled(EFI_LOADER), + j); if ( highmem_start && end > highmem_start ) continue; @@ -1093,9 +1105,9 @@ void __init noreturn __start_xen(unsigned long mbi_p) */ while ( !kexec_crash_area.start ) { - /* Don't overlap with modules. */ - e = consider_modules(s, e, PAGE_ALIGN(kexec_crash_area.size), - mod, mbi->mods_count, -1); + /* Don't overlap with modules (or Xen itself). */ + e = consider_modules(s, e, PAGE_ALIGN(kexec_crash_area.size), mod, + mbi->mods_count + efi_enabled(EFI_LOADER), -1); if ( s >= e ) break; if ( e > kexec_crash_area_limit ) -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |