1 /* $NetBSD: pmap.h,v 1.4 2003/04/09 22:37:32 matt Exp $ */ 2 3 /*- 4 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 5 * Copyright (C) 1995, 1996 TooLs GmbH. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by TooLs GmbH. 19 * 4. The name of TooLs GmbH may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #ifndef _POWERPC_OEA_PMAP_H_ 35 #define _POWERPC_OEA_PMAP_H_ 36 37 #include <powerpc/oea/pte.h> 38 39 #ifndef _LOCORE 40 /* 41 * Pmap stuff 42 */ 43 struct pmap { 44 register_t pm_sr[16]; /* segments used in this pmap */ 45 int pm_refs; /* ref count */ 46 struct pmap_statistics pm_stats; /* pmap statistics */ 47 unsigned int pm_evictions; /* pvo's not in page table */ 48 }; 49 50 typedef struct pmap *pmap_t; 51 52 #ifdef _KERNEL 53 #include <sys/systm.h> 54 55 extern register_t iosrtable[]; 56 extern int pmap_use_altivec; 57 extern struct pmap kernel_pmap_; 58 #define pmap_kernel() (&kernel_pmap_) 59 60 #define pmap_clear_modify(pg) (pmap_clear_bit((pg), PTE_CHG)) 61 #define pmap_clear_reference(pg) (pmap_clear_bit((pg), PTE_REF)) 62 #define pmap_is_modified(pg) (pmap_query_bit((pg), PTE_CHG)) 63 #define pmap_is_referenced(pg) (pmap_query_bit((pg), PTE_REF)) 64 65 #define pmap_phys_address(x) (x) 66 67 #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count) 68 #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) 69 70 /* ARGSUSED */ 71 static __inline void 72 pmap_remove_all(struct pmap *pmap) 73 { 74 /* Nothing. */ 75 } 76 77 void pmap_bootstrap (vaddr_t kernelstart, vaddr_t kernelend); 78 boolean_t pmap_extract (struct pmap *, vaddr_t, paddr_t *); 79 boolean_t pmap_query_bit (struct vm_page *, int); 80 boolean_t pmap_clear_bit (struct vm_page *, int); 81 void pmap_real_memory (paddr_t *, psize_t *); 82 void pmap_pinit (struct pmap *); 83 boolean_t pmap_pageidlezero (paddr_t); 84 void pmap_syncicache (paddr_t, psize_t); 85 86 #define PMAP_NEED_PROCWR 87 void pmap_procwr (struct proc *, vaddr_t, size_t); 88 89 int pmap_pte_spill(struct pmap *, vaddr_t); 90 91 #define PMAP_NC 0x1000 92 93 #define PMAP_STEAL_MEMORY 94 static __inline paddr_t vtophys (vaddr_t); 95 96 #if 1 97 /* 98 * Alternate mapping hooks for pool pages. Avoids thrashing the TLB. 99 * 100 * Note: This won't work if we have more memory than can be direct-mapped 101 * VA==PA all at once. But pmap_copy_page() and pmap_zero_page() will have 102 * this problem, too. 103 */ 104 #define PMAP_MAP_POOLPAGE(pa) (pa) 105 #define PMAP_UNMAP_POOLPAGE(pa) (pa) 106 #endif 107 #define POOL_VTOPHYS(va) vtophys((vaddr_t) va) 108 109 110 static __inline paddr_t 111 vtophys(vaddr_t va) 112 { 113 paddr_t pa; 114 115 if (pmap_extract(pmap_kernel(), va, &pa)) 116 return pa; 117 KASSERT(0); 118 return (paddr_t) -1; 119 } 120 121 #endif /* _KERNEL */ 122 #endif /* _LOCORE */ 123 124 #endif /* _POWERPC_OEA_PMAP_H_ */ 125