Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Nov 2010 13:04:26 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214676 - head/sys/x86/x86
Message-ID:  <201011021304.oA2D4QEB047493@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Tue Nov  2 13:04:25 2010
New Revision: 214676
URL: http://svn.freebsd.org/changeset/base/214676

Log:
  Skip SMAP regions above 4GB on i386 since they will not fit into a long.
  While here, update some comments to better explain the new code flow.
  
  Tested by:	dhw

Modified:
  head/sys/x86/x86/nexus.c

Modified: head/sys/x86/x86/nexus.c
==============================================================================
--- head/sys/x86/x86/nexus.c	Tue Nov  2 13:00:56 2010	(r214675)
+++ head/sys/x86/x86/nexus.c	Tue Nov  2 13:04:25 2010	(r214676)
@@ -694,15 +694,24 @@ ram_attach(device_t dev)
 			if (smap->type != SMAP_TYPE_MEMORY ||
 			    smap->length == 0)
 				continue;
+#ifdef __i386__
+			/*
+			 * Resources use long's to track resources, so
+			 * we can't include memory regions above 4GB.
+			 */
+			if (smap->base >= ~0ul)
+				break;
+#endif
 			error = bus_set_resource(dev, SYS_RES_MEMORY, rid,
 			    smap->base, smap->length);
 			if (error)
-			panic("ram_attach: resource %d failed set with %d",
+				panic(
+				    "ram_attach: resource %d failed set with %d",
 				    rid, error);
 			res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
 			    0);
 			if (res == NULL)
-			panic("ram_attach: resource %d failed to attach",
+				panic("ram_attach: resource %d failed to attach",
 				    rid);
 			rid++;
 		}
@@ -710,19 +719,17 @@ ram_attach(device_t dev)
 	}
 
 	/*
-	 * We use the dump_avail[] array rather than phys_avail[] for
-	 * the memory map as phys_avail[] contains holes for kernel
-	 * memory, page 0, the message buffer, and the dcons buffer.
-	 * We test the end address in the loop instead of the start
-	 * since the start address for the first segment is 0.
-	 *
-	 * XXX: It would be preferable to use the SMAP if it exists
-	 * instead since if the SMAP is very fragmented we may not
-	 * include some memory regions in dump_avail[] and phys_avail[].
+	 * If the system map is not available, fall back to using
+	 * dump_avail[].  We use the dump_avail[] array rather than
+	 * phys_avail[] for the memory map as phys_avail[] contains
+	 * holes for kernel memory, page 0, the message buffer, and
+	 * the dcons buffer.  We test the end address in the loop
+	 * instead of the start since the start address for the first
+	 * segment is 0.
 	 */
 	for (i = 0, p = dump_avail; p[1] != 0; i++, p += 2) {
 		rid = i;
-#ifdef PAE
+#ifdef __i386__
 		/*
 		 * Resources use long's to track resources, so we can't
 		 * include memory regions above 4GB.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011021304.oA2D4QEB047493>