diff options
Diffstat (limited to 'arch/x86/mm/ioremap.c')
| -rw-r--r-- | arch/x86/mm/ioremap.c | 31 | 
1 files changed, 24 insertions, 7 deletions
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 2b2bb3f9b68..a78ffef62a2 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -23,18 +23,26 @@  #ifdef CONFIG_X86_64 -unsigned long __phys_addr(unsigned long x) +static inline int phys_addr_valid(unsigned long addr)  { -	if (x >= __START_KERNEL_map) -		return x - __START_KERNEL_map + phys_base; -	return x - PAGE_OFFSET; +	return addr < (1UL << boot_cpu_data.x86_phys_bits);  } -EXPORT_SYMBOL(__phys_addr); -static inline int phys_addr_valid(unsigned long addr) +unsigned long __phys_addr(unsigned long x)  { -	return addr < (1UL << boot_cpu_data.x86_phys_bits); +	if (x >= __START_KERNEL_map) { +		x -= __START_KERNEL_map; +		VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE); +		x += phys_base; +	} else { +		VIRTUAL_BUG_ON(x < PAGE_OFFSET); +		x -= PAGE_OFFSET; +		VIRTUAL_BUG_ON(system_state == SYSTEM_BOOTING ? x > MAXMEM : +					!phys_addr_valid(x)); +	} +	return x;  } +EXPORT_SYMBOL(__phys_addr);  #else @@ -43,6 +51,15 @@ static inline int phys_addr_valid(unsigned long addr)  	return 1;  } +unsigned long __phys_addr(unsigned long x) +{ +	/* VMALLOC_* aren't constants; not available at the boot time */ +	VIRTUAL_BUG_ON(x < PAGE_OFFSET || (system_state != SYSTEM_BOOTING && +					is_vmalloc_addr((void *)x))); +	return x - PAGE_OFFSET; +} +EXPORT_SYMBOL(__phys_addr); +  #endif  int page_is_ram(unsigned long pagenr)  |