From patchwork Tue Feb 21 19:19:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Kiper X-Patchwork-Id: 9585455 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 06F64602A7 for ; Tue, 21 Feb 2017 19:23:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EAD86283F9 for ; Tue, 21 Feb 2017 19:23:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DF08D2860A; Tue, 21 Feb 2017 19:23:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id AC902283F9 for ; Tue, 21 Feb 2017 19:23:26 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cgFze-0001yX-OT; Tue, 21 Feb 2017 19:20:58 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cgFzd-0001x9-5F for xen-devel@lists.xenproject.org; Tue, 21 Feb 2017 19:20:57 +0000 Received: from [85.158.143.35] by server-8.bemta-6.messagelabs.com id 06/65-21675-8139CA85; Tue, 21 Feb 2017 19:20:56 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupmkeJIrShJLcpLzFFi42LpnVTnqis+eU2 EwZU7+hbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8akf5OYCl5sZaz493UFWwPj/EbGLkYuDiGB iUwSHVcmsUI4vxklDs78zALhbGSU2PH4IUwZo0TH3gNsXYycHGwCOhIXvzxkB7FFBJQk7q2az ARSxCwwk0ni9J2TLCAJYQEnifdnXzCB2CwCqhK7d7ezgti8Au4S17rOgTVLCChKdD+bADaUU8 BDYvOfE2D1QkA1m7YeZ4WoMZT4vHEp8wRGvgWMDKsY1YtTi8pSi3TN9JKKMtMzSnITM3N0DQ3 M9HJTi4sT01NzEpOK9ZLzczcxAgOGAQh2MM474X+IUZKDSUmUNydjTYQQX1J+SmVGYnFGfFFp TmrxIUYZDg4lCV6XWqCcYFFqempFWmYOMHRh0hIcPEoivAdqgNK8xQWJucWZ6RCpU4y6HKdun H7JJMSSl5+XKiXOyw8yQwCkKKM0D24ELI4uMcpKCfMyAh0lxFOQWpSbWYIq/4pRnINRSZg3EG QKT2ZeCdymV0BHMAEdcdNjJcgRJYkIKakGxgMx6+r3/7l38ND+M3YuiRtiLuX6BbuLv926Q/f Z1bKdUunGLdtO289iF1z2ZcX8nsesvOuXbDeLnOOvvemrz7Utzx0Ox+mGTJlTEW+w+O0yp7W2 ZRtEpn7arMN98Hvvjje34r9IWJhfiAypE6woM/YuSst9HXhHcMH/01/nBZXOZ285maAnYaTEU pyRaKjFXFScCADnXNWzngIAAA== X-Env-Sender: daniel.kiper@oracle.com X-Msg-Ref: server-9.tower-21.messagelabs.com!1487704853!58716467!1 X-Originating-IP: [141.146.126.69] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTQxLjE0Ni4xMjYuNjkgPT4gMjc3MjE4\n X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 22433 invoked from network); 21 Feb 2017 19:20:55 -0000 Received: from aserp1040.oracle.com (HELO aserp1040.oracle.com) (141.146.126.69) by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 21 Feb 2017 19:20:55 -0000 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id v1LJKbZM020405 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Feb 2017 19:20:37 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id v1LJKaQh032756 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Feb 2017 19:20:36 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id v1LJKZBj018809; Tue, 21 Feb 2017 19:20:35 GMT Received: from olila.local.net-space.pl (/10.175.217.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 21 Feb 2017 11:20:35 -0800 From: Daniel Kiper To: xen-devel@lists.xenproject.org Date: Tue, 21 Feb 2017 20:19:56 +0100 Message-Id: <1487704799-21162-8-git-send-email-daniel.kiper@oracle.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1487704799-21162-1-git-send-email-daniel.kiper@oracle.com> References: <1487704799-21162-1-git-send-email-daniel.kiper@oracle.com> X-Source-IP: userv0022.oracle.com [156.151.31.74] Cc: jgross@suse.com, sstabellini@kernel.org, andrew.cooper3@citrix.com, cardoe@cardoe.com, pgnet.dev@gmail.com, ning.sun@intel.com, julien.grall@arm.com, jbeulich@suse.com, qiaowei.ren@intel.com, gang.wei@intel.com, fu.wei@linaro.org Subject: [Xen-devel] [PATCH v16 7/9] x86: make Xen early boot code relocatable X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Every multiboot protocol (regardless of version) compatible image must specify its load address (in ELF or multiboot header). Multiboot protocol compatible loader have to load image at specified address. However, there is no guarantee that the requested memory region (in case of Xen it starts at 2 MiB and ends at ~5 MiB) where image should be loaded initially is a RAM and it is free (legacy BIOS platforms are merciful for Xen but I found at least one EFI platform on which Xen load address conflicts with EFI boot services; it is Dell PowerEdge R820 with latest firmware). To cope with that problem we must make Xen early boot code relocatable and help boot loader to relocate image in proper way by suggesting, not requesting specific load addresses as it is right now, allowed address ranges. This patch does former. It does not add multiboot2 protocol interface which is done in "x86: add multiboot2 protocol support for relocatable images" patch. This patch changes following things: - %esi register is used as a storage for Xen image load base address; it is mostly unused in early boot code and preserved during C functions calls in 32-bit mode, - %fs is used as base for Xen data relative addressing in 32-bit code if it is possible; %esi is used for that thing during error printing because it is not always possible to properly and efficiently initialize %fs. Signed-off-by: Daniel Kiper Reviewed-by: Jan Beulich --- v13 - suggestions/fixes: - move gdt_boot_descr to .init.data section (suggested by Jan Beulich). v12 - suggestions/fixes: - store Xen image load base address directly into %esi, - store Xen image load base address after x86_32_switch (suggested by Doug Goldstein), - improve commit message. v8 - suggestions/fixes: - use shld instead of mov and shr in BOOT_FS segment descriptor base address initialization (suggested by Jan Beulich), - simplify code updating frame addresses in page tables (suggested by Jan Beulich), - print Xen image base addresses using "%#lx" format (suggested by Jan Beulich), - improve comments (suggested by Jan Beulich). v6 - suggestions/fixes: - leave static mapping of first 16 MiB in l2_identmap as is (suggested by Jan Beulich), - use xen_phys_start instead of xen_img_load_base_addr (suggested by Daniel Kiper and Jan Beulich), - simplify BOOT_FS segment descriptor base address initialization (suggested by Jan Beulich), - fix BOOT_FS segment limit (suggested by Jan Beulich), - do not rename sym_phys in this patch (suggested by Jan Beulich), - rename esi_offset/fs_offset to sym_esi/sym_fs respectively (suggested by Jan Beulich), - use add instead of lea in assembly error printing code (suggested by Jan Beulich), - improve comments (suggested by Jan Beulich), - improve commit message (suggested by Jan Beulich), - various minor cleanups and fixes (suggested by Jan Beulich). v4 - suggestions/fixes: - do not relocate Xen image if boot loader did work for us (suggested by Andrew Cooper and Jan Beulich), - initialize xen_img_load_base_addr in EFI boot code too, - properly initialize trampoline_xen_phys_start, - calculate Xen image load base address in x86_64 code ourselves, (suggested by Jan Beulich), - change how and when Xen image base address is printed, - use %fs instead of %esi for relative addressing (suggested by Andrew Cooper and Jan Beulich), - create esi_offset and fs_offset() macros in assembly, - calculate mkelf32 argument automatically, - optimize and cleanup code, - improve comments, - improve commit message. v3 - suggestions/fixes: - improve segment registers initialization (suggested by Jan Beulich), - simplify Xen image load base address calculation (suggested by Jan Beulich), - use %esi and %r15d instead of %ebp to store Xen image load base address, - use %esi instead of %fs for relative addressing; this way we get shorter and simpler code, - rename some variables and constants (suggested by Jan Beulich), - improve comments (suggested by Konrad Rzeszutek Wilk), - improve commit message (suggested by Jan Beulich). --- xen/arch/x86/boot/head.S | 170 ++++++++++++++++++++++++++++--------- xen/arch/x86/boot/trampoline.S | 5 ++ xen/arch/x86/boot/x86_64.S | 21 +++-- xen/arch/x86/setup.c | 14 +-- xen/arch/x86/x86_64/asm-offsets.c | 3 + xen/include/asm-x86/page.h | 2 +- 6 files changed, 158 insertions(+), 57 deletions(-) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index b5d9ec8..658e40a 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -12,12 +12,15 @@ .code32 #define sym_phys(sym) ((sym) - __XEN_VIRT_START) +#define sym_esi(sym) sym_phys(sym)(%esi) +#define sym_fs(sym) %fs:sym_phys(sym) #define BOOT_CS32 0x0008 #define BOOT_CS64 0x0010 #define BOOT_DS 0x0018 #define BOOT_PSEUDORM_CS 0x0020 #define BOOT_PSEUDORM_DS 0x0028 +#define BOOT_FS 0x0030 #define MB2_HT(name) (MULTIBOOT2_HEADER_TAG_##name) #define MB2_TT(name) (MULTIBOOT2_TAG_TYPE_##name) @@ -100,13 +103,6 @@ multiboot2_header_start: .Lmultiboot2_header_end: .section .init.rodata, "a", @progbits - .align 4 - - .word 0 -gdt_boot_descr: - .word 6*8-1 - .long sym_phys(trampoline_gdt) - .long 0 /* Needed for 64-bit lgdt */ .Lbad_cpu_msg: .asciz "ERR: Not a 64-bit CPU!" .Lbad_ldr_msg: .asciz "ERR: Not a Multiboot bootloader!" @@ -118,6 +114,13 @@ gdt_boot_descr: .section .init.data, "aw", @progbits .align 4 + .word 0 +gdt_boot_descr: + .word 7*8-1 +gdt_boot_base: + .long sym_phys(trampoline_gdt) + .long 0 /* Needed for 64-bit lgdt */ + vga_text_buffer: .long 0xb8000 @@ -127,21 +130,21 @@ efi_platform: .section .init.text, "ax", @progbits bad_cpu: - mov $(sym_phys(.Lbad_cpu_msg)),%esi # Error message + add $sym_phys(.Lbad_cpu_msg),%esi # Error message jmp .Lget_vtb not_multiboot: - mov $(sym_phys(.Lbad_ldr_msg)),%esi # Error message + add $sym_phys(.Lbad_ldr_msg),%esi # Error message jmp .Lget_vtb .Lmb2_no_st: /* * Here we are on EFI platform. vga_text_buffer was zapped earlier * because there is pretty good chance that VGA is unavailable. */ - mov $(sym_phys(.Lbad_ldr_nst)),%esi # Error message + add $sym_phys(.Lbad_ldr_nst),%esi # Error message jmp .Lget_vtb .Lmb2_no_ih: /* Ditto. */ - mov $(sym_phys(.Lbad_ldr_nih)),%esi # Error message + add $sym_phys(.Lbad_ldr_nih),%esi # Error message jmp .Lget_vtb .Lmb2_no_bs: /* @@ -149,7 +152,7 @@ not_multiboot: * via start label. Then reliable vga_text_buffer zap is impossible * in Multiboot2 scanning loop and we have to zero %edi below. */ - mov $(sym_phys(.Lbad_ldr_nbs)),%esi # Error message + add $sym_phys(.Lbad_ldr_nbs),%esi # Error message xor %edi,%edi # No VGA text buffer jmp .Lsend_chr .Lmb2_efi_ia_32: @@ -157,11 +160,11 @@ not_multiboot: * Here we are on EFI IA-32 platform. Then reliable vga_text_buffer zap is * impossible in Multiboot2 scanning loop and we have to zero %edi below. */ - mov $(sym_phys(.Lbad_efi_msg)),%esi # Error message + add $sym_phys(.Lbad_efi_msg),%esi # Error message xor %edi,%edi # No VGA text buffer jmp .Lsend_chr .Lget_vtb: - mov sym_phys(vga_text_buffer),%edi + mov sym_esi(vga_text_buffer),%edi .Lsend_chr: mov (%esi),%bl test %bl,%bl # Terminate on '\0' sentinel @@ -325,9 +328,13 @@ __efi64_mb2_start: x86_32_switch: mov %r15,%rdi + /* Store Xen image load base address in place accessible for 32-bit code. */ + lea __image_base__(%rip),%esi + cli /* Initialize GDTR. */ + add %esi,gdt_boot_base(%rip) lgdt gdt_boot_descr(%rip) /* Reload code selector. */ @@ -363,12 +370,8 @@ __start: cld cli - /* Initialise GDT and basic data segments. */ - lgdt %cs:sym_phys(gdt_boot_descr) - mov $BOOT_DS,%ecx - mov %ecx,%ds - mov %ecx,%es - mov %ecx,%ss + /* Load default Xen image load base address. */ + mov $sym_phys(__image_base__),%esi /* Bootloaders may set multiboot{1,2}.mem_lower to a nonzero value. */ xor %edx,%edx @@ -425,6 +428,25 @@ __start: jmp .Lmb2_tsize trampoline_bios_setup: + /* + * Called on legacy BIOS platforms only. + * + * Initialize GDTR and basic data segments. + */ + add %esi,sym_esi(gdt_boot_base) + lgdt sym_esi(gdt_boot_descr) + + mov $BOOT_DS,%ecx + mov %ecx,%ds + mov %ecx,%es + mov %ecx,%ss + /* %esp is initialized later. */ + + /* Load null descriptor to unused segment registers. */ + xor %ecx,%ecx + mov %ecx,%fs + mov %ecx,%gs + /* Set up trampoline segment 64k below EBDA */ movzwl 0x40e,%ecx /* EBDA segment */ cmp $0xa000,%ecx /* sanity check (high) */ @@ -452,21 +474,49 @@ trampoline_bios_setup: /* From arch/x86/smpboot.c: start_eip had better be page-aligned! */ xor %cl, %cl shl $4, %ecx - mov %ecx,sym_phys(trampoline_phys) + mov %ecx,sym_esi(trampoline_phys) trampoline_setup: - mov sym_phys(trampoline_phys),%ecx + /* + * Called on legacy BIOS and EFI platforms. + * + * Initialize 0-15 bits of BOOT_FS segment descriptor base address. + */ + mov %si,BOOT_FS+2+sym_esi(trampoline_gdt) + + /* Initialize 16-23 bits of BOOT_FS segment descriptor base address. */ + shld $16,%esi,%edx + mov %dl,BOOT_FS+4+sym_esi(trampoline_gdt) + + /* Initialize 24-31 bits of BOOT_FS segment descriptor base address. */ + mov %dh,BOOT_FS+7+sym_esi(trampoline_gdt) + + /* + * Initialize %fs and later use it to access Xen data if possible. + * According to Intel 64 and IA-32 Architectures Software Developer's + * Manual it is safe to do that without reloading GDTR before. + */ + mov $BOOT_FS,%edx + mov %edx,%fs + + /* Save Xen image load base address for later use. */ + 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. */ add $TRAMPOLINE_SPACE,%ecx /* Save the Multiboot info struct (after relocation) for later use. */ - mov $sym_phys(cpu0_stack)+1024,%esp push %ecx /* Bottom-most low-memory stack address. */ push %ebx /* Multiboot information address. */ push %eax /* Multiboot magic. */ call reloc - mov %eax,sym_phys(multiboot_ptr) + mov %eax,sym_fs(multiboot_ptr) /* * Now trampoline_phys points to the following structure (lowest address @@ -489,16 +539,20 @@ trampoline_setup: * Do not zero BSS on EFI platform here. * It was initialized earlier. */ - cmpb $0,sym_phys(efi_platform) + cmpb $0,sym_fs(efi_platform) jnz 1f /* Initialize BSS (no nasty surprises!). */ mov $sym_phys(__bss_start),%edi mov $sym_phys(__bss_end),%ecx + push %fs + pop %es sub %edi,%ecx xor %eax,%eax shr $2,%ecx rep stosl + push %ds + pop %es 1: /* Interrogate CPU extended features via CPUID. */ @@ -512,8 +566,8 @@ trampoline_setup: jbe 1f mov $0x80000001,%eax cpuid -1: mov %edx,sym_phys(cpuid_ext_features) - mov %edx,sym_phys(boot_cpu_data)+CPUINFO_FEATURE_OFFSET(X86_FEATURE_LM) +1: mov %edx,sym_fs(cpuid_ext_features) + mov %edx,sym_fs(boot_cpu_data)+CPUINFO_FEATURE_OFFSET(X86_FEATURE_LM) /* Check for availability of long mode. */ bt $cpufeat_bit(X86_FEATURE_LM),%edx @@ -521,15 +575,52 @@ trampoline_setup: /* Stash TSC to calculate a good approximation of time-since-boot */ rdtsc - mov %eax,sym_phys(boot_tsc_stamp) - mov %edx,sym_phys(boot_tsc_stamp+4) + mov %eax,sym_fs(boot_tsc_stamp) + mov %edx,sym_fs(boot_tsc_stamp)+4 + + /* + * Update frame addresses in page tables excluding l2_identmap + * without its first entry which points to l1_identmap. + */ + mov $((__page_tables_end-__page_tables_start)/8),%ecx + mov $(((l2_identmap-__page_tables_start)/8)+1),%edx +1: cmp $((l2_identmap+l2_identmap_sizeof-__page_tables_start)/8),%ecx + cmove %edx,%ecx + testl $_PAGE_PRESENT,sym_fs(__page_tables_start)-8(,%ecx,8) + jz 2f + add %esi,sym_fs(__page_tables_start)-8(,%ecx,8) +2: loop 1b + + /* Initialize L2 boot-map/direct map page table entries (16MB). */ + lea sym_esi(start),%ebx + lea (1<= end ) return NULL; - if ( end <= BOOTSTRAP_MAP_BASE ) - return (void *)(unsigned long)start; - ret = (void *)(map_cur + (unsigned long)(start & mask)); start &= ~mask; end = (end + mask) & ~mask; @@ -715,6 +712,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) printk("Command line: %s\n", cmdline); + printk("Xen image load base address: %#lx\n", xen_phys_start); + printk("Video information:\n"); /* Print VGA display mode information. */ @@ -972,7 +971,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) /* Not present, 1GB mapping, or already relocated? */ if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) || (l3e_get_flags(*pl3e) & _PAGE_PSE) || - (l3e_get_pfn(*pl3e) > 0x1000) ) + (l3e_get_pfn(*pl3e) > PFN_DOWN(xen_phys_start)) ) continue; *pl3e = l3e_from_intpte(l3e_get_intpte(*pl3e) + xen_phys_start); @@ -982,7 +981,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) /* Not present, PSE, or already relocated? */ if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) || (l2e_get_flags(*pl2e) & _PAGE_PSE) || - (l2e_get_pfn(*pl2e) > 0x1000) ) + (l2e_get_pfn(*pl2e) > PFN_DOWN(xen_phys_start)) ) continue; *pl2e = l2e_from_intpte(l2e_get_intpte(*pl2e) + xen_phys_start); @@ -1005,7 +1004,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) { unsigned int flags; - if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) ) + if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) || + (l2e_get_pfn(*pl2e) > PFN_DOWN(xen_phys_start)) ) continue; if ( !using_2M_mapping() ) @@ -1059,6 +1059,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) : "memory" ); bootstrap_map(NULL); + + printk("New Xen image base address: %#lx\n", xen_phys_start); } /* Is the region suitable for relocating the multiboot modules? */ diff --git a/xen/arch/x86/x86_64/asm-offsets.c b/xen/arch/x86/x86_64/asm-offsets.c index b2b59f1..836fed3 100644 --- a/xen/arch/x86/x86_64/asm-offsets.c +++ b/xen/arch/x86/x86_64/asm-offsets.c @@ -178,5 +178,8 @@ void __dummy__(void) OFFSET(MB2_efi64_ih, multiboot2_tag_efi64_ih_t, pointer); BLANK(); + DEFINE(l2_identmap_sizeof, sizeof(l2_identmap)); + BLANK(); + OFFSET(DOMAIN_vm_assist, struct domain, vm_assist); } diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index af7d3e8..a54fdd1 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -288,7 +288,7 @@ extern root_pgentry_t idle_pg_table[ROOT_PAGETABLE_ENTRIES]; extern l2_pgentry_t *compat_idle_pg_table_l2; extern unsigned int m2p_compat_vstart; extern l2_pgentry_t l2_xenmap[L2_PAGETABLE_ENTRIES], - l2_bootmap[L2_PAGETABLE_ENTRIES]; + l2_bootmap[4*L2_PAGETABLE_ENTRIES]; extern l3_pgentry_t l3_bootmap[L3_PAGETABLE_ENTRIES]; extern l2_pgentry_t l2_identmap[4*L2_PAGETABLE_ENTRIES]; extern l1_pgentry_t l1_fixmap[L1_PAGETABLE_ENTRIES];