Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / x86_64 / kernel / head64.c
index 0f8c78d..cea20a6 100644 (file)
 #include <asm/bootsetup.h>
 #include <asm/setup.h>
 #include <asm/desc.h>
+#include <asm/pgtable.h>
+#include <asm/sections.h>
 
 /* Don't add a printk in there. printk relies on the PDA which is not initialized 
    yet. */
 static void __init clear_bss(void)
 {
-       extern char __bss_start[], __bss_end[];
        memset(__bss_start, 0,
-              (unsigned long) __bss_end - (unsigned long) __bss_start);
+              (unsigned long) __bss_stop - (unsigned long) __bss_start);
 }
 
 #define NEW_CL_POINTER         0x228   /* Relative to real mode data */
@@ -75,8 +76,6 @@ static void __init setup_boot_cpu_data(void)
        boot_cpu_data.x86_mask = eax & 0xf;
 }
 
-extern char _end[];
-
 void __init x86_64_start_kernel(char * real_mode_data)
 {
        char *s;
@@ -86,6 +85,16 @@ void __init x86_64_start_kernel(char * real_mode_data)
                set_intr_gate(i, early_idt_handler);
        asm volatile("lidt %0" :: "m" (idt_descr));
        clear_bss();
+
+       /*
+        * switch to init_level4_pgt from boot_level4_pgt
+        */
+       memcpy(init_level4_pgt, boot_level4_pgt, PTRS_PER_PGD*sizeof(pgd_t));
+       asm volatile("movq %0,%%cr3" :: "r" (__pa_symbol(&init_level4_pgt)));
+
+       for (i = 0; i < NR_CPUS; i++)
+               cpu_pda(i) = &boot_cpu_pda[i];
+
        pda_init(0);
        copy_bootdata(real_mode_data);
 #ifdef CONFIG_SMP
@@ -93,8 +102,8 @@ void __init x86_64_start_kernel(char * real_mode_data)
 #endif
        s = strstr(saved_command_line, "earlyprintk=");
        if (s != NULL)
-               setup_early_printk(s);
-#ifdef CONFIG_DISCONTIGMEM
+               setup_early_printk(strchr(s, '=') + 1);
+#ifdef CONFIG_NUMA
        s = strstr(saved_command_line, "numa=");
        if (s != NULL)
                numa_setup(s+5);