Module Name: src Committed By: martin Date: Sun Sep 6 16:45:09 UTC 2015
Modified Files: src/sys/arch/sparc64/include: cpu.h mdesc.h src/sys/arch/sparc64/sparc64: autoconf.c cpu.c mdesc.c pmap.c Log Message: On SUN4V make the mdesc data available early in pmap_bootstrap, so we can set up the uvm page colors correctly. Based on code from palle@. To generate a diff of this commit: cvs rdiff -u -r1.115 -r1.116 src/sys/arch/sparc64/include/cpu.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sparc64/include/mdesc.h cvs rdiff -u -r1.204 -r1.205 src/sys/arch/sparc64/sparc64/autoconf.c cvs rdiff -u -r1.125 -r1.126 src/sys/arch/sparc64/sparc64/cpu.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/sparc64/sparc64/mdesc.c cvs rdiff -u -r1.296 -r1.297 src/sys/arch/sparc64/sparc64/pmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/include/cpu.h diff -u src/sys/arch/sparc64/include/cpu.h:1.115 src/sys/arch/sparc64/include/cpu.h:1.116 --- src/sys/arch/sparc64/include/cpu.h:1.115 Mon Jun 15 07:48:08 2015 +++ src/sys/arch/sparc64/include/cpu.h Sun Sep 6 16:45:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.115 2015/06/15 07:48:08 martin Exp $ */ +/* $NetBSD: cpu.h,v 1.116 2015/09/06 16:45:09 martin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -275,6 +275,10 @@ extern u_long mp_tramp_ci; void cpu_hatch(void); void cpu_boot_secondary_processors(void); +/* Helper functions to retrieve cache info */ +int cpu_ecache_associativity(int node); +int cpu_ecache_size(int node); + /* * Call a function on other cpus: * multicast - send to everyone in the sparc64_cpuset_t Index: src/sys/arch/sparc64/include/mdesc.h diff -u src/sys/arch/sparc64/include/mdesc.h:1.3 src/sys/arch/sparc64/include/mdesc.h:1.4 --- src/sys/arch/sparc64/include/mdesc.h:1.3 Sun Mar 22 19:33:21 2015 +++ src/sys/arch/sparc64/include/mdesc.h Sun Sep 6 16:45:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: mdesc.h,v 1.3 2015/03/22 19:33:21 palle Exp $ */ +/* $NetBSD: mdesc.h,v 1.4 2015/09/06 16:45:09 martin Exp $ */ /* $OpenBSD: mdesc.h,v 1.3 2014/11/30 22:26:14 kettenis Exp $ */ /* * Copyright (c) 2009 Mark Kettenis @@ -38,10 +38,8 @@ struct md_element { }; #ifdef _KERNEL -extern vaddr_t mdesc; -extern size_t mdesc_len; - -void mdesc_init(void); +psize_t mdesc_get_len(void); +void mdesc_init(vaddr_t, paddr_t, psize_t); uint64_t mdesc_get_prop_val(int, const char *); const char *mdesc_get_prop_str(int, const char *); const char *mdesc_get_prop_data(int, const char *, size_t *); Index: src/sys/arch/sparc64/sparc64/autoconf.c diff -u src/sys/arch/sparc64/sparc64/autoconf.c:1.204 src/sys/arch/sparc64/sparc64/autoconf.c:1.205 --- src/sys/arch/sparc64/sparc64/autoconf.c:1.204 Fri Aug 14 02:28:18 2015 +++ src/sys/arch/sparc64/sparc64/autoconf.c Sun Sep 6 16:45:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.204 2015/08/14 02:28:18 nakayama Exp $ */ +/* $NetBSD: autoconf.c,v 1.205 2015/09/06 16:45:09 martin Exp $ */ /* * Copyright (c) 1996 @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.204 2015/08/14 02:28:18 nakayama Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.205 2015/09/06 16:45:09 martin Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -93,7 +93,6 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v #include <machine/bootinfo.h> #include <sparc64/sparc64/cache.h> #include <sparc64/sparc64/timerreg.h> -#include <machine/mdesc.h> #include <dev/ata/atavar.h> #include <dev/pci/pcivar.h> @@ -482,9 +481,6 @@ void cpu_configure(void) { - if (CPU_ISSUN4V) - mdesc_init(); - bool userconf = (boothowto & RB_USERCONF) != 0; /* fetch boot device settings */ Index: src/sys/arch/sparc64/sparc64/cpu.c diff -u src/sys/arch/sparc64/sparc64/cpu.c:1.125 src/sys/arch/sparc64/sparc64/cpu.c:1.126 --- src/sys/arch/sparc64/sparc64/cpu.c:1.125 Thu May 7 04:03:38 2015 +++ src/sys/arch/sparc64/sparc64/cpu.c Sun Sep 6 16:45:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.125 2015/05/07 04:03:38 palle Exp $ */ +/* $NetBSD: cpu.c,v 1.126 2015/09/06 16:45:09 martin Exp $ */ /* * Copyright (c) 1996 @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.125 2015/05/07 04:03:38 palle Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.126 2015/09/06 16:45:09 martin Exp $"); #include "opt_multiprocessor.h" @@ -263,7 +263,7 @@ cpu_dcache_associativity(int node) return prom_getpropint(node, "dcache-associativity", 1); } -static int +int cpu_ecache_size(int node) { if (CPU_ISSUN4V) @@ -290,7 +290,7 @@ cpu_ecache_nlines(int node) return prom_getpropint(node, "ecache-nlines", 32768); } -static int +int cpu_ecache_associativity(int node) { if (CPU_ISSUN4V) { Index: src/sys/arch/sparc64/sparc64/mdesc.c diff -u src/sys/arch/sparc64/sparc64/mdesc.c:1.4 src/sys/arch/sparc64/sparc64/mdesc.c:1.5 --- src/sys/arch/sparc64/sparc64/mdesc.c:1.4 Sun Mar 22 19:33:21 2015 +++ src/sys/arch/sparc64/sparc64/mdesc.c Sun Sep 6 16:45:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: mdesc.c,v 1.4 2015/03/22 19:33:21 palle Exp $ */ +/* $NetBSD: mdesc.c,v 1.5 2015/09/06 16:45:09 martin Exp $ */ /* $OpenBSD: mdesc.c,v 1.7 2014/11/30 22:26:15 kettenis Exp $ */ /* * Copyright (c) 2009 Mark Kettenis @@ -27,68 +27,39 @@ #include <machine/autoconf.h> #include <machine/hypervisor.h> #include <machine/mdesc.h> +#include <machine/sparc64.h> vaddr_t mdesc; paddr_t mdesc_pa; size_t mdesc_len; -void -mdesc_init(void) +size_t +mdesc_get_len(void) { - struct pglist mlist; - struct vm_page *m; - psize_t len, size; - paddr_t pa; - vaddr_t va; - int err; - - pa = 0; - len = 0; /* trick to determine actual buffer size */ - hv_mach_desc(pa, &len); + psize_t len = 0; + + len = 0; + hv_mach_desc(0, &len); KASSERT(len != 0); -again: - size = round_page(len); + return len; +} - TAILQ_INIT(&mlist); - err = uvm_pglistalloc(len, 0, -1, PAGE_SIZE, 0, &mlist, 1, 0); - if (err) - panic("%s: out of memory", __func__); - - len = size; - pa = VM_PAGE_TO_PHYS(TAILQ_FIRST(&mlist)); +void +mdesc_init(vaddr_t va, paddr_t pa, size_t avail_len) +{ + psize_t len; + int64_t err; + + len = avail_len; err = hv_mach_desc(pa, &len); if (err != H_EOK) - goto fail; - - va = (vaddr_t)uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY); - if (va == 0) - panic("%s: out of memory", __func__); - + panic("hv_mach_desc() failed - err = %" PRId64 "\n", err); + KASSERT(len <= avail_len); mdesc = (vaddr_t)va; mdesc_pa = pa; mdesc_len = len; - TAILQ_FOREACH(m, &mlist, pageq.queue) { - pa = VM_PAGE_TO_PHYS(m); - pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, 0); - va += PAGE_SIZE; - } - pmap_update(pmap_kernel()); - - return; - -fail: - uvm_pglistfree(&mlist); - - /* - * If the machine description was updated while we were trying - * to fetch it, the allocated buffer may have been to small. - * Try again in that case. - */ - if (err == H_EINVAL && len > size) - goto again; - return; } Index: src/sys/arch/sparc64/sparc64/pmap.c diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.296 src/sys/arch/sparc64/sparc64/pmap.c:1.297 --- src/sys/arch/sparc64/sparc64/pmap.c:1.296 Mon Jun 15 07:48:08 2015 +++ src/sys/arch/sparc64/sparc64/pmap.c Sun Sep 6 16:45:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.296 2015/06/15 07:48:08 martin Exp $ */ +/* $NetBSD: pmap.c,v 1.297 2015/09/06 16:45:09 martin Exp $ */ /* * * Copyright (C) 1996-1999 Eduardo Horvath. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.296 2015/06/15 07:48:08 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.297 2015/09/06 16:45:09 martin Exp $"); #undef NO_VCACHE /* Don't forget the locked TLB in dostart */ #define HWREF @@ -62,6 +62,7 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.2 #include <sparc64/sparc64/cache.h> #ifdef SUN4V #include <sparc64/hypervisor.h> +#include <sparc64/mdesc.h> #endif #ifdef DDB @@ -478,16 +479,15 @@ static int pmap_calculate_colors(void) continue; /* Found a CPU, get the E$ info. */ - size = prom_getpropint(node, "ecache-size", -1); - if (size == -1) { - /* XXX sun4v support missing */ + size = cpu_ecache_size(node); + if (size == 0) { prom_printf("pmap_calculate_colors: node %x has " "no ecache-size\n", node); /* If we can't get the E$ size, skip the node */ continue; } - assoc = prom_getpropint(node, "ecache-associativity", 1); + assoc = cpu_ecache_associativity(node); color = size/assoc/PAGE_SIZE; if (color > maxcolor) maxcolor = color; @@ -732,6 +732,18 @@ pmap_bootstrap(u_long kernelstart, u_lon /* Initialize bootstrap allocator. */ kdata_alloc_init(kernelend + 1 * 1024 * 1024, ekdata); + /* make sure we have access to the mdesc data on SUN4V machines */ + if (CPU_ISSUN4V) { + vaddr_t m_va; + psize_t m_len; + paddr_t m_pa; + + m_len = mdesc_get_len(); + m_va = kdata_alloc(m_len, 16); + m_pa = kdatap + (m_va - kdata); + mdesc_init(m_va, m_pa, m_len); + } + pmap_bootdebug(); pmap_alloc_bootargs(); pmap_mp_init();