+// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright 2004
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
+#include <init.h>
+#include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR;
long get_ram_size(long *base, long maxsize)
{
volatile long *addr;
- long save[31];
+ long save[BITS_PER_LONG - 1];
long save_base;
long cnt;
long val;
phys_size_t __weak get_effective_memsize(void)
{
-#ifndef CONFIG_VERY_BIG_RAM
- return gd->ram_size;
+ phys_size_t ram_size = gd->ram_size;
+
+ /*
+ * Check for overflow and limit ram size to some representable value.
+ * It is required that ram_base + ram_size must be representable by
+ * phys_size_t type and must be aligned by direct access, therefore
+ * calculate it from last 4kB sector which should work as alignment
+ * on any platform.
+ */
+ if (gd->ram_base + ram_size < gd->ram_base)
+ ram_size = ((phys_size_t)~0xfffULL) - gd->ram_base;
+
+#ifndef CONFIG_MAX_MEM_MAPPED
+ return ram_size;
#else
/* limit stack to what we can reasonable map */
- return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ?
- CONFIG_MAX_MEM_MAPPED : gd->ram_size);
+ return ((ram_size > CONFIG_MAX_MEM_MAPPED) ?
+ CONFIG_MAX_MEM_MAPPED : ram_size);
#endif
}