From owner-svn-src-projects@FreeBSD.ORG Mon May 16 15:19:30 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B90D510656B7; Mon, 16 May 2011 15:19:30 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A86318FC14; Mon, 16 May 2011 15:19:30 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p4GFJUkh087762; Mon, 16 May 2011 15:19:30 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p4GFJUh7087760; Mon, 16 May 2011 15:19:30 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201105161519.p4GFJUh7087760@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 16 May 2011 15:19:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r221987 - projects/pseries/powerpc/ofw X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 May 2011 15:19:30 -0000 Author: nwhitehorn Date: Mon May 16 15:19:30 2011 New Revision: 221987 URL: http://svn.freebsd.org/changeset/base/221987 Log: Correct for some SLOF shenanigans. Modified: projects/pseries/powerpc/ofw/ofw_machdep.c Modified: projects/pseries/powerpc/ofw/ofw_machdep.c ============================================================================== --- projects/pseries/powerpc/ofw/ofw_machdep.c Mon May 16 13:12:09 2011 (r221986) +++ projects/pseries/powerpc/ofw/ofw_machdep.c Mon May 16 15:19:30 2011 (r221987) @@ -63,7 +63,6 @@ __FBSDID("$FreeBSD$"); #define OFMEM_REGIONS 32 static struct mem_region OFmem[OFMEM_REGIONS + 1], OFavail[OFMEM_REGIONS + 3]; static struct mem_region OFfree[OFMEM_REGIONS + 3]; -static int nOFmem; extern register_t ofmsr[5]; static int (*ofwcall)(void *); @@ -269,17 +268,28 @@ ofw_mem_regions(struct mem_region **memp phandle = OF_finddevice("/memory@0"); msz = parse_ofw_memory(phandle, "reg", OFmem); - nOFmem = msz / sizeof(struct mem_region); + msz /= sizeof(struct mem_region); asz = parse_ofw_memory(phandle, "available", OFavail); + asz /= sizeof(struct mem_region); *memp = OFmem; - *memsz = nOFmem; - + *memsz = msz; + + /* + * On some firmwares (SLOF), some memory may be marked available that + * doesn't actually exist. This manifests as an extension of the last + * available segment past the end of physical memory, so truncate that + * one. + */ + if (OFavail[asz - 1].mr_start + OFavail[asz - 1].mr_size > + OFmem[msz - 1].mr_start + OFmem[msz - 1].mr_size) + OFavail[asz - 1].mr_size = (OFmem[msz - 1].mr_start + + OFmem[msz - 1].mr_size) - OFavail[asz - 1].mr_start; + /* * OFavail may have overlapping regions - collapse these * and copy out remaining regions to OFfree */ - asz /= sizeof(struct mem_region); do { still_merging = FALSE; for (i = 0; i < asz; i++) {