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