1 /* $NetBSD: pmap_kernel.c,v 1.8 2011/06/20 08:07:03 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.8 2011/06/20 08:07:03 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 u_int 45 powerpc_mmap_flags(paddr_t pa) 46 { 47 u_int flags = PMAP_MD_NOCACHE; 48 49 if (pa & POWERPC_MMAP_FLAG_PREFETCHABLE) 50 flags |= PMAP_MD_PREFETCHABLE; 51 if (pa & POWERPC_MMAP_FLAG_CACHEABLE) 52 flags &= ~PMAP_MD_NOCACHE; 53 return flags; 54 } 55 56 #ifdef PMAP_NEEDS_FIXUP 57 #include <powerpc/instr.h> 58 59 const struct pmap_ops *pmapops; 60 61 #define __stub __section(".stub") __noprofile 62 63 int pmap_pte_spill(struct pmap *, vaddr_t, bool) __stub; 64 void pmap_real_memory(paddr_t *, psize_t *) __stub; 65 void pmap_init(void) __stub; 66 void pmap_virtual_space(vaddr_t *, vaddr_t *) __stub; 67 pmap_t pmap_create(void) __stub; 68 void pmap_reference(pmap_t) __stub; 69 void pmap_destroy(pmap_t) __stub; 70 void pmap_copy(pmap_t, pmap_t, vaddr_t, vsize_t, vaddr_t) __stub; 71 void pmap_update(pmap_t) __stub; 72 int pmap_enter(pmap_t, vaddr_t, paddr_t, vm_prot_t, u_int) __stub; 73 void pmap_remove(pmap_t, vaddr_t, vaddr_t) __stub; 74 void pmap_kenter_pa(vaddr_t, paddr_t, vm_prot_t, u_int) __stub; 75 void pmap_kremove(vaddr_t, vsize_t) __stub; 76 bool pmap_extract(pmap_t, vaddr_t, paddr_t *) __stub; 77 78 void pmap_protect(pmap_t, vaddr_t, vaddr_t, vm_prot_t) __stub; 79 void pmap_unwire(pmap_t, vaddr_t) __stub; 80 void pmap_page_protect(struct vm_page *, vm_prot_t) __stub; 81 bool pmap_query_bit(struct vm_page *, int) __stub; 82 bool pmap_clear_bit(struct vm_page *, int) __stub; 83 84 void pmap_activate(struct lwp *) __stub; 85 void pmap_deactivate(struct lwp *) __stub; 86 87 void pmap_pinit(pmap_t) __stub; 88 void pmap_procwr(struct proc *, vaddr_t, size_t) __stub; 89 90 #if defined(DEBUG) || defined(PMAPCHECK) || defined(DDB) 91 void pmap_pte_print(volatile struct pte *) __stub; 92 void pmap_pteg_check(void) __stub; 93 void pmap_print_mmuregs(void) __stub; 94 void pmap_print_pte(pmap_t, vaddr_t) __stub; 95 void pmap_pteg_dist(void) __stub; 96 #endif 97 #if defined(DEBUG) || defined(PMAPCHECK) 98 void pmap_pvo_verify(void) __stub; 99 #endif 100 vaddr_t pmap_steal_memory(vsize_t, vaddr_t *, vaddr_t *) __stub; 101 void pmap_bootstrap(paddr_t, paddr_t) __stub; 102 103 int 104 pmap_pte_spill(struct pmap *pm, vaddr_t va, bool exec) 105 { 106 return (*pmapops->pmapop_pte_spill)(pm, va, exec); 107 } 108 109 void 110 pmap_real_memory(paddr_t *start, psize_t *size) 111 { 112 (*pmapops->pmapop_real_memory)(start, size); 113 } 114 115 void 116 pmap_init(void) 117 { 118 (*pmapops->pmapop_init)(); 119 } 120 121 void 122 pmap_virtual_space(vaddr_t *startp, vaddr_t *endp) 123 { 124 (*pmapops->pmapop_virtual_space)(startp, endp); 125 } 126 127 pmap_t 128 pmap_create(void) 129 { 130 return (*pmapops->pmapop_create)(); 131 } 132 133 void 134 pmap_reference(pmap_t pm) 135 { 136 (*pmapops->pmapop_reference)(pm); 137 } 138 139 void 140 pmap_destroy(pmap_t pm) 141 { 142 (*pmapops->pmapop_destroy)(pm); 143 } 144 145 void 146 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_va, vsize_t len, 147 vaddr_t src_va) 148 { 149 (*pmapops->pmapop_copy)(dst_pmap, src_pmap, dst_va, len, src_va); 150 } 151 152 void 153 pmap_update(pmap_t pm) 154 { 155 (*pmapops->pmapop_update)(pm); 156 } 157 158 int 159 pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags) 160 { 161 return (*pmapops->pmapop_enter)(pm, va, pa, prot, flags); 162 } 163 164 void 165 pmap_remove(pmap_t pm, vaddr_t start, vaddr_t end) 166 { 167 (*pmapops->pmapop_remove)(pm, start, end); 168 } 169 170 void 171 pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags) 172 { 173 (*pmapops->pmapop_kenter_pa)(va, pa, prot, flags); 174 } 175 176 void 177 pmap_kremove(vaddr_t start, vsize_t end) 178 { 179 (*pmapops->pmapop_kremove)(start, end); 180 } 181 182 bool 183 pmap_extract(pmap_t pm, vaddr_t va, paddr_t *pap) 184 { 185 return (*pmapops->pmapop_extract)(pm, va, pap); 186 } 187 188 void 189 pmap_protect(pmap_t pm, vaddr_t start, vaddr_t end, vm_prot_t prot) 190 { 191 (*pmapops->pmapop_protect)(pm, start, end, prot); 192 } 193 194 void 195 pmap_unwire(pmap_t pm, vaddr_t va) 196 { 197 (*pmapops->pmapop_unwire)(pm, va); 198 } 199 200 void 201 pmap_page_protect(struct vm_page *pg, vm_prot_t prot) 202 { 203 (*pmapops->pmapop_page_protect)(pg, prot); 204 } 205 206 bool 207 pmap_query_bit(struct vm_page *pg, int ptebit) 208 { 209 return (*pmapops->pmapop_query_bit)(pg, ptebit); 210 } 211 212 bool 213 pmap_clear_bit(struct vm_page *pg, int ptebit) 214 { 215 return (*pmapops->pmapop_clear_bit)(pg, ptebit); 216 } 217 218 void 219 pmap_activate(struct lwp *l) 220 { 221 (*pmapops->pmapop_activate)(l); 222 } 223 224 void 225 pmap_deactivate(struct lwp *l) 226 { 227 (*pmapops->pmapop_deactivate)(l); 228 } 229 230 void 231 pmap_pinit(pmap_t pm) 232 { 233 (*pmapops->pmapop_pinit)(pm); 234 } 235 236 void 237 pmap_procwr(struct proc *p, vaddr_t va, size_t len) 238 { 239 (*pmapops->pmapop_procwr)(p, va, len); 240 } 241 242 #if defined(DEBUG) || defined(PMAPCHECK) || defined(DDB) 243 void 244 pmap_pte_print(volatile struct pte *ptep) 245 { 246 (*pmapops->pmapop_pte_print)(ptep); 247 } 248 249 void 250 pmap_pteg_check(void) 251 { 252 (*pmapops->pmapop_pteg_check)(); 253 } 254 255 void 256 pmap_print_mmuregs(void) 257 { 258 (*pmapops->pmapop_print_mmuregs)(); 259 } 260 261 void 262 pmap_print_pte(pmap_t pm, vaddr_t va) 263 { 264 (*pmapops->pmapop_print_pte)(pm, va); 265 } 266 267 void 268 pmap_pteg_dist(void) 269 { 270 (*pmapops->pmapop_pteg_dist)(); 271 } 272 #endif 273 274 #if defined(DEBUG) || defined(PMAPCHECK) 275 void 276 pmap_pvo_verify(void) 277 { 278 (*pmapops->pmapop_pvo_verify)(); 279 } 280 #endif 281 282 vaddr_t 283 pmap_steal_memory(vsize_t vsize, vaddr_t *vstartp, vaddr_t *vendp) 284 { 285 return (*pmapops->pmapop_steal_memory)(vsize, vstartp, vendp); 286 } 287 288 void 289 pmap_bootstrap(paddr_t startkernel, paddr_t endkernel) 290 { 291 (*pmapops->pmapop_bootstrap)(startkernel, endkernel); 292 } 293 #endif 294