Module Name: src Committed By: matt Date: Tue Nov 29 07:48:32 UTC 2011
Modified Files: src/sys/arch/evbmips/conf [matt-nb5-mips64]: XLSATX32 src/sys/arch/evbmips/include [matt-nb5-mips64]: vmparam.h src/sys/arch/evbmips/rmixl [matt-nb5-mips64]: machdep.c src/sys/arch/mips/conf [matt-nb5-mips64]: files.mips src/sys/arch/mips/include [matt-nb5-mips64]: vmparam.h src/sys/arch/mips/mips [matt-nb5-mips64]: cpu_subr.c genassym.cf mem.c pmap.c pmap_segtab.c vm_machdep.c Log Message: Take part of the KSEG2 space and use it to "almost" direct another 256MB of memory so that N32 kernels can make use of ram outside of KSEG0. This allows N32 kernels to be useful on systems with 4GB of RAM or more. To generate a diff of this commit: cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/arch/evbmips/conf/XLSATX32 cvs rdiff -u -r1.1.142.4 -r1.1.142.5 src/sys/arch/evbmips/include/vmparam.h cvs rdiff -u -r1.1.2.35 -r1.1.2.36 src/sys/arch/evbmips/rmixl/machdep.c cvs rdiff -u -r1.58.24.15 -r1.58.24.16 src/sys/arch/mips/conf/files.mips cvs rdiff -u -r1.41.28.20 -r1.41.28.21 src/sys/arch/mips/include/vmparam.h cvs rdiff -u -r1.1.2.19 -r1.1.2.20 src/sys/arch/mips/mips/cpu_subr.c cvs rdiff -u -r1.44.12.27 -r1.44.12.28 src/sys/arch/mips/mips/genassym.cf cvs rdiff -u -r1.35.38.6 -r1.35.38.7 src/sys/arch/mips/mips/mem.c cvs rdiff -u -r1.179.16.30 -r1.179.16.31 src/sys/arch/mips/mips/pmap.c cvs rdiff -u -r1.1.2.10 -r1.1.2.11 src/sys/arch/mips/mips/pmap_segtab.c cvs rdiff -u -r1.121.6.1.2.21 -r1.121.6.1.2.22 \ src/sys/arch/mips/mips/vm_machdep.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/evbmips/conf/XLSATX32 diff -u src/sys/arch/evbmips/conf/XLSATX32:1.1.2.2 src/sys/arch/evbmips/conf/XLSATX32:1.1.2.3 --- src/sys/arch/evbmips/conf/XLSATX32:1.1.2.2 Fri Apr 29 09:27:12 2011 +++ src/sys/arch/evbmips/conf/XLSATX32 Tue Nov 29 07:48:32 2011 @@ -1,10 +1,13 @@ -# $NetBSD: XLSATX32,v 1.1.2.2 2011/04/29 09:27:12 matt Exp $ +# $NetBSD: XLSATX32,v 1.1.2.3 2011/11/29 07:48:32 matt Exp $ # -#ident "XLSATX32-$Revision: 1.1.2.2 $" +#ident "XLSATX32-$Revision: 1.1.2.3 $" include "arch/evbmips/conf/XLSATX" -options MEMLIMIT=0x20000000 # 512MB +#options MEMLIMIT=0x20000000 # 512MB +options ENABLE_MIPS_KSEGX +#no options NFS_BOOT_DHCP +#options NFS_BOOT_BOOTP makeoptions LP64="no" Index: src/sys/arch/evbmips/include/vmparam.h diff -u src/sys/arch/evbmips/include/vmparam.h:1.1.142.4 src/sys/arch/evbmips/include/vmparam.h:1.1.142.5 --- src/sys/arch/evbmips/include/vmparam.h:1.1.142.4 Wed Jan 6 04:24:38 2010 +++ src/sys/arch/evbmips/include/vmparam.h Tue Nov 29 07:48:32 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vmparam.h,v 1.1.142.4 2010/01/06 04:24:38 matt Exp $ */ +/* $NetBSD: vmparam.h,v 1.1.142.5 2011/11/29 07:48:32 matt Exp $ */ #ifndef _EVBMIPS_VMPARAM_H_ #define _EVBMIPS_VMPARAM_H_ @@ -15,5 +15,8 @@ #if !defined(_LP64) #define VM_FREELIST_FIRST512M 1 #endif + +#define VM_FREELIST_NORMALOK_P(lcv) \ + ((lcv) == VM_FREELIST_DEFAULT || (lcv) != mips_poolpage_vmfreelist) #endif /* !_EVBMIPS_VMPARAM_H_ */ Index: src/sys/arch/evbmips/rmixl/machdep.c diff -u src/sys/arch/evbmips/rmixl/machdep.c:1.1.2.35 src/sys/arch/evbmips/rmixl/machdep.c:1.1.2.36 --- src/sys/arch/evbmips/rmixl/machdep.c:1.1.2.35 Thu May 26 19:24:31 2011 +++ src/sys/arch/evbmips/rmixl/machdep.c Tue Nov 29 07:48:32 2011 @@ -97,6 +97,7 @@ __KERNEL_RCSID(0, "machdep.c,v 1.1.2.34 #include <sys/boot_flag.h> #include <sys/termios.h> #include <sys/ksyms.h> +#include <sys/intr.h> #include <sys/bus.h> #include <sys/device.h> #include <sys/extent.h> @@ -117,6 +118,7 @@ __KERNEL_RCSID(0, "machdep.c,v 1.1.2.34 #include <mips/psl.h> #include <mips/cache.h> #include <mips/mips_opcode.h> +#include <mips/pte.h> #include "com.h" #if NCOM == 0 @@ -126,8 +128,6 @@ __KERNEL_RCSID(0, "machdep.c,v 1.1.2.34 #include <dev/ic/comreg.h> #include <dev/ic/comvar.h> -#include <mips/include/intr.h> - #include <mips/rmi/rmixlreg.h> #include <mips/rmi/rmixlvar.h> #include <mips/rmi/rmixl_intr.h> @@ -163,6 +163,10 @@ bus_addr_t comcnaddr = (bus_addr_t)CONS struct rmixl_config rmixl_configuration; +#ifdef ENABLE_MIPS_KSEGX +pt_entry_t mips_ksegx_pte; +paddr_t mips_ksegx_start; +#endif /* * array of tested firmware versions @@ -244,6 +248,8 @@ mach_init(int argc, int32_t *argv, void void *kernend; uint64_t memsize; extern char edata[], end[]; + size_t fl_count = 0; + struct mips_vmfreelist fl[1]; rmixl_pcr_init_core(); @@ -365,7 +371,7 @@ mach_init(int argc, int32_t *argv, void mem_cluster_cnt = ram_seg_resv(mem_clusters, mem_cluster_cnt, 0x1FC00000, 0x1FC00000+NBPG); -#ifdef MULTIPROCEESOR +#ifdef MULTIPROCESSOR /* reserve the cpu_wakeup_info area */ mem_cluster_cnt = ram_seg_resv(mem_clusters, mem_cluster_cnt, (u_quad_t)trunc_page(rcp->rc_cpu_wakeup_info), @@ -378,6 +384,31 @@ mach_init(int argc, int32_t *argv, void (u_quad_t)MEMLIMIT, (u_quad_t)~0); #endif +#ifdef ENABLE_MIPS_KSEGX + /* + * Now we need to reserve an aligned block of memory for pre-init + * allocations so we don't deplete KSEG0. + */ + for (u_int i=0; i < mem_cluster_cnt; i++) { + u_quad_t finish = round_page( + mem_clusters[i].start + mem_clusters[i].size); + u_quad_t start = roundup2(mem_clusters[i].start, VM_KSEGX_SIZE); + if (start > MIPS_PHYS_MASK && start + VM_KSEGX_SIZE <= finish) { + mips_ksegx_start = start; + mips_ksegx_pte.pt_entry = mips_paddr_to_tlbpfn(start) + | MIPS3_PG_D | MIPS3_PG_CACHED + | MIPS3_PG_V | MIPS3_PG_G; + fl[0].fl_start = start; + fl[0].fl_end = start + VM_KSEGX_SIZE; + fl[0].fl_freelist = VM_FREELIST_FIRST512M; + fl_count++; + DPRINTF(("mips_ksegx_start %#"PRIxPADDR"\n", + fl[0].fl_start)); + break; + } + } +#endif + /* get maximum RAM address from the VM clusters */ mem_cluster_maxaddr = 0; for (u_int i=0; i < mem_cluster_cnt; i++) { @@ -392,7 +423,7 @@ mach_init(int argc, int32_t *argv, void * Load mem_clusters[] into the VM system. */ mips_page_physload(MIPS_KSEG0_START, (vaddr_t) kernend, - mem_clusters, mem_cluster_cnt, NULL, 0); + mem_clusters, mem_cluster_cnt, fl, fl_count); /* * Initialize error message buffer (at end of core). Index: src/sys/arch/mips/conf/files.mips diff -u src/sys/arch/mips/conf/files.mips:1.58.24.15 src/sys/arch/mips/conf/files.mips:1.58.24.16 --- src/sys/arch/mips/conf/files.mips:1.58.24.15 Thu May 26 19:21:55 2011 +++ src/sys/arch/mips/conf/files.mips Tue Nov 29 07:48:31 2011 @@ -3,6 +3,7 @@ defflag opt_cputype.h NOFPU FPEMUL MIPS64_SB1 + ENABLE_MIPS_KSEGX MIPS64_XLP MIPS64_XLR MIPS64_XLS # and the rest... # MIPS1 MIPS2 MIPS3 MIPS4 MIPS5 Index: src/sys/arch/mips/include/vmparam.h diff -u src/sys/arch/mips/include/vmparam.h:1.41.28.20 src/sys/arch/mips/include/vmparam.h:1.41.28.21 --- src/sys/arch/mips/include/vmparam.h:1.41.28.20 Fri Apr 29 08:26:22 2011 +++ src/sys/arch/mips/include/vmparam.h Tue Nov 29 07:48:31 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vmparam.h,v 1.41.28.20 2011/04/29 08:26:22 matt Exp $ */ +/* $NetBSD: vmparam.h,v 1.41.28.21 2011/11/29 07:48:31 matt Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -173,6 +173,12 @@ #endif #define VM_MAXUSER32_ADDRESS ((vaddr_t)(1UL << 31))/* 0x0000000080000000 */ +#ifdef ENABLE_MIPS_KSEGX +#define VM_KSEGX_ADDRESS ((vaddr_t)-0x20000000) /* 0x...E0000000 */ +#define VM_KSEGX_SHIFT 28 +#define VM_KSEGX_SIZE (1 << VM_KSEGX_SHIFT) +#endif + /* * The address to which unspecified mapping requests default */ @@ -198,6 +204,9 @@ #ifdef _KERNEL #define UVM_KM_VMFREELIST mips_poolpage_vmfreelist extern int mips_poolpage_vmfreelist; +#ifdef ENABLE_MIPS_KSEGX +extern paddr_t mips_ksegx_start; +#endif #endif #define __HAVE_VM_PAGE_MD Index: src/sys/arch/mips/mips/cpu_subr.c diff -u src/sys/arch/mips/mips/cpu_subr.c:1.1.2.19 src/sys/arch/mips/mips/cpu_subr.c:1.1.2.20 --- src/sys/arch/mips/mips/cpu_subr.c:1.1.2.19 Sat May 28 02:24:47 2011 +++ src/sys/arch/mips/mips/cpu_subr.c Tue Nov 29 07:48:31 2011 @@ -91,6 +91,10 @@ struct cpu_info cpu_info_store #endif }; +#ifdef ENABLE_MIPS_KSEGX +struct vm_map *mips_ksegx_map; +#endif + #ifdef MULTIPROCESSOR volatile __cpuset_t cpus_running = 1; @@ -302,7 +306,23 @@ cpu_startup_common(void) format_bytes(pbuf, sizeof(pbuf), ctob(physmem)); printf("total memory = %s\n", pbuf); +#ifdef ENABLE_MIPS_KSEGSX + if (mips_virtual_end > KM_KSEGX_ADDRESS) { + KASSERT(mips_virtual_end > KM_KSEGX_ADDRESS + VM_KSEGX_SIZE); + minaddr = VM_KSEGX_ADDRESS; + maxaddr = VM_KSEGX_ADDRESS; + /* + * Allocate a submap for ksegx. + */ + mips_ksegx_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr, + VM_KSEGX_SIZE, 0, FALSE, NULL); + KASSERT(mips_ksegx_map); + KASSERT(mips_ksegx_map->header.start == VM_KSEGX_ADDRESS); + } +#endif + minaddr = 0; + maxaddr = VM_MAX_KERNEL_ADDRESS; /* * Allocate a submap for physio. */ Index: src/sys/arch/mips/mips/genassym.cf diff -u src/sys/arch/mips/mips/genassym.cf:1.44.12.27 src/sys/arch/mips/mips/genassym.cf:1.44.12.28 --- src/sys/arch/mips/mips/genassym.cf:1.44.12.27 Thu May 26 19:21:56 2011 +++ src/sys/arch/mips/mips/genassym.cf Tue Nov 29 07:48:31 2011 @@ -130,6 +130,11 @@ define PCB_PPL offsetof(struct pcb, pc define VM_MIN_ADDRESS VM_MIN_ADDRESS define VM_MIN_KERNEL_ADDRESS VM_MIN_KERNEL_ADDRESS define VM_MAX_KERNEL_ADDRESS VM_MAX_KERNEL_ADDRESS +ifdef ENABLE_MIPS_KSEGX +define VM_KSEGX_ADDRESS VM_KSEGX_ADDRESS +define VM_KSEGX_SHIFT VM_KSEGX_SHIFT +define MIPS3_DEFAULT_PG_SHIFT MIPS3_DEFAULT_PG_SHIFT +endif define SIGFPE SIGFPE define SIGILL SIGILL @@ -143,6 +148,7 @@ define MIPS1_PG_G MIPS1_PG_G define MIPS1_PG_V MIPS1_PG_V define MIPS3_PG_G MIPS3_PG_G define MIPS3_PG_V MIPS3_PG_V +define MIPS3_PG_D MIPS3_PG_D define MIPS3_PG_HVPN MIPS3_PG_HVPN define MIPS3_PG_ASID MIPS3_PG_ASID define MIPS3_PG_ODDPG MIPS3_PG_ODDPG Index: src/sys/arch/mips/mips/mem.c diff -u src/sys/arch/mips/mips/mem.c:1.35.38.6 src/sys/arch/mips/mips/mem.c:1.35.38.7 --- src/sys/arch/mips/mips/mem.c:1.35.38.6 Fri Apr 29 08:26:27 2011 +++ src/sys/arch/mips/mips/mem.c Tue Nov 29 07:48:31 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: mem.c,v 1.35.38.6 2011/04/29 08:26:27 matt Exp $ */ +/* $NetBSD: mem.c,v 1.35.38.7 2011/11/29 07:48:31 matt Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -44,7 +44,7 @@ #include "opt_mips_cache.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.35.38.6 2011/04/29 08:26:27 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.35.38.7 2011/11/29 07:48:31 matt Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -143,10 +143,19 @@ mmrw(dev_t dev, struct uio *uio, int fla if (v < MIPS_KSEG0_START) return (EFAULT); if (v > MIPS_PHYS_TO_KSEG0(mips_avail_end + - mips_round_page(MSGBUFSIZE) - c) && - (v < MIPS_KSEG2_START || - !uvm_kernacc((void *)v, c, - uio->uio_rw == UIO_READ ? B_READ : B_WRITE))) + mips_round_page(MSGBUFSIZE) - c) + && (v < MIPS_KSEG2_START + || ( +#ifdef ENABLE_MIPS_KSEGX + (v < VM_KSEGX_ADDRESS + || v >= VM_KSEGX_ADDRESS + VM_KSEGX_SIZE) +#else + true +#endif + && !uvm_kernacc((void *)v, c, + uio->uio_rw == UIO_READ + ? B_READ + : B_WRITE)))) return (EFAULT); #endif error = uiomove((void *)v, c, uio); Index: src/sys/arch/mips/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.179.16.30 src/sys/arch/mips/mips/pmap.c:1.179.16.31 --- src/sys/arch/mips/mips/pmap.c:1.179.16.30 Sat May 28 06:50:07 2011 +++ src/sys/arch/mips/mips/pmap.c Tue Nov 29 07:48:31 2011 @@ -493,6 +493,25 @@ pmap_bootstrap(void) pmap_tlb_info_init(&pmap_tlb0_info); /* init the lock */ +#ifdef ENABLE_MIPS_KSEGX + const vaddr_t kva_inc = 1 << ((VM_KSEGX_SHIFT - 1) & ~1); + const uint32_t tlb_mask = (2 * kva_inc - 1) & 0x1ffffc00; + for (vaddr_t kva = 0; kva < VM_KSEGX_SIZE; kva += 2 * kva_inc) { + extern pt_entry_t mips_ksegx_pte; + struct tlbmask tlb = { + .tlb_hi = VM_KSEGX_ADDRESS + kva, + .tlb_lo0 = mips_ksegx_pte.pt_entry + + mips_paddr_to_tlbpfn(kva), + .tlb_lo1 = mips_ksegx_pte.pt_entry + + mips_paddr_to_tlbpfn(kva + kva_inc), + .tlb_mask = tlb_mask, + }; + tlb_write_indexed(pmap_tlb0_info.ti_wired, &tlb); + pmap_tlb0_info.ti_wired++; + } + mips3_cp0_wired_write(pmap_tlb0_info.ti_wired); +#endif + /* * Compute the number of pages kmem_map will have. */ @@ -546,6 +565,17 @@ pmap_bootstrap(void) mips_virtual_end = VM_MIN_KERNEL_ADDRESS + (vaddr_t)Sysmapsize * NBPG; #ifndef _LP64 +#ifdef ENABLE_MIPS_KSEGX + /* + * This wastes 256MB / 1024 or 256KB to bypass the reserved space + * for KSEGX. If the kernel used a 2-level page table, we'd only + * waste 1K or less. + */ + if (mips_virtual_end > VM_KSEGX_ADDRESS) { + mips_virtual_end += VM_KSEGX_SIZE / NBPG; + } +#endif + if (mips_virtual_end > VM_MAX_KERNEL_ADDRESS) { mips_virtual_end = VM_MAX_KERNEL_ADDRESS; Sysmapsize = @@ -2648,11 +2678,16 @@ mips_pmap_map_poolpage(paddr_t pa) KASSERT(mips_options.mips3_xkphys_cached); va = MIPS_PHYS_TO_XKPHYS_CACHED(pa); #else +#ifdef ENABLE_MIPS_KSEGX + if (pa >= mips_ksegx_start && pa < mips_ksegx_start + VM_KSEGX_SIZE) { + va = VM_KSEGX_ADDRESS + pa - mips_ksegx_start; + } else +#endif if (pa > MIPS_PHYS_MASK) panic("mips_pmap_map_poolpage: " "pa #%"PRIxPADDR" can not be mapped into KSEG0", pa); - - va = MIPS_PHYS_TO_KSEG0(pa); + else + va = MIPS_PHYS_TO_KSEG0(pa); #endif #endif #if !defined(_LP64) || defined(PMAP_POOLPAGE_DEBUG) @@ -2685,8 +2720,15 @@ mips_pmap_unmap_poolpage(vaddr_t va) KASSERT(MIPS_XKPHYS_P(va)); pa = MIPS_XKPHYS_TO_PHYS(va); #else - KASSERT(MIPS_KSEG0_P(va)); - pa = MIPS_KSEG0_TO_PHYS(va); +#ifdef ENABLE_MIPS_KSEGX + if (VM_KSEGX_ADDRESS <= va && va < VM_KSEGX_ADDRESS + VM_KSEGX_SIZE) { + pa = mips_ksegx_start + va - VM_KSEGX_ADDRESS; + } else +#endif + { + KASSERT(MIPS_KSEG0_P(va)); + pa = MIPS_KSEG0_TO_PHYS(va); + } #endif struct vm_page *pg = PHYS_TO_VM_PAGE(pa); KASSERT(pg); Index: src/sys/arch/mips/mips/pmap_segtab.c diff -u src/sys/arch/mips/mips/pmap_segtab.c:1.1.2.10 src/sys/arch/mips/mips/pmap_segtab.c:1.1.2.11 --- src/sys/arch/mips/mips/pmap_segtab.c:1.1.2.10 Fri Apr 29 08:26:29 2011 +++ src/sys/arch/mips/mips/pmap_segtab.c Tue Nov 29 07:48:31 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_segtab.c,v 1.1.2.10 2011/04/29 08:26:29 matt Exp $ */ +/* $NetBSD: pmap_segtab.c,v 1.1.2.11 2011/11/29 07:48:31 matt Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.1.2.10 2011/04/29 08:26:29 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.1.2.11 2011/11/29 07:48:31 matt Exp $"); /* * Manages physical address maps. @@ -235,10 +235,8 @@ pmap_segtab_release(union segtab *stp, u #endif /* MIPS3_PLUS */ #ifdef _LP64 KASSERT(MIPS_XKPHYS_P(pte)); - pa = MIPS_XKPHYS_TO_PHYS(pte); -#else - pa = MIPS_KSEG0_TO_PHYS(pte); #endif + pa = mips_pmap_unmap_poolpage((vaddr_t)pte); uvm_pagefree(PHYS_TO_VM_PAGE(pa)); stp->seg_tab[i] = NULL; @@ -292,10 +290,8 @@ pmap_segtab_alloc(void) #ifdef _LP64 KASSERT(mips_options.mips3_xkphys_cached); - stp = (union segtab *)MIPS_PHYS_TO_XKPHYS_CACHED(stp_pa); -#else - stp = (union segtab *)MIPS_PHYS_TO_KSEG0(stp_pa); #endif + stp = (union segtab *)mips_pmap_map_poolpage(stp_pa); const size_t n = NBPG / sizeof(union segtab); if (n > 1) { /* @@ -457,10 +453,8 @@ pmap_pte_reserve(pmap_t pmap, vaddr_t va const paddr_t pa = VM_PAGE_TO_PHYS(pg); #ifdef _LP64 KASSERT(mips_options.mips3_xkphys_cached); - pte = (pt_entry_t *)MIPS_PHYS_TO_XKPHYS_CACHED(pa); -#else - pte = (pt_entry_t *)MIPS_PHYS_TO_KSEG0(pa); #endif + pte = (pt_entry_t *)mips_pmap_map_poolpage(pa); pt_entry_t ** const pte_p = &stp->seg_tab[(va >> SEGSHIFT) & (PMAP_SEGTABSIZE - 1)]; #ifdef MULTIPROCESSOR Index: src/sys/arch/mips/mips/vm_machdep.c diff -u src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.21 src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.22 --- src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.21 Thu May 26 19:21:57 2011 +++ src/sys/arch/mips/mips/vm_machdep.c Tue Nov 29 07:48:31 2011 @@ -445,6 +445,13 @@ kvtophys(vaddr_t kva) if (kva >= VM_MAX_KERNEL_ADDRESS) goto overrun; +#ifdef ENABLE_MIPS_KSEGX + if (VM_KSEGX_ADDRESS <= kva + && kva < VM_KSEGX_ADDRESS + VM_KSEGX_SIZE) { + return mips_ksegx_start + kva - VM_KSEGX_ADDRESS; + } +#endif + pte = kvtopte(kva); if ((size_t) (pte - Sysmap) >= Sysmapsize) { printf("oops: Sysmap overrun, max %d index %zd\n",