aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/e820map.c15
-rw-r--r--src/e820map.h1
-rw-r--r--src/fw/pciinit.c2
3 files changed, 18 insertions, 0 deletions
diff --git a/src/e820map.c b/src/e820map.c
index 39445cf..c761e5e 100644
--- a/src/e820map.c
+++ b/src/e820map.c
@@ -150,3 +150,18 @@ e820_prepboot(void)
{
dump_map();
}
+
+int
+e820_is_used(u64 start, u64 size)
+{
+ int i;
+ for (i=0; i<e820_count; i++) {
+ struct e820entry *e = &e820_list[i];
+ if (start + size <= e->start)
+ continue;
+ if (start >= e->start + e->size)
+ continue;
+ return 1;
+ }
+ return 0;
+}
diff --git a/src/e820map.h b/src/e820map.h
index de8b523..07ce16e 100644
--- a/src/e820map.h
+++ b/src/e820map.h
@@ -18,6 +18,7 @@ struct e820entry {
void e820_add(u64 start, u64 size, u32 type);
void e820_remove(u64 start, u64 size);
void e820_prepboot(void);
+int e820_is_used(u64 start, u64 size);
// e820 map storage
extern struct e820entry e820_list[];
diff --git a/src/fw/pciinit.c b/src/fw/pciinit.c
index b52bd1d..c7084f5 100644
--- a/src/fw/pciinit.c
+++ b/src/fw/pciinit.c
@@ -1140,6 +1140,8 @@ static void pci_bios_map_devices(struct pci_bus *busses)
if (r64_mem.base < top - size) {
r64_mem.base = top - size;
}
+ if (e820_is_used(r64_mem.base, size))
+ r64_mem.base -= size;
}
r64_mem.base = ALIGN(r64_mem.base, align_mem);
r64_mem.base = ALIGN(r64_mem.base, (1LL<<30)); // 1G hugepage