diff options
-rw-r--r-- | src/e820map.c | 15 | ||||
-rw-r--r-- | src/e820map.h | 1 | ||||
-rw-r--r-- | src/fw/pciinit.c | 2 |
3 files changed, 18 insertions, 0 deletions
diff --git a/src/e820map.c b/src/e820map.c index 39445cf6..c761e5e9 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 de8b5230..07ce16ec 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 b52bd1d5..c7084f5e 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 |