]> err.no Git - linux-2.6/commitdiff
x86: extend e820 early_res support 32bit -fix #3
authorYinghai Lu <yhlu.kernel@gmail.com>
Thu, 29 May 2008 19:56:36 +0000 (12:56 -0700)
committerIngo Molnar <mingo@elte.hu>
Sat, 31 May 2008 07:55:47 +0000 (09:55 +0200)
introduce init_pg_table_start, so xen PV could specify the value.

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/head32.c
arch/x86/kernel/head_32.S
arch/x86/kernel/setup_32.c
arch/x86/lguest/boot.c
arch/x86/xen/enlighten.c
include/asm-x86/setup.h

index c216d3c2a991a4236a9598b94d68c763c84fc065..0b6cb9fba71edf83d37083298c32bc85f0981c7f 100644 (file)
@@ -76,7 +76,8 @@ void __init i386_start_kernel(void)
                reserve_early(ramdisk_image, ramdisk_end, "RAMDISK");
        }
 #endif
-       reserve_early(__pa_symbol(&_end), init_pg_tables_end, "INIT_PG_TABLE");
+       reserve_early(init_pg_tables_start, init_pg_tables_end,
+                       "INIT_PG_TABLE");
 
        reserve_ebda_region();
 
index b2cc73768a9daaa5f6e568bd4977f6fea7889d87..bef4618feadbc6020b78a6f230265865cfcd650c 100644 (file)
@@ -194,6 +194,7 @@ default_entry:
        xorl %ebx,%ebx                          /* %ebx is kept at zero */
 
        movl $pa(pg0), %edi
+       movl %edi, pa(init_pg_tables_start)
        movl $pa(swapper_pg_pmd), %edx
        movl $PTE_ATTR, %eax
 10:
@@ -228,6 +229,7 @@ default_entry:
 page_pde_offset = (__PAGE_OFFSET >> 20);
 
        movl $pa(pg0), %edi
+       movl %edi, pa(init_pg_tables_start)
        movl $pa(swapper_pg_dir), %edx
        movl $PTE_ATTR, %eax
 10:
index 08b47a2f7af02c0eeec166db6be5eea7a1c3624d..de9c5ee77d078d43f2395997e4049d6c545ab2bb 100644 (file)
@@ -71,6 +71,7 @@
 /* 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;
 
 /*
@@ -485,6 +486,10 @@ static void __init reserve_initrd(void)
                return;
        }
 
+       printk(KERN_INFO "old RAMDISK: %08llx - %08llx\n", ramdisk_image,
+                       ramdisk_end);
+
+
        if (ramdisk_end <= end_of_lowmem) {
                /* All in lowmem, easy case */
                /*
@@ -511,6 +516,8 @@ static void __init reserve_initrd(void)
                         "NEW RAMDISK");
        initrd_start = ramdisk_here + PAGE_OFFSET;
        initrd_end   = initrd_start + ramdisk_size;
+       printk(KERN_INFO "Allocated new RAMDISK: %08llx - %08llx\n",
+                        ramdisk_here, ramdisk_here + ramdisk_size);
 
        do_relocate_initrd = true;
 }
index af65b2da3ba0dabd19d0e14fcfbb52577ff4c96c..bf7c34a3aaebfcf97bea4bbf748c14ad09d44bae 100644 (file)
@@ -1011,6 +1011,7 @@ __init void lguest_init(void)
         * 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);
 
        /* Load the %fs segment register (the per-cpu segment register) with
@@ -1064,9 +1065,9 @@ __init void lguest_init(void)
        pm_power_off = lguest_power_off;
        machine_ops.restart = lguest_restart;
 
-       /* Now we're set up, call start_kernel() in init/main.c and we proceed
+       /* Now we're set up, call i386_start_kernel() in head32.c and we proceed
         * to boot as normal.  It never returns. */
-       start_kernel();
+       i386_start_kernel();
 }
 /*
  * This marks the end of stage II of our journey, The Guest.
index c8a56e457d61a35c21040bbe91486f9ceb9bf6bf..ccc7b84ddabf6b94962d307aaa8ea253d05cfa86 100644 (file)
@@ -1211,6 +1211,7 @@ asmlinkage void __init xen_start_kernel(void)
 
        pgd = (pgd_t *)xen_start_info->pt_base;
 
+       init_pg_tables_start = __pa(pgd);
        init_pg_tables_end = __pa(pgd) + xen_start_info->nr_pt_frames*PAGE_SIZE;
 
        init_mm.pgd = pgd; /* use the Xen pagetables to start */
@@ -1246,5 +1247,5 @@ asmlinkage void __init xen_start_kernel(void)
                add_preferred_console("hvc", 0, NULL);
 
        /* Start the world */
-       start_kernel();
+       i386_start_kernel();
 }
index ffa0f540fc7fe257ce1754edce819c139353ad41..64f5f0c11d6664888a69b1ce8ce7c950bc91553a 100644 (file)
@@ -59,9 +59,11 @@ int __init copy_e820_map(struct e820entry *biosmap, int nr_map);
 void __init add_memory_region(unsigned long long start,
                              unsigned long long size, int type);
 
-extern unsigned long init_pg_tables_end;
 
+void __init i386_start_kernel(void);
 
+extern unsigned long init_pg_tables_start;
+extern unsigned long init_pg_tables_end;
 
 #endif /* __i386__ */
 #endif /* _SETUP */