diff options
Diffstat (limited to 'arch/x86/kernel/setup.c')
| -rw-r--r-- | arch/x86/kernel/setup.c | 27 | 
1 files changed, 20 insertions, 7 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 468e98dfd44..ca45696f30f 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -921,18 +921,19 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_X86_64  	if (max_pfn > max_low_pfn) {  		int i; -		for (i = 0; i < e820.nr_map; i++) { -			struct e820entry *ei = &e820.map[i]; +		unsigned long start, end; +		unsigned long start_pfn, end_pfn; -			if (ei->addr + ei->size <= 1UL << 32) -				continue; +		for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, +							 NULL) { -			if (ei->type == E820_RESERVED) +			end = PFN_PHYS(end_pfn); +			if (end <= (1UL<<32))  				continue; +			start = PFN_PHYS(start_pfn);  			max_pfn_mapped = init_memory_mapping( -				ei->addr < 1UL << 32 ? 1UL << 32 : ei->addr, -				ei->addr + ei->size); +						max((1UL<<32), start), end);  		}  		/* can we preseve max_low_pfn ?*/ @@ -1048,6 +1049,18 @@ void __init setup_arch(char **cmdline_p)  	arch_init_ideal_nops();  	register_refined_jiffies(CLOCK_TICK_RATE); + +#ifdef CONFIG_EFI +	/* Once setup is done above, disable efi_enabled on mismatched +	 * firmware/kernel archtectures since there is no support for +	 * runtime services. +	 */ +	if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) { +		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); +		efi_unmap_memmap(); +		efi_enabled = 0; +	} +#endif  }  #ifdef CONFIG_X86_32  |