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>