1 /* $NetBSD: pmap.c,v 1.5 2009/11/07 07:27:48 cegger Exp $ */ 2 3 /*- 4 * Copyright (c) 2007 Jared D. McNeill <jmcneill@invisible.ca> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <sys/cdefs.h> 30 __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.5 2009/11/07 07:27:48 cegger Exp $"); 31 32 #include <sys/types.h> 33 #include <sys/param.h> 34 #include <sys/mutex.h> 35 #include <sys/buf.h> 36 37 #include <uvm/uvm_page.h> 38 #include <uvm/uvm_pmap.h> 39 40 #include "opt_memsize.h" 41 42 struct pmap pmap_kernel_store; 43 static uint8_t pmap_memory[1024*MEMSIZE] __attribute__((__aligned__)); 44 static vaddr_t virtual_avail, virtual_end; 45 static vaddr_t pmap_maxkvaddr; 46 47 void pmap_bootstrap(void); 48 49 void 50 pmap_bootstrap(void) 51 { 52 #if 0 53 vsize_t bufsz; 54 #endif 55 56 virtual_avail = (vaddr_t)pmap_memory; 57 virtual_end = virtual_avail + sizeof(pmap_memory); 58 59 uvm_page_physload(atop(virtual_avail), 60 atop(virtual_end), 61 atop(virtual_avail + PAGE_SIZE), 62 atop(virtual_end), 63 VM_FREELIST_DEFAULT); 64 65 virtual_avail += PAGE_SIZE; 66 67 pmap_maxkvaddr = VM_MIN_KERNEL_ADDRESS; 68 #if 0 69 kmeminit_nkmempages(); 70 bufsz = buf_memcalc(); 71 if (buf_setvalimit(bufsz)) 72 panic("pmap_bootstrap: buf_setvalimit failed\n"); 73 #endif 74 } 75 76 void 77 pmap_init(void) 78 { 79 } 80 81 pmap_t 82 pmap_kernel(void) 83 { 84 return &pmap_kernel_store; 85 } 86 87 void 88 pmap_virtual_space(vaddr_t *vstartp, vaddr_t *vendp) 89 { 90 *vstartp = virtual_avail; 91 *vendp = virtual_end; 92 } 93 94 /* XXXJDM */ 95 static struct pmap_list { 96 bool used; 97 struct pmap pmap; 98 } pmap_list[128]; 99 100 pmap_t 101 pmap_create(void) 102 { 103 int i; 104 105 for (i = 0; i < __arraycount(pmap_list); i++) 106 if (pmap_list[i].used == false) { 107 pmap_list[i].used = true; 108 return &pmap_list[i].pmap; 109 } 110 111 printf("pmap_create: out of space\n"); 112 return NULL; 113 } 114 115 void 116 pmap_destroy(pmap_t pmap) 117 { 118 int i; 119 120 for (i = 0; i < __arraycount(pmap_list); i++) 121 if (pmap == &pmap_list[i].pmap) { 122 pmap_list[i].used = false; 123 break; 124 } 125 } 126 127 void 128 pmap_reference(pmap_t pmap) 129 { 130 } 131 132 long 133 pmap_resident_count(pmap_t pmap) 134 { 135 printf("pmap_resident_count\n"); 136 return 1; 137 } 138 139 long 140 pmap_wired_count(pmap_t pmap) 141 { 142 printf("pmap_wired_count\n"); 143 return 1; 144 } 145 146 int 147 pmap_enter(pmap_t pmap, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags) 148 { 149 return 0; 150 } 151 152 void 153 pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva) 154 { 155 } 156 157 void 158 pmap_remove_all(pmap_t pmap) 159 { 160 } 161 162 void 163 pmap_protect(pmap_t pmap, vaddr_t sva, vaddr_t eva, vm_prot_t prot) 164 { 165 } 166 167 void 168 pmap_unwire(pmap_t pmap, vaddr_t va) 169 { 170 } 171 172 bool 173 pmap_extract(pmap_t pmap, vaddr_t va, paddr_t *pap) 174 { 175 /* XXXJDM */ 176 *pap = va; 177 return true; 178 } 179 180 void 181 pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags) 182 { 183 } 184 185 void 186 pmap_kremove(vaddr_t va, vsize_t size) 187 { 188 } 189 190 void 191 pmap_copy(pmap_t dst_map, pmap_t src_map, vaddr_t dst_addr, vsize_t len, 192 vaddr_t src_addr) 193 { 194 } 195 196 void 197 pmap_update(pmap_t pmap) 198 { 199 } 200 201 void 202 pmap_activate(struct lwp *l) 203 { 204 } 205 206 void 207 pmap_deactivate(struct lwp *l) 208 { 209 } 210 211 void 212 pmap_zero_page(paddr_t pa) 213 { 214 } 215 216 void 217 pmap_copy_page(paddr_t src, paddr_t dst) 218 { 219 } 220 221 void 222 pmap_page_protect(struct vm_page *pg, vm_prot_t prot) 223 { 224 } 225 226 bool 227 pmap_clear_modify(struct vm_page *pg) 228 { 229 return true; 230 } 231 232 bool 233 pmap_clear_reference(struct vm_page *pg) 234 { 235 return true; 236 } 237 238 bool 239 pmap_is_modified(struct vm_page *pg) 240 { 241 return false; 242 } 243 244 bool 245 pmap_is_referenced(struct vm_page *pg) 246 { 247 return false; 248 } 249 250 paddr_t 251 pmap_phys_address(paddr_t cookie) 252 { 253 return ptoa(cookie); 254 } 255 256 vaddr_t 257 pmap_growkernel(vaddr_t maxkvaddr) 258 { 259 pmap_maxkvaddr = maxkvaddr; 260 return maxkvaddr; 261 } 262