diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-06 21:11:57 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-06 21:11:57 +0200 |
commit | 100193f5b7c6ecd0b6c4142d50d3925b2c5950af (patch) | |
tree | 05dbf1ace4fa78293b5f1aa8def90aa32574d172 /drivers/of | |
parent | Merge tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/j... (diff) | |
parent | of: Check for phys_addr_t overflows in early_init_dt_add_memory_arch (diff) | |
download | linux-100193f5b7c6ecd0b6c4142d50d3925b2c5950af.tar.xz linux-100193f5b7c6ecd0b6c4142d50d3925b2c5950af.zip |
Merge tag 'dt-for-linus' of git://git.secretlab.ca/git/linux
Pull devicetree bugfix from Grant Likely:
"Important bug fix for parsing 64-bit addresses on 32-bit platforms.
Without this patch the kernel will try to use memory ranges that
cannot be reached"
* tag 'dt-for-linus' of git://git.secretlab.ca/git/linux:
of: Check for phys_addr_t overflows in early_init_dt_add_memory_arch
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/fdt.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index c4cddf0cd96d..b777d8f46bd5 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -880,6 +880,21 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) const u64 phys_offset = __pa(PAGE_OFFSET); base &= PAGE_MASK; size &= PAGE_MASK; + + if (sizeof(phys_addr_t) < sizeof(u64)) { + if (base > ULONG_MAX) { + pr_warning("Ignoring memory block 0x%llx - 0x%llx\n", + base, base + size); + return; + } + + if (base + size > ULONG_MAX) { + pr_warning("Ignoring memory range 0x%lx - 0x%llx\n", + ULONG_MAX, base + size); + size = ULONG_MAX - base; + } + } + if (base + size < phys_offset) { pr_warning("Ignoring memory block 0x%llx - 0x%llx\n", base, base + size); |