mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
1 parent
d522571a40
commit
e22e1c4795
2 files changed
+22
-6
No files matched your search
@@ -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)
|
||||
{
|
||||
|
||||
+17
-5
@@ -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 )
|
||||
|
||||