pmap.h revision 133451
1189251Ssam/* 2189251Ssam * Copyright (c) 1991 Regents of the University of California. 3252726Srpaulo * All rights reserved. 4189251Ssam * 5252726Srpaulo * This code is derived from software contributed to Berkeley by 6252726Srpaulo * the Systems Programming Group of the University of Utah Computer 7189251Ssam * Science Department and William Jolitz of UUNET Technologies Inc. 8189251Ssam * 9189251Ssam * Redistribution and use in source and binary forms, with or without 10189251Ssam * modification, are permitted provided that the following conditions 11189251Ssam * are met: 12189251Ssam * 1. Redistributions of source code must retain the above copyright 13189251Ssam * notice, this list of conditions and the following disclaimer. 14189251Ssam * 2. Redistributions in binary form must reproduce the above copyright 15189251Ssam * notice, this list of conditions and the following disclaimer in the 16252726Srpaulo * documentation and/or other materials provided with the distribution. 17252726Srpaulo * 4. Neither the name of the University nor the names of its contributors 18189251Ssam * may be used to endorse or promote products derived from this software 19189251Ssam * without specific prior written permission. 20214734Srpaulo * 21214734Srpaulo * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22189251Ssam * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23189251Ssam * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24252726Srpaulo * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25189251Ssam * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26189251Ssam * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27214734Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28189251Ssam * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29189251Ssam * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30214734Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31214734Srpaulo * SUCH DAMAGE. 32214734Srpaulo * 33214734Srpaulo * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 34214734Srpaulo * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 35252726Srpaulo * from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30 36189251Ssam * $FreeBSD: head/sys/sparc64/include/pmap.h 133451 2004-08-10 20:53:26Z alc $ 37189251Ssam */ 38189251Ssam 39214734Srpaulo#ifndef _MACHINE_PMAP_H_ 40214734Srpaulo#define _MACHINE_PMAP_H_ 41252726Srpaulo 42214734Srpaulo#include <sys/queue.h> 43252726Srpaulo#include <sys/_lock.h> 44252726Srpaulo#include <sys/_mutex.h> 45214734Srpaulo#include <machine/cache.h> 46214734Srpaulo#include <machine/tte.h> 47252726Srpaulo 48214734Srpaulo#define PMAP_CONTEXT_MAX 8192 49214734Srpaulo 50252726Srpaulotypedef struct pmap *pmap_t; 51252726Srpaulo 52189251Ssamstruct md_page { 53189251Ssam TAILQ_HEAD(, tte) tte_list; 54189251Ssam struct pmap *pmap; 55252726Srpaulo uint32_t colors[DCACHE_COLORS]; 56189251Ssam int32_t color; 57189251Ssam uint32_t flags; 58252726Srpaulo}; 59252726Srpaulo 60189251Ssamstruct pmap { 61189251Ssam struct mtx pm_mtx; 62189251Ssam struct tte *pm_tsb; 63189251Ssam vm_object_t pm_tsb_obj; 64189251Ssam u_int pm_active; 65189251Ssam u_int pm_context[MAXCPU]; 66189251Ssam struct pmap_statistics pm_stats; 67189251Ssam}; 68189251Ssam 69252726Srpaulo#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) 70189251Ssam#define PMAP_LOCK_ASSERT(pmap, type) \ 71252726Srpaulo mtx_assert(&(pmap)->pm_mtx, (type)) 72189251Ssam#define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx) 73189251Ssam#define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \ 74189251Ssam NULL, MTX_DEF) 75189251Ssam#define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx) 76189251Ssam#define PMAP_MTX(pmap) (&(pmap)->pm_mtx) 77189251Ssam#define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) 78189251Ssam#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) 79189251Ssam 80189251Ssamvoid pmap_bootstrap(vm_offset_t ekva); 81189251Ssamvm_paddr_t pmap_kextract(vm_offset_t va); 82189251Ssamvoid pmap_kenter(vm_offset_t va, vm_page_t m); 83189251Ssamvoid pmap_kremove(vm_offset_t); 84189251Ssamvoid pmap_kenter_flags(vm_offset_t va, vm_paddr_t pa, u_long flags); 85189251Ssamvoid pmap_kremove_flags(vm_offset_t va); 86189251Ssamboolean_t pmap_page_is_mapped(vm_page_t m); 87189251Ssam 88189251Ssamint pmap_cache_enter(vm_page_t m, vm_offset_t va); 89189251Ssamvoid pmap_cache_remove(vm_page_t m, vm_offset_t va); 90189251Ssam 91189251Ssamint pmap_remove_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp, 92189251Ssam vm_offset_t va); 93189251Ssamint pmap_protect_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp, 94189251Ssam vm_offset_t va); 95189251Ssam 96189251Ssamvoid pmap_map_tsb(void); 97189251Ssam 98189251Ssamvoid pmap_clear_write(vm_page_t m); 99189251Ssam 100189251Ssam#define vtophys(va) pmap_kextract(((vm_offset_t)(va))) 101189251Ssam 102189251Ssamextern struct pmap kernel_pmap_store; 103189251Ssam#define kernel_pmap (&kernel_pmap_store) 104189251Ssamextern vm_paddr_t phys_avail[]; 105189251Ssamextern vm_offset_t virtual_avail; 106189251Ssamextern vm_offset_t virtual_end; 107189251Ssam 108214734Srpauloextern vm_paddr_t msgbuf_phys; 109189251Ssam 110189251Ssamstatic __inline int 111214734Srpaulopmap_track_modified(pmap_t pm, vm_offset_t va) 112189251Ssam{ 113189251Ssam if (pm == kernel_pmap) 114189251Ssam return ((va < kmi.clean_sva) || (va >= kmi.clean_eva)); 115189251Ssam else 116189251Ssam return (1); 117189251Ssam} 118189251Ssam 119189251Ssam#ifdef PMAP_STATS 120252726Srpaulo 121252726SrpauloSYSCTL_DECL(_debug_pmap_stats); 122189251Ssam 123189251Ssam#define PMAP_STATS_VAR(name) \ 124189251Ssam static long name; \ 125189251Ssam SYSCTL_LONG(_debug_pmap_stats, OID_AUTO, name, CTLFLAG_RW, \ 126189251Ssam &name, 0, "") 127189251Ssam 128189251Ssam#define PMAP_STATS_INC(var) \ 129189251Ssam atomic_add_long(&var, 1) 130189251Ssam 131189251Ssam#else 132189251Ssam 133189251Ssam#define PMAP_STATS_VAR(name) 134214734Srpaulo#define PMAP_STATS_INC(var) 135189251Ssam 136189251Ssam#endif 137189251Ssam 138189251Ssam#endif /* !_MACHINE_PMAP_H_ */ 139189251Ssam