[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/4] x86/boot: Size the boot/directmap mappings dynamically
... rather than presuming that 16M will do. With this fixed, Xen is now capable of booting even when its compiled size is larger than 16M. On the EFI side, use l2e_add_flags() to reduce the code-generation overhead of using l2e_from_paddr() twice. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wl@xxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> Can be tested by trying to boot with: diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 759827a19a..fa83a9a28f 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -52,6 +52,8 @@ #include <asm/spec_ctrl.h> #include <asm/guest.h> +static uint8_t __used big_data[MB(16)] = { 42, }; + /* opt_nosmp: If true, secondary processors are ignored. */ static bool __initdata opt_nosmp; boolean_param("nosmp", opt_nosmp); Before this series, Xen will triple fault in one of two places (both on the transition to Xen's high mappings), both ultimately because of cpu0_stack[] getting shifted off the top of the mappings. --- xen/arch/x86/boot/head.S | 21 +++++++++++++-------- xen/arch/x86/efi/efi-boot.h | 23 ++++++++++++++++++----- xen/arch/x86/xen.lds.S | 3 --- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index 94bed4a2d3..eda3161fb1 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -687,14 +687,19 @@ trampoline_setup: * handling/walking), and identity map Xen into bootmap (needed for * the transition into long mode), using 2M superpages. */ - lea sym_esi(start),%ebx - lea (1<<L2_PAGETABLE_SHIFT)*7+(PAGE_HYPERVISOR_RWX|_PAGE_PSE)(%ebx),%eax - shr $(L2_PAGETABLE_SHIFT-3),%ebx - mov $8,%ecx -1: mov %eax,sym_fs(l2_bootmap)-8(%ebx,%ecx,8) - mov %eax,sym_fs(l2_directmap)-8(%ebx,%ecx,8) - sub $(1<<L2_PAGETABLE_SHIFT),%eax - loop 1b + lea sym_esi(_start), %ecx + lea -1 + sym_esi(_end), %edx + lea _PAGE_PSE + PAGE_HYPERVISOR_RWX(%ecx), %eax /* PTE to write. */ + shr $L2_PAGETABLE_SHIFT, %ecx /* First slot to write. */ + shr $L2_PAGETABLE_SHIFT, %edx /* Final slot to write. */ + +1: mov %eax, sym_offs(l2_bootmap) (%esi, %ecx, 8) + mov %eax, sym_offs(l2_directmap)(%esi, %ecx, 8) + add $1, %ecx + add $1 << L2_PAGETABLE_SHIFT, %eax + + cmp %edx, %ecx + jbe 1b /* Initialize L3 boot-map page directory entries. */ lea __PAGE_HYPERVISOR+(L2_PAGETABLE_ENTRIES*8)*3+sym_esi(l2_bootmap),%eax diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index e750db6f5c..00df1736bd 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -611,15 +611,28 @@ static void __init efi_arch_memory_setup(void) * Map Xen into the directmap (needed for early-boot pagetable * handling/walking), and identity map Xen into bootmap (needed for the * transition from the EFI pagetables to Xen), using 2M superpages. + * + * NB: We are currently in physical mode, so a RIP-relative relocation + * against _start/_end gets their real position in memory, which are the + * appropriate l2 slots to map. */ - for ( i = 0; i < 8; ++i ) +#define l2_4G_offset(a) \ + (((UINTN)(a) >> L2_PAGETABLE_SHIFT) & (4 * L2_PAGETABLE_ENTRIES - 1)) + + for ( i = l2_4G_offset(_start); + i <= l2_4G_offset(_end - 1); ++i ) { - unsigned int slot = (xen_phys_start >> L2_PAGETABLE_SHIFT) + i; - paddr_t addr = slot << L2_PAGETABLE_SHIFT; + l2_pgentry_t pte = l2e_from_paddr(i << L2_PAGETABLE_SHIFT, + __PAGE_HYPERVISOR | _PAGE_PSE); + + l2_bootmap[i] = pte; + + /* Bootmap RWX/Non-global. Directmap RW/Global. */ + l2e_add_flags(pte, PAGE_HYPERVISOR); - l2_directmap[slot] = l2e_from_paddr(addr, PAGE_HYPERVISOR|_PAGE_PSE); - l2_bootmap[slot] = l2e_from_paddr(addr, __PAGE_HYPERVISOR|_PAGE_PSE); + l2_directmap[i] = pte; } +#undef l2_4G_offset } static void __init efi_arch_handle_module(struct file *file, const CHAR16 *name, diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 7c351b9df3..a71853a856 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -384,6 +384,3 @@ ASSERT((trampoline_end - trampoline_start) < TRAMPOLINE_SPACE - MBI_SPACE_MIN, "not enough room for trampoline and mbi data") ASSERT((wakeup_stack - wakeup_stack_start) >= WAKEUP_STACK_MIN, "wakeup stack too small") - -/* Plenty of boot code assumes that Xen isn't larger than 16M. */ -ASSERT(_end - _start <= MB(16), "Xen too large for early-boot assumptions") -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |