aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2023-04-21 12:42:51 +0200
committerGerd Hoffmann <kraxel@redhat.com>2023-08-24 10:56:21 +0200
commit1e1da7a963007d03a4e0e9a9e0ff17990bb1608d (patch)
treec08db7a8850bec6e0323e2dc0ec57430461f176f
parentecc51f211f3edd4fcc79d38af56cf84283e4d8b1 (diff)
downloadseabios-1e1da7a963007d03a4e0e9a9e0ff17990bb1608d.zip
seabios-1e1da7a963007d03a4e0e9a9e0ff17990bb1608d.tar.gz
seabios-1e1da7a963007d03a4e0e9a9e0ff17990bb1608d.tar.bz2
check for e820 conflict
Add support to check for overlaps with e820 entries. In case the 64bit pci io window has conflicts move it down. The only known case where this happens is AMD processors with 1TB address space which has some space just below 1TB reserved for HT. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-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