1 /* $NetBSD: pmap_kernel.c,v 1.3 2011/02/12 18:23:10 matt Exp $ */ 2 /*- 3 * Copyright (c) 2011 The NetBSD Foundation, Inc. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to The NetBSD Foundation 7 * by Matt Thomas of 3am Software Foundry. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include <sys/cdefs.h> 32 33 __KERNEL_RCSID(1, "$NetBSD: pmap_kernel.c,v 1.3 2011/02/12 18:23:10 matt Exp $"); 34 35 #include "opt_ddb.h" 36 #include "opt_pmap.h" 37 38 #include <sys/param.h> 39 #include <uvm/uvm_extern.h> 40 41 extern struct pmap kernel_pmap_; 42 struct pmap *const kernel_pmap_ptr = &kernel_pmap_; 43 44 #ifdef PMAP_NEEDS_FIXUP 45 #include <powerpc/instr.h> 46 47 const struct pmap_ops *pmapops; 48 49 void 50 pmap_fixup_stubs(const struct pmap_ops *ops) 51 { 52 extern uint32_t _ftext[], _etext[]; 53 extern uint32_t __stub_pmap_start[], __stub_pmap_end[]; 54 55 pmapops = ops; 56 57 powerpc_fixup_stubs(_ftext, _etext, __stub_pmap_start, __stub_pmap_end); 58 } 59 60 #define __stub __section(".stub.pmap") 61 62 int pmap_pte_spill(struct pmap *, vaddr_t, bool) __stub; 63 void pmap_real_memory(paddr_t *, psize_t *) __stub; 64 void pmap_init(void) __stub; 65 void pmap_virtual_space(vaddr_t *, vaddr_t *) __stub; 66 pmap_t pmap_create(void) __stub; 67 void pmap_reference(pmap_t) __stub; 68 void pmap_destroy(pmap_t) __stub; 69 void pmap_copy(pmap_t, pmap_t, vaddr_t, vsize_t, vaddr_t) __stub; 70 void pmap_update(pmap_t) __stub; 71 int pmap_enter(pmap_t, vaddr_t, paddr_t, vm_prot_t, u_int) __stub; 72 void pmap_remove(pmap_t, vaddr_t, vaddr_t) __stub; 73 void pmap_kenter_pa(vaddr_t, paddr_t, vm_prot_t, u_int) __stub; 74 void pmap_kremove(vaddr_t, vsize_t) __stub; 75 bool pmap_extract(pmap_t, vaddr_t, paddr_t *) __stub; 76 77 void pmap_protect(pmap_t, vaddr_t, vaddr_t, vm_prot_t) __stub; 78 void pmap_unwire(pmap_t, vaddr_t) __stub; 79 void pmap_page_protect(struct vm_page *, vm_prot_t) __stub; 80 bool pmap_query_bit(struct vm_page *, int) __stub; 81 bool pmap_clear_bit(struct vm_page *, int) __stub; 82 83 void pmap_activate(struct lwp *) __stub; 84 void pmap_deactivate(struct lwp *) __stub; 85 86 void pmap_pinit(pmap_t) __stub; 87 void pmap_procwr(struct proc *, vaddr_t, size_t) __stub; 88 89 #if defined(DEBUG) || defined(PMAPCHECK) || defined(DDB) 90 void pmap_pte_print(volatile struct pte *) __stub; 91 void pmap_pteg_check(void) __stub; 92 void pmap_print_mmuregs(void) __stub; 93 void pmap_print_pte(pmap_t, vaddr_t) __stub; 94 void pmap_pteg_dist(void) __stub; 95 #endif 96 #if defined(DEBUG) || defined(PMAPCHECK) 97 void pmap_pvo_verify(void) __stub; 98 #endif 99 vaddr_t pmap_steal_memory(vsize_t, vaddr_t *, vaddr_t *) __stub; 100 void pmap_bootstrap(paddr_t, paddr_t) __stub; 101 102 int 103 pmap_pte_spill(struct pmap *pm, vaddr_t va, bool exec) 104 { 105 return (*pmapops->pmapop_pte_spill)(pm, va, exec); 106 } 107 108 void 109 pmap_real_memory(paddr_t *start, psize_t *size) 110 { 111 (*pmapops->pmapop_real_memory)(start, size); 112 } 113 114 void 115 pmap_init(void) 116 { 117 (*pmapops->pmapop_init)(); 118 } 119 120 void 121 pmap_virtual_space(vaddr_t *startp, vaddr_t *endp) 122 { 123 (*pmapops->pmapop_virtual_space)(startp, endp); 124 } 125 126 pmap_t 127 pmap_create(void) 128 { 129 return (*pmapops->pmapop_create)(); 130 } 131 132 void 133 pmap_reference(pmap_t pm) 134 { 135 (*pmapops->pmapop_reference)(pm); 136 } 137 138 void 139 pmap_destroy(pmap_t pm) 140 { 141 (*pmapops->pmapop_destroy)(pm); 142 } 143 144 void 145 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_va, vsize_t len, 146 vaddr_t src_va) 147 { 148 (*pmapops->pmapop_copy)(dst_pmap, src_pmap, dst_va, len, src_va); 149 } 150 151 void 152 pmap_update(pmap_t pm) 153 { 154 (*pmapops->pmapop_update)(pm); 155 } 156 157 int 158 pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags) 159 { 160 return (*pmapops->pmapop_enter)(pm, va, pa, prot, flags); 161 } 162 163 void 164 pmap_remove(pmap_t pm, vaddr_t start, vaddr_t end) 165 { 166 (*pmapops->pmapop_remove)(pm, start, end); 167 } 168 169 void 170 pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags) 171 { 172 (*pmapops->pmapop_kenter_pa)(va, pa, prot, flags); 173 } 174 175 void 176 pmap_kremove(vaddr_t start, vsize_t end) 177 { 178 (*pmapops->pmapop_kremove)(start, end); 179 } 180 181 bool 182 pmap_extract(pmap_t pm, vaddr_t va, paddr_t *pap) 183 { 184 return (*pmapops->pmapop_extract)(pm, va, pap); 185 } 186 187 void 188 pmap_protect(pmap_t pm, vaddr_t start, vaddr_t end, vm_prot_t prot) 189 { 190 (*pmapops->pmapop_protect)(pm, start, end, prot); 191 } 192 193 void 194 pmap_unwire(pmap_t pm, vaddr_t va) 195 { 196 (*pmapops->pmapop_unwire)(pm, va); 197 } 198 199 void 200 pmap_page_protect(struct vm_page *pg, vm_prot_t prot) 201 { 202 (*pmapops->pmapop_page_protect)(pg, prot); 203 } 204 205 bool 206 pmap_query_bit(struct vm_page *pg, int ptebit) 207 { 208 return (*pmapops->pmapop_query_bit)(pg, ptebit); 209 } 210 211 bool 212 pmap_clear_bit(struct vm_page *pg, int ptebit) 213 { 214 return (*pmapops->pmapop_clear_bit)(pg, ptebit); 215 } 216 217 void 218 pmap_activate(struct lwp *l) 219 { 220 (*pmapops->pmapop_activate)(l); 221 } 222 223 void 224 pmap_deactivate(struct lwp *l) 225 { 226 (*pmapops->pmapop_deactivate)(l); 227 } 228 229 void 230 pmap_pinit(pmap_t pm) 231 { 232 (*pmapops->pmapop_pinit)(pm); 233 } 234 235 void 236 pmap_procwr(struct proc *p, vaddr_t va, size_t len) 237 { 238 (*pmapops->pmapop_procwr)(p, va, len); 239 } 240 241 #if defined(DEBUG) || defined(PMAPCHECK) || defined(DDB) 242 void 243 pmap_pte_print(volatile struct pte *ptep) 244 { 245 (*pmapops->pmapop_pte_print)(ptep); 246 } 247 248 void 249 pmap_pteg_check(void) 250 { 251 (*pmapops->pmapop_pteg_check)(); 252 } 253 254 void 255 pmap_print_mmuregs(void) 256 { 257 (*pmapops->pmapop_print_mmuregs)(); 258 } 259 260 void 261 pmap_print_pte(pmap_t pm, vaddr_t va) 262 { 263 (*pmapops->pmapop_print_pte)(pm, va); 264 } 265 266 void 267 pmap_pteg_dist(void) 268 { 269 (*pmapops->pmapop_pteg_dist)(); 270 } 271 #endif 272 273 #if defined(DEBUG) || defined(PMAPCHECK) 274 void 275 pmap_pvo_verify(void) 276 { 277 (*pmapops->pmapop_pvo_verify)(void) 278 } 279 #endif 280 281 vaddr_t 282 pmap_steal_memory(vsize_t vsize, vaddr_t *vstartp, vaddr_t *vendp) 283 { 284 return (*pmapops->pmapop_steal_memory)(vsize, vstartp, vendp); 285 } 286 287 void 288 pmap_bootstrap(paddr_t startkernel, paddr_t endkernel) 289 { 290 (*pmapops->pmapop_bootstrap)(startkernel, endkernel); 291 } 292 #endif 293