1 1.59 ad /* $NetBSD: uvm_init.c,v 1.59 2023/09/23 18:21:12 ad Exp $ */ 2 1.1 mrg 3 1.1 mrg /* 4 1.1 mrg * Copyright (c) 1997 Charles D. Cranor and Washington University. 5 1.1 mrg * All rights reserved. 6 1.1 mrg * 7 1.1 mrg * Redistribution and use in source and binary forms, with or without 8 1.1 mrg * modification, are permitted provided that the following conditions 9 1.1 mrg * are met: 10 1.1 mrg * 1. Redistributions of source code must retain the above copyright 11 1.1 mrg * notice, this list of conditions and the following disclaimer. 12 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 mrg * notice, this list of conditions and the following disclaimer in the 14 1.1 mrg * documentation and/or other materials provided with the distribution. 15 1.1 mrg * 16 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 mrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 mrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 mrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 mrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 mrg * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 mrg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 mrg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 mrg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 mrg * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.4 mrg * 27 1.4 mrg * from: Id: uvm_init.c,v 1.1.2.3 1998/02/06 05:15:27 chs Exp 28 1.1 mrg */ 29 1.1 mrg 30 1.1 mrg /* 31 1.1 mrg * uvm_init.c: init the vm system. 32 1.1 mrg */ 33 1.15 lukem 34 1.15 lukem #include <sys/cdefs.h> 35 1.59 ad __KERNEL_RCSID(0, "$NetBSD: uvm_init.c,v 1.59 2023/09/23 18:21:12 ad Exp $"); 36 1.1 mrg 37 1.1 mrg #include <sys/param.h> 38 1.1 mrg #include <sys/systm.h> 39 1.30 yamt #include <sys/debug.h> 40 1.1 mrg #include <sys/file.h> 41 1.1 mrg #include <sys/filedesc.h> 42 1.1 mrg #include <sys/resourcevar.h> 43 1.34 rmind #include <sys/kmem.h> 44 1.1 mrg #include <sys/mman.h> 45 1.1 mrg #include <sys/vnode.h> 46 1.56 riastrad #include <sys/rndsource.h> 47 1.1 mrg 48 1.1 mrg #include <uvm/uvm.h> 49 1.26 yamt #include <uvm/uvm_pdpolicy.h> 50 1.48 cherry #include <uvm/uvm_physseg.h> 51 1.31 ad #include <uvm/uvm_readahead.h> 52 1.56 riastrad #include <uvm/uvm_rndsource.h> 53 1.1 mrg 54 1.1 mrg /* 55 1.28 ad * struct uvm: we store most global vars in this structure to make them 56 1.1 mrg * easier to spot... 57 1.1 mrg */ 58 1.1 mrg 59 1.1 mrg struct uvm uvm; /* decl */ 60 1.1 mrg struct uvmexp uvmexp; /* decl */ 61 1.28 ad struct uvm_object *uvm_kernel_object; 62 1.28 ad 63 1.38 uebayasi #if defined(__uvmexp_pagesize) 64 1.44 matt const int * const uvmexp_pagesize = &uvmexp.pagesize; 65 1.44 matt const int * const uvmexp_pagemask = &uvmexp.pagemask; 66 1.44 matt const int * const uvmexp_pageshift = &uvmexp.pageshift; 67 1.37 uebayasi #endif 68 1.37 uebayasi 69 1.50 ad kmutex_t uvm_kentry_lock __cacheline_aligned; 70 1.1 mrg 71 1.56 riastrad struct krndsource uvm_fault_rndsource; 72 1.56 riastrad 73 1.1 mrg /* 74 1.47 cherry * uvm_md_init: Init dependant on the MD boot context. 75 1.47 cherry * called from MD code. 76 1.47 cherry */ 77 1.47 cherry 78 1.47 cherry void 79 1.47 cherry uvm_md_init(void) 80 1.47 cherry { 81 1.47 cherry uvm_setpagesize(); /* initialize PAGE_SIZE-dependent variables */ 82 1.48 cherry uvm_physseg_init(); 83 1.47 cherry } 84 1.47 cherry 85 1.47 cherry /* 86 1.1 mrg * uvm_init: init the VM system. called from kern/init_main.c. 87 1.1 mrg */ 88 1.1 mrg 89 1.6 mrg void 90 1.23 thorpej uvm_init(void) 91 1.1 mrg { 92 1.18 thorpej vaddr_t kvm_start, kvm_end; 93 1.1 mrg 94 1.6 mrg /* 95 1.43 rmind * Ensure that the hardware set the page size, zero the UVM structure. 96 1.6 mrg */ 97 1.1 mrg 98 1.6 mrg if (uvmexp.pagesize == 0) { 99 1.6 mrg panic("uvm_init: page size not set"); 100 1.6 mrg } 101 1.1 mrg 102 1.8 perry memset(&uvm, 0, sizeof(uvm)); 103 1.6 mrg averunnable.fscale = FSCALE; 104 1.1 mrg 105 1.6 mrg /* 106 1.43 rmind * Init the page sub-system. This includes allocating the vm_page 107 1.43 rmind * structures, and setting up all the page queues (and locks). 108 1.43 rmind * Available memory will be put in the "free" queue, kvm_start and 109 1.43 rmind * kvm_end will be set to the area of kernel virtual memory which 110 1.43 rmind * is available for general use. 111 1.6 mrg */ 112 1.1 mrg 113 1.18 thorpej uvm_page_init(&kvm_start, &kvm_end); 114 1.54 chs uvm_pglistalloc_init(); 115 1.1 mrg 116 1.6 mrg /* 117 1.43 rmind * Init the map sub-system. 118 1.6 mrg */ 119 1.1 mrg 120 1.6 mrg uvm_map_init(); 121 1.1 mrg 122 1.6 mrg /* 123 1.43 rmind * Setup the kernel's virtual memory data structures. This includes 124 1.45 para * setting up the kernel_map/kernel_object. 125 1.45 para * Bootstrap all kernel memory allocators. 126 1.6 mrg */ 127 1.1 mrg 128 1.42 para uao_init(); 129 1.42 para uvm_km_bootstrap(kvm_start, kvm_end); 130 1.42 para 131 1.43 rmind /* 132 1.43 rmind * Setup uvm_map caches and init the amap. 133 1.42 para */ 134 1.42 para 135 1.42 para uvm_map_init_caches(); 136 1.42 para uvm_amap_init(); 137 1.1 mrg 138 1.6 mrg /* 139 1.43 rmind * Init the pmap module. The pmap module is free to allocate 140 1.6 mrg * memory for its private use (e.g. pvlists). 141 1.6 mrg */ 142 1.1 mrg 143 1.6 mrg pmap_init(); 144 1.1 mrg 145 1.43 rmind /* 146 1.45 para * Make kernel memory allocators ready for use. 147 1.45 para * After this call the pool/kmem memory allocators can be used. 148 1.6 mrg */ 149 1.1 mrg 150 1.42 para uvm_km_init(); 151 1.46 riastrad #ifdef __HAVE_PMAP_PV_TRACK 152 1.46 riastrad pmap_pv_init(); 153 1.46 riastrad #endif 154 1.1 mrg 155 1.30 yamt #ifdef DEBUG 156 1.30 yamt debug_init(); 157 1.30 yamt #endif 158 1.30 yamt 159 1.6 mrg /* 160 1.43 rmind * Init all pagers and the pager_map. 161 1.6 mrg */ 162 1.1 mrg 163 1.6 mrg uvm_pager_init(); 164 1.1 mrg 165 1.6 mrg /* 166 1.41 rmind * Initialize the uvm_loan() facility. 167 1.41 rmind */ 168 1.41 rmind 169 1.41 rmind uvm_loan_init(); 170 1.41 rmind 171 1.41 rmind /* 172 1.53 ad * Enable paging of kernel objects. 173 1.55 chs * This second pass of initializing kernel_object requires rw_obj, 174 1.55 chs * so initialize that first. 175 1.6 mrg */ 176 1.3 chs 177 1.18 thorpej uao_create(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS, 178 1.18 thorpej UAO_FLAG_KERNSWAP); 179 1.1 mrg 180 1.26 yamt uvmpdpol_reinit(); 181 1.26 yamt 182 1.6 mrg /* 183 1.43 rmind * Init anonymous memory systems. 184 1.22 yamt */ 185 1.22 yamt 186 1.22 yamt uvm_anon_init(); 187 1.31 ad 188 1.32 yamt uvm_uarea_init(); 189 1.32 yamt 190 1.31 ad /* 191 1.43 rmind * Init readahead mechanism. 192 1.31 ad */ 193 1.31 ad 194 1.31 ad uvm_ra_init(); 195 1.56 riastrad 196 1.56 riastrad /* 197 1.56 riastrad * Initialize random source for page fault events. 198 1.56 riastrad */ 199 1.56 riastrad 200 1.56 riastrad rnd_attach_source(&uvm_fault_rndsource, "uvmfault", RND_TYPE_VM, 201 1.56 riastrad RND_FLAG_COLLECT_TIME|RND_FLAG_COLLECT_VALUE| 202 1.56 riastrad RND_FLAG_ESTIMATE_VALUE); 203 1.1 mrg } 204