8.0-BETA2 not getting my 4Gigs of ram

Jung-uk Kim jkim at FreeBSD.org
Fri Aug 14 16:35:05 UTC 2009


On Friday 14 August 2009 11:01 am, Jung-uk Kim wrote:
> On Friday 14 August 2009 05:31 am, Kostik Belousov wrote:
> > I do agree that the printout is very confusing, and I suspect
> > that our smbios parser has a bug. Contact jkim@, who is the
> > author of r190599, that introduced this behaviour.
>
> So far I got few similar reports but all issues were BIOS bugs, not
> my code.  Except for one ancient board, there were BIOS updates to
> fix the problem.

Please try the attached patch.  I added minimal sanity check.  If it 
is less than realmem, we just fall back to the old way for *i386*.  
FYI, amd64 and i386 used to display different numbers before r190599.  
Since this type of BIOS bug is rare, it should be reasonable 
compromise, IMHO.

Jung-uk Kim
-------------- next part --------------
--- sys/amd64/amd64/machdep.c
+++ sys/amd64/amd64/machdep.c
@@ -235,19 +235,21 @@ cpu_startup(dummy)
 #ifdef PERFMON
 	perfmon_init();
 #endif
+	realmem = Maxmem;
+
+	/*
+	 * Display physical memory if SMBIOS reports reasonable amount.
+	 */
+	memsize = 0;
 	sysenv = getenv("smbios.memory.enabled");
 	if (sysenv != NULL) {
-		memsize = (uintmax_t)strtoul(sysenv, (char **)NULL, 10);
+		memsize = (uintmax_t)strtoul(sysenv, (char **)NULL, 10) << 10;
 		freeenv(sysenv);
-	} else
-		memsize = 0;
-	if (memsize > 0)
-		printf("real memory  = %ju (%ju MB)\n", memsize << 10,
-		    memsize >> 10);
-	else
-		printf("real memory  = %ju (%ju MB)\n", ptoa((uintmax_t)Maxmem),
-		    ptoa((uintmax_t)Maxmem) / 1048576);
-	realmem = Maxmem;
+	}
+	if (memsize < realmem)
+		memsize = ptoa((uintmax_t)Maxmem);
+	printf("real memory  = %ju (%ju MB)\n", memsize, memsize >> 20);
+
 	/*
 	 * Display any holes after the first chunk of extended memory.
 	 */
--- sys/i386/i386/machdep.c
+++ sys/i386/i386/machdep.c
@@ -279,19 +279,21 @@ cpu_startup(dummy)
 #ifdef PERFMON
 	perfmon_init();
 #endif
+	realmem = Maxmem;
+
+	/*
+	 * Display physical memory if SMBIOS reports reasonable amount.
+	 */
+	memsize = 0;
 	sysenv = getenv("smbios.memory.enabled");
 	if (sysenv != NULL) {
-		memsize = (uintmax_t)strtoul(sysenv, (char **)NULL, 10);
+		memsize = (uintmax_t)strtoul(sysenv, (char **)NULL, 10) << 10;
 		freeenv(sysenv);
-	} else
-		memsize = 0;
-	if (memsize > 0)
-		printf("real memory  = %ju (%ju MB)\n", memsize << 10,
-		    memsize >> 10);
-	else
-		printf("real memory  = %ju (%ju MB)\n", ptoa((uintmax_t)Maxmem),
-		    ptoa((uintmax_t)Maxmem) / 1048576);
-	realmem = Maxmem;
+	}
+	if (memsize < realmem)
+		memsize = ptoa((uintmax_t)Maxmem);
+	printf("real memory  = %ju (%ju MB)\n", memsize, memsize >> 20);
+
 	/*
 	 * Display any holes after the first chunk of extended memory.
 	 */


More information about the freebsd-amd64 mailing list