This should be squashed into the 4/4 patch 'x86: add multiboot2 protocol
support for EFI platforms'.
- fix incorrect assembly (identified by Andrew Cooper)
- fix issue where the trampoline size was left as 0 and the
way the memory is allocated for the trampolines we would go to
the end of an available section and then subtract off the size
to decide where to place it. The end result was that we would
always copy the trampolines and the 32-bit stack into some
form of reserved memory after the conventional region we
wanted to put things into. On some systems this did not
manifest as a crash while on others it did. Reworked the
changes to always reserve 64kb for both the stack and the size
of the trampolines. Added an ASSERT to make sure we never blow
through this size.
Signed-off-by: Doug Goldstein
Reviewed-by: Doug Goldstein
---
Doug v2 - new in this version to help show what's changed
---
---
xen/arch/x86/boot/head.S| 1 +
xen/arch/x86/efi/efi-boot.h | 9 +++--
xen/arch/x86/efi/stub.c | 2 +-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
index ac93df0..876a6b1 100644
--- a/xen/arch/x86/boot/head.S
+++ b/xen/arch/x86/boot/head.S
@@ -519,6 +519,7 @@ trampoline_setup:
1:
/* Switch to low-memory stack. */
mov sym_phys(trampoline_phys),%edi
+/* The stack starts 64kb after the location of trampoline_phys */
lea 0x1(%edi),%esp
lea trampoline_boot_cpu_entry-trampoline_start(%edi),%eax
pushl $BOOT_CS32
diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
index dc857d8..af97fb9 100644
--- a/xen/arch/x86/efi/efi-boot.h
+++ b/xen/arch/x86/efi/efi-boot.h
@@ -170,9 +170,10 @@ static void __init
efi_arch_process_memory_map(EFI_SYSTEM_TABLE *SystemTable,
/* fall through */
case EfiConventionalMemory:
if ( !trampoline_phys && desc->PhysicalStart + len <= 0x10 &&
- len >= cfg.size + extra_mem &&
- desc->PhysicalStart + len > cfg.addr )
+ len >= cfg.size && desc->PhysicalStart + len > cfg.addr ) {
+ASSERT(cfg.size > 0);
cfg.addr = (desc->PhysicalStart + len - cfg.size) & PAGE_MASK;
+}
/* fall through */
case EfiLoaderCode:
case EfiLoaderData:
@@ -686,6 +687,10 @@ 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 = 64 << 10;
+ASSERT(cfg.size >= ((trampoline_end - trampoline_start) + 4096));
+
if ( gop )
efi_set_gop_mode(gop, gop_mode);
diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c
index 6ea6aa1..b81adc0 100644
--- a/xen/arch/x86/efi/stub.c
+++ b/xen/arch/x86/efi/stub.c
@@ -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)
--
git-series 0.9.1
___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel