@@ -89,12 +89,12 @@ multiboot2_header_start:
0, /* Number of the lines - no preference. */ \
0 /* Number of bits per pixel - no preference. */
- /* Inhibit bootloader from calling ExitBootServices(). */
+ /* Request that ExitBootServices() not be called. */
mb2ht_init MB2_HT(EFI_BS), MB2_HT(OPTIONAL)
/* EFI64 entry point. */
mb2ht_init MB2_HT(ENTRY_ADDRESS_EFI64), MB2_HT(OPTIONAL), \
- sym_phys(__efi64_start)
+ sym_phys(__mb2_efi64_start)
/* Multiboot2 header end tag. */
mb2ht_init MB2_HT(END), MB2_HT(REQUIRED)
@@ -169,7 +169,7 @@ not_multiboot:
.code64
-__efi64_start:
+__mb2_efi64_start:
cld
/* VGA is not available on EFI platforms. */
@@ -519,6 +519,7 @@ trampoline_setup:
1:
/* Switch to low-memory stack. */
mov sym_phys(trampoline_phys),%edi
+ /* The stack ends 64kb after the location of trampoline_phys */
lea 0x10000(%edi),%esp
lea trampoline_boot_cpu_entry-trampoline_start(%edi),%eax
pushl $BOOT_CS32
@@ -146,8 +146,6 @@ static void __init efi_arch_process_memory_map(EFI_SYSTEM_TABLE *SystemTable,
{
struct e820entry *e;
unsigned int i;
- /* Check for extra mem for mbi data if Xen is loaded via multiboot2 protocol. */
- UINTN extra_mem = efi_enabled(EFI_LOADER) ? 0 : (64 << 10);
/* Populate E820 table and check trampoline area availability. */
e = e820map - 1;
@@ -170,8 +168,7 @@ static void __init efi_arch_process_memory_map(EFI_SYSTEM_TABLE *SystemTable,
/* fall through */
case EfiConventionalMemory:
if ( !trampoline_phys && desc->PhysicalStart + len <= 0x100000 &&
- len >= cfg.size + extra_mem &&
- desc->PhysicalStart + len > cfg.addr )
+ len >= cfg.size && desc->PhysicalStart + len > cfg.addr )
cfg.addr = (desc->PhysicalStart + len - cfg.size) & PAGE_MASK;
/* fall through */
case EfiLoaderCode:
@@ -686,6 +683,9 @@ paddr_t __init efi_multiboot2(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTa
setup_efi_pci();
efi_variables();
+ /* This is the maximum size of our trampoline + our low memory stack */
+ cfg.size = KB(64);
+
if ( gop )
efi_set_gop_mode(gop, gop_mode);
@@ -33,7 +33,7 @@ paddr_t __init noreturn efi_multiboot2(EFI_HANDLE ImageHandle,
* not be directly supported by C compiler.
*/
asm volatile(
- " call %2 \n"
+ " call *%2 \n"
"0: hlt \n"
" jmp 0b \n"
: "+c" (StdErr), "+d" (err) : "g" (StdErr->OutputString)
@@ -333,3 +333,11 @@ ASSERT(IS_ALIGNED(trampoline_start, 4), "trampoline_start misaligned")
ASSERT(IS_ALIGNED(trampoline_end, 4), "trampoline_end misaligned")
ASSERT(IS_ALIGNED(__bss_start, 8), "__bss_start misaligned")
ASSERT(IS_ALIGNED(__bss_end, 8), "__bss_end misaligned")
+
+/*
+ * The trampolines and the low memory stack must fit in 64kb. In testing
+ * the low memory stack never exceeded 1kb so just require that the
+ * trampolines fit in 63kb, leaving 1kb for the stack.
+ */
+ASSERT((trampoline_end - trampoline_start) < KB(63),
+ "not enough room for trampolines and low memory stack")
@@ -70,6 +70,7 @@
#define __force
#define __bitwise
+#define KB(_kb) (_AC(_kb, ULL) << 10)
#define MB(_mb) (_AC(_mb, ULL) << 20)
#define GB(_gb) (_AC(_gb, ULL) << 30)