From owner-p4-projects@FreeBSD.ORG Wed Feb 4 18:49:48 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E2CC61065735; Wed, 4 Feb 2009 18:49:45 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 62A6910656EC for ; Wed, 4 Feb 2009 18:49:45 +0000 (UTC) (envelope-from nwhitehorn@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 4CC648FC16 for ; Wed, 4 Feb 2009 18:49:45 +0000 (UTC) (envelope-from nwhitehorn@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n14Inj2g079902 for ; Wed, 4 Feb 2009 18:49:45 GMT (envelope-from nwhitehorn@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n14Injic079900 for perforce@freebsd.org; Wed, 4 Feb 2009 18:49:45 GMT (envelope-from nwhitehorn@freebsd.org) Date: Wed, 4 Feb 2009 18:49:45 GMT Message-Id: <200902041849.n14Injic079900@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to nwhitehorn@freebsd.org using -f From: Nathan Whitehorn To: Perforce Change Reviews Cc: Subject: PERFORCE change 157152 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 Feb 2009 18:49:54 -0000 http://perforce.freebsd.org/chv.cgi?CH=157152 Change 157152 by nwhitehorn@nwhitehorn_nokia on 2009/02/04 18:49:35 Fix locking while entering Open Firmware mappings, and change the memory regions code to exclude memory above the 4 GB boundary. This is sufficient to get an Xserve G5 booting almost the way to single user. Probing the hard drives still seems to be stuck in an infinite loop of failure, however. Affected files ... .. //depot/projects/ppc-g5/sys/powerpc/aim/mmu_oea64.c#14 edit .. //depot/projects/ppc-g5/sys/powerpc/aim/ofw_machdep.c#10 edit Differences ... ==== //depot/projects/ppc-g5/sys/powerpc/aim/mmu_oea64.c#14 (text+ko) ==== @@ -917,10 +917,13 @@ if (translations[i].om_pa_hi) panic("OFW translations above 32-bit boundary!"); - /* Enter the pages */ - PMAP_LOCK(&ofw_pmap); - PMAP_LOCK(kernel_pmap); + /* Now enter the pages for this mapping */ + /* + * Lock the ofw pmap. pmap_kenter(), which we use for the + * pages the kernel also needs, does its own locking. + */ + PMAP_LOCK(&ofw_pmap); DISABLE_TRANS(msr); for (off = 0; off < translations[i].om_len; off += PAGE_SIZE) { struct vm_page m; @@ -940,8 +943,6 @@ ofw_mappings++; } ENABLE_TRANS(msr); - - PMAP_UNLOCK(kernel_pmap); PMAP_UNLOCK(&ofw_pmap); } } ==== //depot/projects/ppc-g5/sys/powerpc/aim/ofw_machdep.c#10 (text+ko) ==== @@ -199,15 +199,25 @@ } } - for (i = 0; i < msz/sizeof(OFmem64[0]); i++) { + for (i = 0, j = 0; i < msz/sizeof(OFmem64[0]); i++) { if (OFmem64[i].mr_start_hi == 0) { OFmem[i].mr_start = OFmem64[i].mr_start_lo; OFmem[i].mr_size = OFmem64[i].mr_size; - } else { - OFmem[i].mr_size = 0; + + /* + * Check for memory regions extending above 32-bit + * memory space, and restrict them to stay there. + */ + if (((uint64_t)OFmem[i].mr_start + + (uint64_t)OFmem[i].mr_size) > + BUS_SPACE_MAXADDR_32BIT) { + OFmem[i].mr_size = BUS_SPACE_MAXADDR_32BIT - + OFmem[i].mr_start; + } + j++; } } - msz = i*sizeof(OFmem[0]); + msz = j*sizeof(OFmem[0]); } else { if ((msz = OF_getprop(phandle, "reg", OFmem, sizeof OFmem[0] * OFMEM_REGIONS)) <= 0)