Date: Wed, 26 Aug 2009 17:39:40 -0500 (CDT) From: "James R. Van Artsdalen" <james-freebsd-current@jrv.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: amd64/138220: [patch] FreeBSD/amd64 can't see all system memory Message-ID: <200908262239.n7QMdeHV045328@bigtex.housenet.jrv> Resent-Message-ID: <200908262300.n7QN09nO051369@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 138220 >Category: amd64 >Synopsis: [patch] FreeBSD/amd64 can't see all system memory >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-amd64 >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Aug 26 23:00:08 UTC 2009 >Closed-Date: >Last-Modified: >Originator: James R. Van Artsdalen >Release: FreeBSD 9.0-CURRENT amd64 >Organization: >Environment: System: FreeBSD pygmy.housenet.jrv 9.0-CURRENT FreeBSD 9.0-CURRENT #1 r196500M: Wed Aug 26 11:28:43 CDT 2009 james@pygmy.housenet.jrv:/usr/src/sys/amd64/compile/GENERIC amd64 >Description: Two related bugs: 1. FreeBSD erroneously assumes that the BIOS E820 system memory map data is non-descending. The Zotac GF9300-D-E is an example of a system where this is not true. 2. There is a typo in code that detects overlaps in regions reported by E820. No action is in fact taken right now on amd64. i386 may have bug #1 but not #2. With this patch "available memory" goes from 2689 MB to 7605 MB on the Zotac GF9300-D-E. >How-To-Repeat: Boot amd64 on Zotac GF9300-D-E motherboard with 8GB of RAM. Less than 3GB is reported. >Fix: No user fix. The patch sorts smap enteries on the base address and ignores overlapping regions. --- smap.pat begins here --- Index: sys/amd64/amd64/machdep.c =================================================================== --- sys/amd64/amd64/machdep.c (revision 196500) +++ sys/amd64/amd64/machdep.c (working copy) @@ -1236,6 +1236,19 @@ smapend = (struct bios_smap *)((uintptr_t)smapbase + smapsize); for (smap = smapbase; smap < smapend; smap++) { + struct bios_smap *sp, *low = smap; + + for (sp = smap + 1; sp < smapend; sp++) + if (low->base > sp->base) + low = sp; + if (low != smap) { + struct bios_smap ts; + + ts = *smap; + *smap = *low; + *low = ts; + } + if (boothowto & RB_VERBOSE) printf("SMAP type=%02x base=%016lx len=%016lx\n", smap->type, smap->base, smap->length); @@ -1250,10 +1263,12 @@ if (smap->base < physmap[i + 1]) { if (boothowto & RB_VERBOSE) printf( - "Overlapping or non-monotonic memory region, ignoring second region\n"); - continue; + "Overlapping memory region, ignoring second region\n"); + break; } } + if (i <= physmap_idx) + continue; if (smap->base == physmap[physmap_idx + 1]) { physmap[physmap_idx + 1] += smap->length; --- smap.pat ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908262239.n7QMdeHV045328>