pmap.h revision 195649
1260684Skaiw/*- 2260684Skaiw * Copyright (c) 1991 Regents of the University of California. 3260684Skaiw * All rights reserved. 4260684Skaiw * 5260684Skaiw * This code is derived from software contributed to Berkeley by 6260684Skaiw * the Systems Programming Group of the University of Utah Computer 7260684Skaiw * Science Department and William Jolitz of UUNET Technologies Inc. 8260684Skaiw * 9260684Skaiw * Redistribution and use in source and binary forms, with or without 10260684Skaiw * modification, are permitted provided that the following conditions 11260684Skaiw * are met: 12260684Skaiw * 1. Redistributions of source code must retain the above copyright 13260684Skaiw * notice, this list of conditions and the following disclaimer. 14260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright 15260684Skaiw * notice, this list of conditions and the following disclaimer in the 16260684Skaiw * documentation and/or other materials provided with the distribution. 17260684Skaiw * 4. Neither the name of the University nor the names of its contributors 18260684Skaiw * may be used to endorse or promote products derived from this software 19260684Skaiw * without specific prior written permission. 20260684Skaiw * 21260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24260684Skaiw * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31260684Skaiw * SUCH DAMAGE. 32280932Semaste * 33260684Skaiw * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 34260684Skaiw * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 35260684Skaiw * from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30 36260684Skaiw * $FreeBSD: head/sys/sparc64/include/pmap.h 195649 2009-07-12 23:31:20Z alc $ 37260684Skaiw */ 38260684Skaiw 39260684Skaiw#ifndef _MACHINE_PMAP_H_ 40260684Skaiw#define _MACHINE_PMAP_H_ 41260684Skaiw 42260684Skaiw#include <sys/queue.h> 43260684Skaiw#include <sys/_lock.h> 44260684Skaiw#include <sys/_mutex.h> 45260684Skaiw#include <machine/cache.h> 46260684Skaiw#include <machine/tte.h> 47260684Skaiw 48260684Skaiw#define PMAP_CONTEXT_MAX 8192 49260684Skaiw 50260684Skaiwtypedef struct pmap *pmap_t; 51260684Skaiw 52260684Skaiwstruct md_page { 53260684Skaiw TAILQ_HEAD(, tte) tte_list; 54260684Skaiw struct pmap *pmap; 55260684Skaiw uint32_t colors[DCACHE_COLORS]; 56260684Skaiw int32_t color; 57260684Skaiw uint32_t flags; 58260684Skaiw}; 59260684Skaiw 60260684Skaiwstruct pmap { 61260684Skaiw struct mtx pm_mtx; 62260684Skaiw struct tte *pm_tsb; 63260684Skaiw vm_object_t pm_tsb_obj; 64260684Skaiw u_int pm_active; 65260684Skaiw u_int pm_context[MAXCPU]; 66 struct pmap_statistics pm_stats; 67}; 68 69#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) 70#define PMAP_LOCK_ASSERT(pmap, type) \ 71 mtx_assert(&(pmap)->pm_mtx, (type)) 72#define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx) 73#define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \ 74 NULL, MTX_DEF | MTX_DUPOK) 75#define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx) 76#define PMAP_MTX(pmap) (&(pmap)->pm_mtx) 77#define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) 78#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) 79 80#define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT 81#define pmap_page_set_memattr(m, ma) (void)0 82 83void pmap_bootstrap(void); 84vm_paddr_t pmap_kextract(vm_offset_t va); 85void pmap_kenter(vm_offset_t va, vm_page_t m); 86void pmap_kremove(vm_offset_t); 87void pmap_kenter_flags(vm_offset_t va, vm_paddr_t pa, u_long flags); 88void pmap_kremove_flags(vm_offset_t va); 89boolean_t pmap_page_is_mapped(vm_page_t m); 90 91int pmap_cache_enter(vm_page_t m, vm_offset_t va); 92void pmap_cache_remove(vm_page_t m, vm_offset_t va); 93 94int pmap_remove_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp, 95 vm_offset_t va); 96int pmap_protect_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp, 97 vm_offset_t va); 98 99void pmap_map_tsb(void); 100 101#define vtophys(va) pmap_kextract((vm_offset_t)(va)) 102 103extern struct pmap kernel_pmap_store; 104#define kernel_pmap (&kernel_pmap_store) 105extern vm_paddr_t phys_avail[]; 106extern vm_offset_t virtual_avail; 107extern vm_offset_t virtual_end; 108 109#ifdef PMAP_STATS 110 111SYSCTL_DECL(_debug_pmap_stats); 112 113#define PMAP_STATS_VAR(name) \ 114 static long name; \ 115 SYSCTL_LONG(_debug_pmap_stats, OID_AUTO, name, CTLFLAG_RW, \ 116 &name, 0, "") 117 118#define PMAP_STATS_INC(var) \ 119 atomic_add_long(&var, 1) 120 121#else 122 123#define PMAP_STATS_VAR(name) 124#define PMAP_STATS_INC(var) 125 126#endif 127 128#endif /* !_MACHINE_PMAP_H_ */ 129