diff options
Diffstat (limited to 'arch/x86/kernel/setup.c')
| -rw-r--r-- | arch/x86/kernel/setup.c | 55 | 
1 files changed, 23 insertions, 32 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index b4158439bf6..be5ae80f897 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -112,6 +112,14 @@  #define ARCH_SETUP  #endif +/* + * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. + * The direct mapping extends to max_pfn_mapped, so that we can directly access + * apertures, ACPI and other tables without having to play with fixmaps. + */ +unsigned long max_low_pfn_mapped; +unsigned long max_pfn_mapped; +  RESERVE_BRK(dmi_alloc, 65536);  unsigned int boot_cpu_id __read_mostly; @@ -214,8 +222,8 @@ unsigned long mmu_cr4_features;  unsigned long mmu_cr4_features = X86_CR4_PAE;  #endif -/* Boot loader ID as an integer, for the benefit of proc_dointvec */ -int bootloader_type; +/* Boot loader ID and version as integers, for the benefit of proc_dointvec */ +int bootloader_type, bootloader_version;  /*   * Setup options @@ -293,15 +301,13 @@ static void __init reserve_brk(void)  #ifdef CONFIG_BLK_DEV_INITRD -#ifdef CONFIG_X86_32 -  #define MAX_MAP_CHUNK	(NR_FIX_BTMAPS << PAGE_SHIFT)  static void __init relocate_initrd(void)  {  	u64 ramdisk_image = boot_params.hdr.ramdisk_image;  	u64 ramdisk_size  = boot_params.hdr.ramdisk_size; -	u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT; +	u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;  	u64 ramdisk_here;  	unsigned long slop, clen, mapaddr;  	char *p, *q; @@ -357,14 +363,13 @@ static void __init relocate_initrd(void)  		ramdisk_image, ramdisk_image + ramdisk_size - 1,  		ramdisk_here, ramdisk_here + ramdisk_size - 1);  } -#endif  static void __init reserve_initrd(void)  {  	u64 ramdisk_image = boot_params.hdr.ramdisk_image;  	u64 ramdisk_size  = boot_params.hdr.ramdisk_size;  	u64 ramdisk_end   = ramdisk_image + ramdisk_size; -	u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT; +	u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;  	if (!boot_params.hdr.type_of_loader ||  	    !ramdisk_image || !ramdisk_size) @@ -394,14 +399,8 @@ static void __init reserve_initrd(void)  		return;  	} -#ifdef CONFIG_X86_32  	relocate_initrd(); -#else -	printk(KERN_ERR "initrd extends beyond end of memory " -	       "(0x%08llx > 0x%08llx)\ndisabling initrd\n", -	       ramdisk_end, end_of_lowmem); -	initrd_start = 0; -#endif +  	free_early(ramdisk_image, ramdisk_end);  }  #else @@ -706,6 +705,12 @@ void __init setup_arch(char **cmdline_p)  #endif  	saved_video_mode = boot_params.hdr.vid_mode;  	bootloader_type = boot_params.hdr.type_of_loader; +	if ((bootloader_type >> 4) == 0xe) { +		bootloader_type &= 0xf; +		bootloader_type |= (boot_params.hdr.ext_loader_type+0x10) << 4; +	} +	bootloader_version  = bootloader_type & 0xf; +	bootloader_version |= boot_params.hdr.ext_loader_ver << 4;  #ifdef CONFIG_BLK_DEV_RAM  	rd_image_start = boot_params.hdr.ram_size & RAMDISK_IMAGE_START_MASK; @@ -854,12 +859,16 @@ void __init setup_arch(char **cmdline_p)  		max_low_pfn = max_pfn;  	high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1; +	max_pfn_mapped = KERNEL_IMAGE_SIZE >> PAGE_SHIFT;  #endif  #ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION  	setup_bios_corruption_check();  #endif +	printk(KERN_DEBUG "initial memory mapped : 0 - %08lx\n", +			max_pfn_mapped<<PAGE_SHIFT); +  	reserve_brk();  	/* max_pfn_mapped is updated here */ @@ -997,24 +1006,6 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_X86_32  /** - * x86_quirk_pre_intr_init - initialisation prior to setting up interrupt vectors - * - * Description: - *	Perform any necessary interrupt initialisation prior to setting up - *	the "ordinary" interrupt call gates.  For legacy reasons, the ISA - *	interrupts should be initialised here if the machine emulates a PC - *	in any way. - **/ -void __init x86_quirk_pre_intr_init(void) -{ -	if (x86_quirks->arch_pre_intr_init) { -		if (x86_quirks->arch_pre_intr_init()) -			return; -	} -	init_ISA_irqs(); -} - -/**   * x86_quirk_intr_init - post gate setup interrupt initialisation   *   * Description:  |