From owner-svn-src-projects@FreeBSD.ORG Mon May 17 16:04:09 2010 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 B886A106566C; Mon, 17 May 2010 16:04:09 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (unknown [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A75338FC17; Mon, 17 May 2010 16:04:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o4HG49eu070539; Mon, 17 May 2010 16:04:09 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o4HG496m070537; Mon, 17 May 2010 16:04:09 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201005171604.o4HG496m070537@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 17 May 2010 16:04:09 +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: r208195 - in projects/ppc64/sys/powerpc: aim include 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, 17 May 2010 16:04:09 -0000 Author: nwhitehorn Date: Mon May 17 16:04:09 2010 New Revision: 208195 URL: http://svn.freebsd.org/changeset/base/208195 Log: Modify the way the virtual segment IDs for large-page mappings are set up to reduce the number of hash collisions with regular 4K pages. This allows systems with > 5 GB RAM to boot with the direct map enabled. Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c projects/ppc64/sys/powerpc/aim/ofw_machdep.c projects/ppc64/sys/powerpc/aim/slb.c projects/ppc64/sys/powerpc/include/slb.h Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/mmu_oea64.c Mon May 17 15:31:24 2010 (r208194) +++ projects/ppc64/sys/powerpc/aim/mmu_oea64.c Mon May 17 16:04:09 2010 (r208195) @@ -838,7 +838,7 @@ moea64_bootstrap_slb_prefault(vm_offset_ } entry.slbe = slbe; - entry.slbv = (esid | KERNEL_VSID_BIT) << SLBV_VSID_SHIFT; + entry.slbv = KERNEL_VSID(esid, large) << SLBV_VSID_SHIFT; if (large) entry.slbv |= SLBV_L; Modified: projects/ppc64/sys/powerpc/aim/ofw_machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/ofw_machdep.c Mon May 17 15:31:24 2010 (r208194) +++ projects/ppc64/sys/powerpc/aim/ofw_machdep.c Mon May 17 16:04:09 2010 (r208195) @@ -62,6 +62,7 @@ __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; static struct mtx ofw_mutex; @@ -270,10 +271,11 @@ 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); asz = parse_ofw_memory(phandle, "available", OFavail); *memp = OFmem; - *memsz = msz / sizeof(struct mem_region); + *memsz = nOFmem; /* * OFavail may have overlapping regions - collapse these @@ -640,7 +642,7 @@ mem_valid(vm_offset_t addr, int len) { int i; - for (i = 0; i < OFMEM_REGIONS; i++) + for (i = 0; i < nOFmem; i++) if ((addr >= OFmem[i].mr_start) && (addr + len < OFmem[i].mr_start + OFmem[i].mr_size)) return (0); Modified: projects/ppc64/sys/powerpc/aim/slb.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/slb.c Mon May 17 15:31:24 2010 (r208194) +++ projects/ppc64/sys/powerpc/aim/slb.c Mon May 17 16:04:09 2010 (r208195) @@ -70,8 +70,8 @@ va_to_slb_entry(pmap_t pm, vm_offset_t v slb->slbe = (esid << SLBE_ESID_SHIFT) | SLBE_VALID; if (pm == kernel_pmap) { - /* Set kernel VSID to ESID | KERNEL_VSID_BIT */ - slb->slbv = (esid | KERNEL_VSID_BIT) << SLBV_VSID_SHIFT; + /* Set kernel VSID to deterministic value */ + slb->slbv = va_to_vsid(kernel_pmap, va) << SLBV_VSID_SHIFT; /* Figure out if this is a large-page mapping */ if (hw_direct_map && va < VM_MIN_KERNEL_ADDRESS) { @@ -102,11 +102,18 @@ uint64_t va_to_vsid(pmap_t pm, vm_offset_t va) { struct slb entry; + int large; - /* Shortcut kernel case: VSID = ESID | KERNEL_VSID_BIT */ + /* Shortcut kernel case */ + if (pm == kernel_pmap) { + large = 0; + if (hw_direct_map && va < VM_MIN_KERNEL_ADDRESS && + mem_valid(va, 0) == 0) + large = 1; + + return (KERNEL_VSID((uintptr_t)va >> ADDR_SR_SHFT, large)); + } - if (pm == kernel_pmap) - return (((uintptr_t)va >> ADDR_SR_SHFT) | KERNEL_VSID_BIT); /* * If there is no vsid for this VA, we need to add a new entry * to the PMAP's segment table. @@ -128,7 +135,7 @@ allocate_vsid(pmap_t pm, uint64_t esid, prespill = NULL; if (pm == kernel_pmap) { - vsid = esid | KERNEL_VSID_BIT; + vsid = va_to_vsid(pm, esid << ADDR_SR_SHFT); slb_entry = &kern_entry; prespill = PCPU_GET(slb); } else { Modified: projects/ppc64/sys/powerpc/include/slb.h ============================================================================== --- projects/ppc64/sys/powerpc/include/slb.h Mon May 17 15:31:24 2010 (r208194) +++ projects/ppc64/sys/powerpc/include/slb.h Mon May 17 16:04:09 2010 (r208195) @@ -49,6 +49,13 @@ #define KERNEL_VSID_BIT 0x0000001000000000UL /* Bit set in all kernel VSIDs */ +/* + * Shift large-page VSIDs one place left. At present, they are only used in the + * kernel direct map, and we already assume in the placement of KVA that the + * CPU cannot address more than 63 bits of memory. + */ +#define KERNEL_VSID(esid, large) (((uint64_t)(esid) << (large ? 1 : 0)) | KERNEL_VSID_BIT) + #define SLBE_VALID 0x0000000008000000UL /* SLB entry valid */ #define SLBE_INDEX_MASK 0x0000000000000fffUL /* SLB index mask*/ #define SLBE_ESID_MASK 0xfffffffff0000000UL /* Effective segment ID mask */