[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen stable-4.9] x86/boot: Fix the boot time relocation calculations



commit 75bfb9eaf0c932c4d953e6eeda670275238a1fca
Author:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Fri Jun 2 11:22:17 2017 +0100
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Jun 20 09:39:22 2017 +0100

    x86/boot: Fix the boot time relocation calculations
    
    c/s b28044226e1 "x86: make Xen early boot code relocatable" introduces
    
        mov $sym_offs(__image_base__),%esi
    
    to the legacy boot path.  However, this is by definition 0, which means the
    boot code only functions correctly when Xen is loaded at its preferred
    physical address (2M at the time of writing).
    
    Xen does cope if loaded at an alternative physical address, if the
    MULTIBOOT2_TAG_TYPE_LOAD_BASE_ADDR tag is filled in properly.  While recent
    versions of Grub do fill this in appropriately, tboot does not.  (In fact,
    tboot loads Xen at the preferred address, but claims a load address of 8M.)
    
    Both Multiboot 1 and 2 specify the execution environment as being flat.  As 
a
    result, Xen needs no help calculating the proper load address.
    
    However, Multiboot specifies %esp as undefined.  Experimentally, using the
    entry %esp is fine, but this is certainly no guarantee.  Use a temporary 
stack
    in the first page of RAM, which is one of the safest areas to clobber.
    
    Calculate the load address from %eip alone, and ignore
    MULTIBOOT2_TAG_TYPE_LOAD_BASE_ADDR entirely.  This fixes legacy boot under
    various versions of tboot.
    
    Finally, set up the stack as soon as possible, which means the BIOS path 
has a
    usable stack for the entirety of its duration.  Use the full available stack
    size, rather than limiting to an arbitrary 1k.  One side effect is that the
    MB2/EFI path continues to use the EFI stack until the trampoline is entered.
    
    Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    Tested-by: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    Reviewed-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
    Release-acked-by: Julien Grall <julien.grall@xxxxxxx>
    (cherry picked from commit 1695e53851e523b62dbfa1990556ef68393199a8)
---
 xen/arch/x86/boot/head.S | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
index 5e84e42..fd6fc33 100644
--- a/xen/arch/x86/boot/head.S
+++ b/xen/arch/x86/boot/head.S
@@ -377,8 +377,26 @@ __start:
         cld
         cli
 
-        /* Load default Xen image load base address. */
-        mov     $sym_offs(__image_base__),%esi
+        /*
+         * Multiboot (both 1 and 2) specify the stack pointer as undefined
+         * when entering in BIOS circumstances.  This is unhelpful for
+         * relocatable images, where one push/pop is required to calculate
+         * images load address.
+         *
+         * On a BIOS-based system, the IVT and BDA occupy the first 5/16ths of
+         * the first page of RAM, with the rest free for use.  Use the top of
+         * this page for a temporary stack, being one of the safest locations
+         * to clobber.
+         */
+        mov     $0x1000, %esp
+
+        /* Calculate the load base address. */
+        call    1f
+1:      pop     %esi
+        sub     $sym_offs(1b), %esi
+
+        /* Set up stack. */
+        lea     STACK_SIZE + sym_esi(cpu0_stack), %esp
 
         /* Bootloaders may set multiboot{1,2}.mem_lower to a nonzero value. */
         xor     %edx,%edx
@@ -410,15 +428,6 @@ __start:
         cmp     %edi,MB2_fixed_total_size(%ebx)
         jbe     trampoline_bios_setup
 
-        /* Get Xen image load base address from Multiboot2 information. */
-        cmpl    $MULTIBOOT2_TAG_TYPE_LOAD_BASE_ADDR,MB2_tag_type(%ecx)
-        jne     .Lmb2_mem_lower
-
-        mov     MB2_load_base_addr(%ecx),%esi
-        sub     $XEN_IMG_OFFSET,%esi
-        jmp     .Lmb2_next_tag
-
-.Lmb2_mem_lower:
         /* Get mem_lower from Multiboot2 information. */
         cmpl    $MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO,MB2_tag_type(%ecx)
         cmove   MB2_mem_lower(%ecx),%edx
@@ -519,9 +528,6 @@ trampoline_setup:
         mov     %esi,sym_fs(xen_phys_start)
         mov     %esi,sym_fs(trampoline_xen_phys_start)
 
-        /* Setup stack. %ss was initialized earlier. */
-        lea     1024+sym_esi(cpu0_stack),%esp
-
         mov     sym_fs(trampoline_phys),%ecx
 
         /* Get bottom-most low-memory stack address. */
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.9

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.