diff options
| -rw-r--r-- | arch/x86/kernel/head_32.S | 43 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux_32.lds.S | 6 | 
2 files changed, 20 insertions, 29 deletions
| diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 9e89f2a14b90..c79741cfb078 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -41,41 +41,28 @@   * This is how much memory *in addition to the memory covered up to   * and including _end* we need mapped initially.   * We need: - *  - one bit for each possible page, but only in low memory, which means - *     2^32/4096/8 = 128K worst case (4G/4G split.) - *  - enough space to map all low memory, which means - *     (2^32/4096) / 1024 pages (worst case, non PAE) - *     (2^32/4096) / 512 + 4 pages (worst case for PAE) - *  - a few pages for allocator use before the kernel pagetable has - *     been set up + *     (KERNEL_IMAGE_SIZE/4096) / 1024 pages (worst case, non PAE) + *     (KERNEL_IMAGE_SIZE/4096) / 512 + 4 pages (worst case for PAE)   *   * Modulo rounding, each megabyte assigned here requires a kilobyte of   * memory, which is currently unreclaimed.   *   * This should be a multiple of a page. + * + * KERNEL_IMAGE_SIZE should be greater than pa(_end) + * and small than max_low_pfn, otherwise will waste some page table entries   */  LOW_PAGES = (KERNEL_IMAGE_SIZE + PAGE_SIZE_asm - 1)>>PAGE_SHIFT -/* - * To preserve the DMA pool in PAGEALLOC kernels, we'll allocate - * pagetables from above the 16MB DMA limit, so we'll have to set - * up pagetables 16MB more (worst-case): - */ -#ifdef CONFIG_DEBUG_PAGEALLOC -LOW_PAGES = LOW_PAGES + 0x1000000 -#endif -  #if PTRS_PER_PMD > 1  PAGE_TABLE_SIZE = (LOW_PAGES / PTRS_PER_PMD) + PTRS_PER_PGD  #else  PAGE_TABLE_SIZE = (LOW_PAGES / PTRS_PER_PGD)  #endif -BOOTBITMAP_SIZE = LOW_PAGES / 8  ALLOCATOR_SLOP = 4 -INIT_MAP_BEYOND_END = BOOTBITMAP_SIZE + (PAGE_TABLE_SIZE + ALLOCATOR_SLOP)*PAGE_SIZE_asm - -RESERVE_BRK(pagetables, PAGE_TABLE_SIZE * PAGE_SIZE) +INIT_MAP_SIZE = (PAGE_TABLE_SIZE + ALLOCATOR_SLOP) * PAGE_SIZE_asm +RESERVE_BRK(pagetables, INIT_MAP_SIZE)  /*   * 32-bit kernel entrypoint; only used by the boot CPU.  On entry, @@ -168,10 +155,10 @@ num_subarch_entries = (. - subarch_entries) / 4  /*   * Initialize page tables.  This creates a PDE and a set of page - * tables, which are located immediately beyond _end.  The variable + * tables, which are located immediately beyond __brk_base.  The variable   * _brk_end is set up to point to the first "safe" location.   * Mappings are created both at virtual address 0 (identity mapping) - * and PAGE_OFFSET for up to _end+sizeof(page tables)+INIT_MAP_BEYOND_END. + * and PAGE_OFFSET for up to _end.   *   * Note that the stack is not yet set up!   */ @@ -210,10 +197,9 @@ default_entry:  	loop 11b  	/* -	 * End condition: we must map up to and including INIT_MAP_BEYOND_END -	 * bytes beyond the end of our own page tables. +	 * End condition: we must map up to the end.  	 */ -	leal (INIT_MAP_BEYOND_END+PTE_IDENT_ATTR)(%edi),%ebp +	movl $pa(_end) + PTE_IDENT_ATTR, %ebp  	cmpl %ebp,%eax  	jb 10b  1: @@ -243,11 +229,9 @@ page_pde_offset = (__PAGE_OFFSET >> 20);  	addl $0x1000,%eax  	loop 11b  	/* -	 * End condition: we must map up to and including INIT_MAP_BEYOND_END -	 * bytes beyond the end of our own page tables; the +0x007 is -	 * the attribute bits +	 * End condition: we must map up to end  	 */ -	leal (INIT_MAP_BEYOND_END+PTE_IDENT_ATTR)(%edi),%ebp +	movl $pa(_end) + PTE_IDENT_ATTR, %ebp  	cmpl %ebp,%eax  	jb 10b  	addl $__PAGE_OFFSET, %edi @@ -638,6 +622,7 @@ swapper_pg_fixmap:  	.fill 1024,4,0  ENTRY(empty_zero_page)  	.fill 4096,1,0 +  /*   * This starts the data section.   */ diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S index a1f28b85fb34..98424f33e077 100644 --- a/arch/x86/kernel/vmlinux_32.lds.S +++ b/arch/x86/kernel/vmlinux_32.lds.S @@ -210,6 +210,12 @@ SECTIONS    DWARF_DEBUG  } +/* + * Build-time check on the image size: + */ +ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), +	"kernel image bigger than KERNEL_IMAGE_SIZE") +  #ifdef CONFIG_KEXEC  /* Link time checks */  #include <asm/kexec.h> | 
