File 58cf9260-x86-EFI-avoid-Xen-when-looking-for-mod-kexec-pos.patch of Package xen.6121
References: bsc#1014136
# Commit e22e1c47958a4778cd7baa3980f74e52f525ba28
# Date 2017-03-20 09:27:12 +0100
# Author Jan Beulich <jbeulich@suse.com>
# Committer Jan Beulich <jbeulich@suse.com>
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>
--- a/xen/arch/x86/efi/boot.c
+++ b/xen/arch/x86/efi/boot.c
@@ -79,7 +79,11 @@ static struct file __initdata xsm;
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 CHAR16 __initdata newline[] = L"\r\n";
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -786,6 +786,17 @@ void __init __start_xen(unsigned long mb
mod[i].reserved = 0;
}
+ if ( efi_enabled )
+ {
+ /*
+ * This needs to remain in sync with xen_in_range() and the
+ * respective reserve_e820_ram() invocation below.
+ */
+ mod[mbi->mods_count].mod_start = PFN_DOWN(mbi->mem_upper);
+ mod[mbi->mods_count].mod_end = __pa(_end) -
+ (mbi->mem_upper & PAGE_MASK);
+ }
+
modules_headroom = bzimage_headroom(bootstrap_map(mod), mod->mod_end);
bootstrap_map(NULL);
@@ -923,8 +934,9 @@ void __init __start_xen(unsigned long mb
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, j);
if ( highmem_start && end > highmem_start )
continue;
@@ -948,9 +960,9 @@ void __init __start_xen(unsigned long mb
*/
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, -1);
if ( s >= e )
break;
if ( e > kexec_crash_area_limit )