x86-32: use brk segment for allocating initial kernel pagetable
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Fri, 27 Feb 2009 21:27:38 +0000 (13:27 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 15 Mar 2009 00:23:47 +0000 (17:23 -0700)
Impact: use new interface instead of previous ad hoc implementation

Rather than having special purpose init_pg_table_start/end variables
to delimit the kernel pagetable built by head_32.S, just use the brk
mechanism to extend the bss for the new pagetable.

This patch removes init_pg_table_start/end and pg0, defines __brk_base
(which is page-aligned and immediately follows _end), initializes
the brk region to start there, and uses it for the 32-bit pagetable.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/include/asm/pgtable_32.h
arch/x86/include/asm/setup.h
arch/x86/kernel/head32.c
arch/x86/kernel/head_32.S
arch/x86/kernel/setup.c
arch/x86/kernel/vmlinux_32.lds.S
arch/x86/lguest/boot.c

index 97612fc..31bd120 100644 (file)
@@ -42,9 +42,6 @@ extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t);
  */
 #undef TEST_ACCESS_OK
 
-/* The boot page tables (all created as a single array) */
-extern unsigned long pg0[];
-
 #ifdef CONFIG_X86_PAE
 # include <asm/pgtable-3level.h>
 #else
index 45454f3..366d366 100644 (file)
@@ -109,9 +109,6 @@ void *extend_brk(size_t size, size_t align);
 void __init i386_start_kernel(void);
 extern void probe_roms(void);
 
-extern unsigned long init_pg_tables_start;
-extern unsigned long init_pg_tables_end;
-
 #else
 void __init x86_64_start_kernel(char *real_mode);
 void __init x86_64_start_reservations(char *real_mode_data);
index 29f1095..3f8579f 100644 (file)
@@ -29,9 +29,6 @@ void __init i386_start_kernel(void)
                reserve_early(ramdisk_image, ramdisk_end, "RAMDISK");
        }
 #endif
-       reserve_early(init_pg_tables_start, init_pg_tables_end,
-                       "INIT_PG_TABLE");
-
        reserve_ebda_region();
 
        /*
index c32ca19..db66527 100644 (file)
@@ -167,7 +167,7 @@ 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
- * init_pg_tables_end is set up to point to the first "safe" location.
+ * _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.
  *
@@ -190,8 +190,7 @@ default_entry:
 
        xorl %ebx,%ebx                          /* %ebx is kept at zero */
 
-       movl $pa(pg0), %edi
-       movl %edi, pa(init_pg_tables_start)
+       movl $pa(__brk_base), %edi
        movl $pa(swapper_pg_pmd), %edx
        movl $PTE_IDENT_ATTR, %eax
 10:
@@ -216,7 +215,8 @@ default_entry:
        cmpl %ebp,%eax
        jb 10b
 1:
-       movl %edi,pa(init_pg_tables_end)
+       addl $__PAGE_OFFSET, %edi
+       movl %edi, pa(_brk_end)
        shrl $12, %eax
        movl %eax, pa(max_pfn_mapped)
 
@@ -227,8 +227,7 @@ default_entry:
 
 page_pde_offset = (__PAGE_OFFSET >> 20);
 
-       movl $pa(pg0), %edi
-       movl %edi, pa(init_pg_tables_start)
+       movl $pa(__brk_base), %edi
        movl $pa(swapper_pg_dir), %edx
        movl $PTE_IDENT_ATTR, %eax
 10:
@@ -249,7 +248,8 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
        leal (INIT_MAP_BEYOND_END+PTE_IDENT_ATTR)(%edi),%ebp
        cmpl %ebp,%eax
        jb 10b
-       movl %edi,pa(init_pg_tables_end)
+       addl $__PAGE_OFFSET, %edi
+       movl %edi, pa(_brk_end)
        shrl $12, %eax
        movl %eax, pa(max_pfn_mapped)
 
index b832902..3ac2aa7 100644 (file)
@@ -161,12 +161,6 @@ static struct resource bss_resource = {
 
 
 #ifdef CONFIG_X86_32
-/* This value is set up by the early boot code to point to the value
-   immediately after the boot time page tables.  It contains a *physical*
-   address, and must not be in the .bss segment! */
-unsigned long init_pg_tables_start __initdata = ~0UL;
-unsigned long init_pg_tables_end __initdata = ~0UL;
-
 static struct resource video_ram_resource = {
        .name   = "Video RAM area",
        .start  = 0xa0000,
index 27e44aa..1063fbe 100644 (file)
@@ -196,10 +196,6 @@ SECTIONS
        __brk_limit = . ;
 
        _end = . ;
-
-       /* This is where the kernel creates the early boot page tables */
-       . = ALIGN(PAGE_SIZE);
-       pg0 = . ;
   }
 
   /* Sections to be discarded */
index 9fe4dda..90e44a1 100644 (file)
@@ -1058,14 +1058,6 @@ __init void lguest_init(void)
         * lguest_init() where the rest of the fairly chaotic boot setup
         * occurs. */
 
-       /* The native boot code sets up initial page tables immediately after
-        * the kernel itself, and sets init_pg_tables_end so they're not
-        * clobbered.  The Launcher places our initial pagetables somewhere at
-        * the top of our physical memory, so we don't need extra space: set
-        * init_pg_tables_end to the end of the kernel. */
-       init_pg_tables_start = __pa(pg0);
-       init_pg_tables_end = __pa(pg0);
-
        /* As described in head_32.S, we map the first 128M of memory. */
        max_pfn_mapped = (128*1024*1024) >> PAGE_SHIFT;