diff options
Diffstat (limited to 'arch/arm/kernel/setup.c')
| -rw-r--r-- | arch/arm/kernel/setup.c | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index b91411371ae..ebfac782593 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -523,7 +523,21 @@ int __init arm_add_memory(phys_addr_t start, unsigned long size)  	 */  	size -= start & ~PAGE_MASK;  	bank->start = PAGE_ALIGN(start); -	bank->size  = size & PAGE_MASK; + +#ifndef CONFIG_LPAE +	if (bank->start + size < bank->start) { +		printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in " +			"32-bit physical address space\n", (long long)start); +		/* +		 * To ensure bank->start + bank->size is representable in +		 * 32 bits, we use ULONG_MAX as the upper limit rather than 4GB. +		 * This means we lose a page after masking. +		 */ +		size = ULONG_MAX - bank->start; +	} +#endif + +	bank->size = size & PAGE_MASK;  	/*  	 * Check whether this memory region has non-zero size or  |