1 /* 2 * prepare to run common code 3 * 4 * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE 5 */ 6 7 #include <linux/init.h> 8 #include <linux/linkage.h> 9 #include <linux/types.h> 10 #include <linux/kernel.h> 11 #include <linux/string.h> 12 #include <linux/percpu.h> 13 14 #include <asm/processor.h> 15 #include <asm/proto.h> 16 #include <asm/smp.h> 17 #include <asm/setup.h> 18 #include <asm/desc.h> 19 #include <asm/pgtable.h> 20 #include <asm/tlbflush.h> 21 #include <asm/sections.h> 22 23 static void __init zap_identity_mappings(void) 24 { 25 pgd_t *pgd = pgd_offset_k(0UL); 26 pgd_clear(pgd); 27 __flush_tlb(); 28 } 29 30 /* Don't add a printk in there. printk relies on the PDA which is not initialized 31 yet. */ 32 static void __init clear_bss(void) 33 { 34 memset(__bss_start, 0, 35 (unsigned long) __bss_stop - (unsigned long) __bss_start); 36 } 37 38 static void __init copy_bootdata(char *real_mode_data) 39 { 40 char * command_line; 41 42 memcpy(&boot_params, real_mode_data, sizeof boot_params); 43 if (boot_params.hdr.cmd_line_ptr) { 44 command_line = __va(boot_params.hdr.cmd_line_ptr); 45 memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); 46 } 47 } 48 49 void __init x86_64_start_kernel(char * real_mode_data) 50 { 51 int i; 52 53 /* clear bss before set_intr_gate with early_idt_handler */ 54 clear_bss(); 55 56 /* Make NULL pointers segfault */ 57 zap_identity_mappings(); 58 59 for (i = 0; i < IDT_ENTRIES; i++) 60 set_intr_gate(i, early_idt_handler); 61 asm volatile("lidt %0" :: "m" (idt_descr)); 62 63 early_printk("Kernel alive\n"); 64 65 for (i = 0; i < NR_CPUS; i++) 66 cpu_pda(i) = &boot_cpu_pda[i]; 67 68 pda_init(0); 69 copy_bootdata(__va(real_mode_data)); 70 #ifdef CONFIG_SMP 71 cpu_set(0, cpu_online_map); 72 #endif 73 start_kernel(); 74 } 75