Previously, Xen used information from the BDA to detect the amount of available low memory. This does not work on some scenarios such as Coreboot, or when booting from Kexec on a UEFI system without CSM.
Use the information directly supplied by Multiboot boot information instead. --- xen/arch/x86/boot/head.S | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index dd1bea0d10..62fe3fe55b 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -524,33 +524,23 @@ trampoline_bios_setup: mov %ecx,%fs mov %ecx,%gs - /* Set up trampoline segment 64k below EBDA */ - movzwl 0x40e,%ecx /* EBDA segment */ - cmp $0xa000,%ecx /* sanity check (high) */ - jae 0f - cmp $0x4000,%ecx /* sanity check (low) */ - jae 1f -0: - movzwl 0x413,%ecx /* use base memory size on failure */ - shl $10-4,%ecx -1: + /* Use lower memory size directly from Multiboot */ + mov %edx,%ecx /* - * Compare the value in the BDA with the information from the - * multiboot structure (if available) and use the smallest. + * Old Kexec used to report the value in bytes instead of kilobytes + * like it's supposed to, so fix that if detected. */ - cmp $0x100,%edx /* is the multiboot value too small? */ - jb 2f /* if so, do not use it */ - shl $10-4,%edx - cmp %ecx,%edx /* compare with BDA value */ - cmovb %edx,%ecx /* and use the smaller */ + cmpl $640,%ecx + jbe 1f + shr $10,%ecx +1: + /* From arch/x86/smpboot.c: start_eip had better be page-aligned! */ + shr $2,%ecx -2: /* Reserve memory for the trampoline and the low-memory stack. */ - sub $((TRAMPOLINE_SPACE+TRAMPOLINE_STACK_SPACE)>>4),%ecx + sub $((TRAMPOLINE_SPACE+TRAMPOLINE_STACK_SPACE)>>12),%ecx - /* From arch/x86/smpboot.c: start_eip had better be page-aligned! */ - xor %cl, %cl - shl $4, %ecx + shl $12,%ecx mov %ecx,sym_esi(trampoline_phys) trampoline_setup: -- 2.25.1