aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/x86/fwcfg.c4
-rw-r--r--lib/x86/fwcfg.h1
-rw-r--r--lib/x86/setup.c7
3 files changed, 12 insertions, 0 deletions
diff --git a/lib/x86/fwcfg.c b/lib/x86/fwcfg.c
index 06ef62c..c2aaf5a 100644
--- a/lib/x86/fwcfg.c
+++ b/lib/x86/fwcfg.c
@@ -28,6 +28,10 @@ static void read_cfg_override(void)
if ((str = getenv("TEST_DEVICE")))
no_test_device = !atol(str);
+ if ((str = getenv("MEMLIMIT")))
+ fw_override[FW_CFG_MAX_RAM] = atol(str) * 1024 * 1024;
+
+
fw_override_done = true;
}
diff --git a/lib/x86/fwcfg.h b/lib/x86/fwcfg.h
index 2f17461..64d4c6e 100644
--- a/lib/x86/fwcfg.h
+++ b/lib/x86/fwcfg.h
@@ -21,6 +21,7 @@
#define FW_CFG_BOOT_MENU 0x0e
#define FW_CFG_MAX_CPUS 0x0f
#define FW_CFG_MAX_ENTRY 0x10
+#define FW_CFG_MAX_RAM 0x11
#define FW_CFG_WRITE_CHANNEL 0x4000
#define FW_CFG_ARCH_LOCAL 0x8000
diff --git a/lib/x86/setup.c b/lib/x86/setup.c
index b5941cd..7befe09 100644
--- a/lib/x86/setup.c
+++ b/lib/x86/setup.c
@@ -66,6 +66,9 @@ void find_highmem(void)
u64 upper_end = bootinfo->mem_upper * 1024ull;
u64 best_start = (uintptr_t) &edata;
u64 best_end = upper_end;
+ u64 max_end = fwcfg_get_u64(FW_CFG_MAX_RAM);
+ if (max_end == 0)
+ max_end = -1ull;
bool found = false;
uintptr_t mmap = bootinfo->mmap_addr;
@@ -79,8 +82,12 @@ void find_highmem(void)
continue;
if (mem->length < best_end - best_start)
continue;
+ if (mem->base_addr >= max_end)
+ continue;
best_start = mem->base_addr;
best_end = mem->base_addr + mem->length;
+ if (best_end > max_end)
+ best_end = max_end;
found = true;
}