[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 1/3] xen/x86: split boot trampoline into permanent and temporary part
The hypervisor needs a trampoline in low memory for early boot and later for bringing up cpus and during wakeup from suspend. Today this trampoline is kept completely even if most of it isn't needed later. Split the trampoline into a permanent part and a temporary part needed at early boot only. Introduce a new entry at the boundary. Reduce the stack for wakeup code in order for the permanent trampoline to fit in a single page. 4k of stack seems excessive, about 3k should be more than enough. Add an ASSERT() to the linker script to ensure the wakeup stack is always at least 3k. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- V2: - don't reserve space for the wakeup stack, just use the rest of the permanent trampoline page (Jan Beulich) - add an build time assertion for wakeup stack size (Jan Beulich) - some minor fixes (Jan Beulich) --- xen/arch/x86/boot/trampoline.S | 31 +++++++++++++++++++++++++++++-- xen/arch/x86/boot/wakeup.S | 6 +++--- xen/arch/x86/xen.lds.S | 2 ++ xen/include/asm-x86/config.h | 1 + 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/boot/trampoline.S b/xen/arch/x86/boot/trampoline.S index 2715d17..6585f12 100644 --- a/xen/arch/x86/boot/trampoline.S +++ b/xen/arch/x86/boot/trampoline.S @@ -1,4 +1,20 @@ - .code16 +/* + * Trampoline code relocated to low memory. + * + * Care must taken when referencing symbols: they live in the relocated + * trampoline and in the hypervisor binary. The hypervisor symbols can either + * be accessed by their virtual address or by the physical address. When + * using the physical address eventually the physical start address of the + * hypervisor must be taken into account: after early boot the hypervisor + * will copy itself to high memory and writes its physical start address to + * trampoline_xen_phys_start in the low memory trampoline copy. + * + * Parts of the trampoline are needed for early boot only, while some other + * parts are needed as long as the hypervisor is active (e.g. wakeup code + * after suspend, bringup code for secondary cpus). The permanent parts should + * not reference any temporary low memory trampoline parts as those parts are + * not guaranteed to persist. + */ /* NB. bootsym() is only usable in real mode, or via BOOT_PSEUDORM_DS. */ #undef bootsym @@ -18,6 +34,10 @@ .long 111b - (off) - .; \ .popsection +/* Start of the permanent trampoline code. */ + + .code16 + GLOBAL(trampoline_realmode_entry) mov %cs,%ax mov %ax,%ds @@ -131,6 +151,14 @@ start64: movabs $__high_start,%rax jmpq *%rax +#include "wakeup.S" + +/* The first page of trampoline is permanent, the rest boot-time only. */ + .equ trampoline_boot_start, trampoline_start + PAGE_SIZE + .global trampoline_boot_start + +/* From here on early boot only. */ + .code32 trampoline_boot_cpu_entry: cmpb $0,bootsym_rel(skip_realmode,5) @@ -246,4 +274,3 @@ rm_idt: .word 256*4-1, 0, 0 #include "mem.S" #include "edd.S" #include "video.S" -#include "wakeup.S" diff --git a/xen/arch/x86/boot/wakeup.S b/xen/arch/x86/boot/wakeup.S index 08ea9b2..fa120a9 100644 --- a/xen/arch/x86/boot/wakeup.S +++ b/xen/arch/x86/boot/wakeup.S @@ -1,6 +1,7 @@ .code16 #define wakesym(sym) (sym - wakeup_start) +#define wakeup_stack trampoline_start + PAGE_SIZE .align 16 ENTRY(wakeup_start) @@ -173,6 +174,5 @@ bogus_saved_magic: movw $0x0e00 + 'S', 0xb8014 jmp bogus_saved_magic - .align 16 - .fill PAGE_SIZE,1,0 -wakeup_stack: +/* Stack for wakeup: rest of first trampoline page. */ +ENTRY(wakeup_stack_start) diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 2d0ee8e..7b87bdb 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -335,3 +335,5 @@ ASSERT(IS_ALIGNED(__bss_end, 8), "__bss_end misaligned") ASSERT((trampoline_end - trampoline_start) < TRAMPOLINE_SPACE - MBI_SPACE_MIN, "not enough room for trampoline and mbi data") +ASSERT((trampoline_boot_start - wakeup_stack_start) >= WAKEUP_STACK_MIN, + "wakeup stack too small") diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h index b9a6d94..d3ec2c3 100644 --- a/xen/include/asm-x86/config.h +++ b/xen/include/asm-x86/config.h @@ -75,6 +75,7 @@ #define TRAMPOLINE_STACK_SPACE PAGE_SIZE #define TRAMPOLINE_SPACE (KB(64) - TRAMPOLINE_STACK_SPACE) +#define WAKEUP_STACK_MIN 3072 #define MBI_SPACE_MIN (2 * PAGE_SIZE) -- 2.10.2 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |