Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

of: Fix truncation of memory sizes on 32-bit platforms

Variable "size" has type "phys_addr_t", which can be either 32-bit or
64-bit on 32-bit systems, while "unsigned long" is always 32-bit on
32-bit systems. Hence the cast in

(unsigned long)size / SZ_1M

may truncate a 64-bit size to 32-bit, as casts have a higher operator
precedence than divisions.

Fix this by inverting the order of the cast and division, which should
be safe for memory blocks smaller than 4 PiB. Note that the division is
actually a shift, as SZ_1M is a power-of-two constant, hence there is no
need to use div_u64().

While at it, use "%lu" to format "unsigned long".

Fixes: e8d9d1f5485b52ec ("drivers: of: add initialization code for static reserved memory")
Fixes: 3f0c8206644836e4 ("drivers: of: add initialization code for dynamic reserved memory")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/4a1117e72d13d26126f57be034c20dac02f1e915.1623835273.git.geert+renesas@glider.be
Signed-off-by: Rob Herring <robh@kernel.org>

authored by

Geert Uytterhoeven and committed by
Rob Herring
2892d8a0 90b8cadf

+8 -8
+4 -4
drivers/of/fdt.c
··· 510 510 511 511 if (size && 512 512 early_init_dt_reserve_memory_arch(base, size, nomap) == 0) 513 - pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %ld MiB\n", 514 - uname, &base, (unsigned long)size / SZ_1M); 513 + pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", 514 + uname, &base, (unsigned long)(size / SZ_1M)); 515 515 else 516 - pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %ld MiB\n", 517 - uname, &base, (unsigned long)size / SZ_1M); 516 + pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n", 517 + uname, &base, (unsigned long)(size / SZ_1M)); 518 518 519 519 len -= t_len; 520 520 if (first) {
+4 -4
drivers/of/of_reserved_mem.c
··· 136 136 ret = early_init_dt_alloc_reserved_memory_arch(size, 137 137 align, start, end, nomap, &base); 138 138 if (ret == 0) { 139 - pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n", 139 + pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", 140 140 uname, &base, 141 - (unsigned long)size / SZ_1M); 141 + (unsigned long)(size / SZ_1M)); 142 142 break; 143 143 } 144 144 len -= t_len; ··· 148 148 ret = early_init_dt_alloc_reserved_memory_arch(size, align, 149 149 0, 0, nomap, &base); 150 150 if (ret == 0) 151 - pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n", 152 - uname, &base, (unsigned long)size / SZ_1M); 151 + pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n", 152 + uname, &base, (unsigned long)(size / SZ_1M)); 153 153 } 154 154 155 155 if (base == 0) {