svn commit: r196412 - in head/sys: amd64/amd64 i386/i386
Jung-uk Kim
jkim at FreeBSD.org
Thu Aug 20 22:58:06 UTC 2009
Author: jkim
Date: Thu Aug 20 22:58:05 2009
New Revision: 196412
URL: http://svn.freebsd.org/changeset/base/196412
Log:
Check whether the SMBIOS reports reasonable amount of memory. If it is
less than "avail memory", fall back to Maxmem to avoid user confusion.
We use SMBIOS information to display "real memory" since r190599 but
some broken SMBIOS implementation reported only half of actual memory.
Tested by: bz
Approved by: re (kib)
Modified:
head/sys/amd64/amd64/machdep.c
head/sys/i386/i386/machdep.c
Modified: head/sys/amd64/amd64/machdep.c
==============================================================================
--- head/sys/amd64/amd64/machdep.c Thu Aug 20 22:56:29 2009 (r196411)
+++ head/sys/amd64/amd64/machdep.c Thu Aug 20 22:58:05 2009 (r196412)
@@ -236,19 +236,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 < ptoa((uintmax_t)cnt.v_free_count))
+ 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.
*/
Modified: head/sys/i386/i386/machdep.c
==============================================================================
--- head/sys/i386/i386/machdep.c Thu Aug 20 22:56:29 2009 (r196411)
+++ head/sys/i386/i386/machdep.c Thu Aug 20 22:58:05 2009 (r196412)
@@ -280,19 +280,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 < ptoa((uintmax_t)cnt.v_free_count))
+ 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 svn-src-head
mailing list