diff options
Diffstat (limited to 'arch/x86/kernel/setup.c')
| -rw-r--r-- | arch/x86/kernel/setup.c | 30 | 
1 files changed, 28 insertions, 2 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index a2bb18e0283..ca45696f30f 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -920,8 +920,22 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_X86_64  	if (max_pfn > max_low_pfn) { -		max_pfn_mapped = init_memory_mapping(1UL<<32, -						     max_pfn<<PAGE_SHIFT); +		int i; +		unsigned long start, end; +		unsigned long start_pfn, end_pfn; + +		for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, +							 NULL) { + +			end = PFN_PHYS(end_pfn); +			if (end <= (1UL<<32)) +				continue; + +			start = PFN_PHYS(start_pfn); +			max_pfn_mapped = init_memory_mapping( +						max((1UL<<32), start), end); +		} +  		/* can we preseve max_low_pfn ?*/  		max_low_pfn = max_pfn;  	} @@ -1035,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  |