diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2008-10-09 19:04:19 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2008-10-09 19:04:19 +0000 |
commit | 9594b8260b35e1cc7cfa14ce58e92388881e95f6 (patch) | |
tree | 5a8712c9f4c840f1b6191743484fe25e5d806b5c | |
parent | a380e96290d8cc7f60fb2d23afd14098e1908852 (diff) |
Skip memory areas smaller than 1 MB above the 16 MB boundary to deal with
buggy ACP BIOSes. Based on a diff from weingart@.
ok deraadt@, oga@
-rw-r--r-- | sys/arch/amd64/amd64/machdep.c | 13 | ||||
-rw-r--r-- | sys/arch/i386/i386/machdep.c | 19 |
2 files changed, 23 insertions, 9 deletions
diff --git a/sys/arch/amd64/amd64/machdep.c b/sys/arch/amd64/amd64/machdep.c index b87d7509213..418903872c9 100644 --- a/sys/arch/amd64/amd64/machdep.c +++ b/sys/arch/amd64/amd64/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.83 2008/10/06 21:05:56 kettenis Exp $ */ +/* $OpenBSD: machdep.c,v 1.84 2008/10/09 19:04:18 kettenis Exp $ */ /* $NetBSD: machdep.c,v 1.3 2003/05/07 22:58:18 fvdl Exp $ */ /*- @@ -1305,6 +1305,17 @@ init_x86_64(paddr_t first_avail) e1 = trunc_page(bmp->addr + bmp->size); s2 = e2 = 0; s3 = e3 = 0; s4 = e4 = 0; + /* + * XXX Some buggy ACPI BIOSes use memory that they + * declare as free. Typically the affected memory + * areas are small blocks between areas reserved for + * ACPI and other BIOS goo. So skip areas smaller + * than 1 MB above the 16 MB boundary (to avoid + * affecting legacy stuff). + */ + if (s1 > 16*1024*1024 && (e1 - s1) < 1*1024*1024) + continue; + /* Check and adjust our segment(s) */ /* Nuke page zero */ if (s1 < avail_start) { diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c index 87e091c6ec0..80b7c6f392b 100644 --- a/sys/arch/i386/i386/machdep.c +++ b/sys/arch/i386/i386/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.436 2008/10/06 19:46:21 kettenis Exp $ */ +/* $OpenBSD: machdep.c,v 1.437 2008/10/09 19:04:18 kettenis Exp $ */ /* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */ /*- @@ -3005,8 +3005,8 @@ init386(paddr_t first_avail) if (a < 8 * NBPG) a = 8 * NBPG; - /* skip regions which are zero or negative in size */ - if (a >= e) { + /* skip shorter than page regions */ + if (a >= e || (e - a) < NBPG) { #ifdef DEBUG printf("-S"); #endif @@ -3014,12 +3014,15 @@ init386(paddr_t first_avail) } /* - * XXX - This is a hack to work around BIOS bugs and - * a bug in the msgbuf allocation. We skip regions - * smaller than the message buffer or 16-bit segment - * limit in size. + * XXX Some buggy ACPI BIOSes use memory that + * they declare as free. Typically the + * affected memory areas are small blocks + * between areas reserved for ACPI and other + * BIOS goo. So skip areas smaller than 1 MB + * above the 16 MB boundary (to avoid + * affecting legacy stuff). */ - if ((e - a) < max((MSGBUFSIZE / NBPG), (64 * 1024))) { + if (a > 16*1024*1024 && (e - a) < 1*1024*1024) { #ifdef DEBUG printf("-X"); #endif |