Instead of hackish manual parsing Requires earlier i386 patchkit, but also fixes i386 early_printk again. I removed some obsolete really early parameters which didn't do anything useful. Also made a few parameters that needed it early (mostly oops printing setup) Also removed one panic check that wasn't visible without early console anyways (the early console is now initialized after that panic) This cleans up a lot of code. Signed-off-by: Andi Kleen <ak@suse.de>
88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
/*
|
|
* linux/arch/x86_64/kernel/head64.c -- prepare to run common code
|
|
*
|
|
* Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/linkage.h>
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/string.h>
|
|
#include <linux/percpu.h>
|
|
|
|
#include <asm/processor.h>
|
|
#include <asm/proto.h>
|
|
#include <asm/smp.h>
|
|
#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)
|
|
{
|
|
memset(__bss_start, 0,
|
|
(unsigned long) __bss_stop - (unsigned long) __bss_start);
|
|
}
|
|
|
|
#define NEW_CL_POINTER 0x228 /* Relative to real mode data */
|
|
#define OLD_CL_MAGIC_ADDR 0x90020
|
|
#define OLD_CL_MAGIC 0xA33F
|
|
#define OLD_CL_BASE_ADDR 0x90000
|
|
#define OLD_CL_OFFSET 0x90022
|
|
|
|
extern char saved_command_line[];
|
|
|
|
static void __init copy_bootdata(char *real_mode_data)
|
|
{
|
|
int new_data;
|
|
char * command_line;
|
|
|
|
memcpy(x86_boot_params, real_mode_data, BOOT_PARAM_SIZE);
|
|
new_data = *(int *) (x86_boot_params + NEW_CL_POINTER);
|
|
if (!new_data) {
|
|
if (OLD_CL_MAGIC != * (u16 *) OLD_CL_MAGIC_ADDR) {
|
|
printk("so old bootloader that it does not support commandline?!\n");
|
|
return;
|
|
}
|
|
new_data = OLD_CL_BASE_ADDR + * (u16 *) OLD_CL_OFFSET;
|
|
printk("old bootloader convention, maybe loadlin?\n");
|
|
}
|
|
command_line = (char *) ((u64)(new_data));
|
|
memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
|
|
printk("Bootdata ok (command line is %s)\n", saved_command_line);
|
|
}
|
|
|
|
void __init x86_64_start_kernel(char * real_mode_data)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 256; i++)
|
|
set_intr_gate(i, early_idt_handler);
|
|
asm volatile("lidt %0" :: "m" (idt_descr));
|
|
clear_bss();
|
|
|
|
/*
|
|
* This must be called really, really early:
|
|
*/
|
|
lockdep_init();
|
|
|
|
/*
|
|
* 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
|
|
cpu_set(0, cpu_online_map);
|
|
#endif
|
|
start_kernel();
|
|
}
|