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