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