diff mbox series

[v2,4/5] mips: Make sure dt memory regions are valid

Message ID 20190503175041.7949-5-fancer.lancer@gmail.com (mailing list archive)
State Accepted
Headers show
Series mips: Post-bootmem-memblock transition fixes | expand

Commit Message

Serge Semin May 3, 2019, 5:50 p.m. UTC
There are situations when memory regions coming from dts may be
too big for the platform physical address space. This especially
concerns XPA-capable systems. Bootloader may determine more than 4GB
memory available and pass it to the kernel over dts memory node, while
kernel is built without XPA/64BIT support. In this case the region
may either simply be truncated by add_memory_region() method
or by u64->phys_addr_t type casting. But in worst case the method
can even drop the memory region if it exceeds PHYS_ADDR_MAX size.
So lets make sure the retrieved from dts memory regions are valid,
and if some of them aren't, just manually truncate them with a warning
printed out.

Signed-off-by: Serge Semin <fancer.lancer@gmail.com>
---
 arch/mips/kernel/prom.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

Comments

Paul Burton May 6, 2019, 7:12 p.m. UTC | #1
Hello,

Serge Semin wrote:
> There are situations when memory regions coming from dts may be
> too big for the platform physical address space. This especially
> concerns XPA-capable systems. Bootloader may determine more than 4GB
> memory available and pass it to the kernel over dts memory node, while
> kernel is built without XPA/64BIT support. In this case the region
> may either simply be truncated by add_memory_region() method
> or by u64->phys_addr_t type casting. But in worst case the method
> can even drop the memory region if it exceeds PHYS_ADDR_MAX size.
> So lets make sure the retrieved from dts memory regions are valid,
> and if some of them aren't, just manually truncate them with a warning
> printed out.
> 
> Signed-off-by: Serge Semin <fancer.lancer@gmail.com>

Applied to mips-next.

Thanks,
    Paul

[ This message was auto-generated; if you believe anything is incorrect
  then please email paul.burton@mips.com to report it. ]
diff mbox series

Patch

diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c
index 437a174e3ef9..28bf01961bb2 100644
--- a/arch/mips/kernel/prom.c
+++ b/arch/mips/kernel/prom.c
@@ -41,7 +41,19 @@  char *mips_get_machine_name(void)
 #ifdef CONFIG_USE_OF
 void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 {
-	return add_memory_region(base, size, BOOT_MEM_RAM);
+	if (base >= PHYS_ADDR_MAX) {
+		pr_warn("Trying to add an invalid memory region, skipped\n");
+		return;
+	}
+
+	/* Truncate the passed memory region instead of type casting */
+	if (base + size - 1 >= PHYS_ADDR_MAX || base + size < base) {
+		pr_warn("Truncate memory region %llx @ %llx to size %llx\n",
+			size, base, PHYS_ADDR_MAX - base);
+		size = PHYS_ADDR_MAX - base;
+	}
+
+	add_memory_region(base, size, BOOT_MEM_RAM);
 }
 
 int __init early_init_dt_reserve_memory_arch(phys_addr_t base,