pmap.h revision 1.35.34.1 1 1.35.34.1 bouyer /* $NetBSD: pmap.h,v 1.35.34.1 2008/01/11 19:19:08 bouyer Exp $ */
2 1.1 leo
3 1.1 leo /*
4 1.1 leo * Copyright (c) 1991 Regents of the University of California.
5 1.1 leo * All rights reserved.
6 1.31 agc *
7 1.31 agc * This code is derived from software contributed to Berkeley by
8 1.31 agc * the Systems Programming Group of the University of Utah Computer
9 1.31 agc * Science Department.
10 1.31 agc *
11 1.31 agc * Redistribution and use in source and binary forms, with or without
12 1.31 agc * modification, are permitted provided that the following conditions
13 1.31 agc * are met:
14 1.31 agc * 1. Redistributions of source code must retain the above copyright
15 1.31 agc * notice, this list of conditions and the following disclaimer.
16 1.31 agc * 2. Redistributions in binary form must reproduce the above copyright
17 1.31 agc * notice, this list of conditions and the following disclaimer in the
18 1.31 agc * documentation and/or other materials provided with the distribution.
19 1.31 agc * 3. Neither the name of the University nor the names of its contributors
20 1.31 agc * may be used to endorse or promote products derived from this software
21 1.31 agc * without specific prior written permission.
22 1.31 agc *
23 1.31 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 1.31 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.31 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.31 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 1.31 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 1.31 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 1.31 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.31 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 1.31 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 1.31 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 1.31 agc * SUCH DAMAGE.
34 1.31 agc *
35 1.31 agc * @(#)pmap.h 7.6 (Berkeley) 5/10/91
36 1.31 agc */
37 1.31 agc
38 1.31 agc /*
39 1.31 agc * Copyright (c) 1987 Carnegie-Mellon University
40 1.1 leo *
41 1.1 leo * This code is derived from software contributed to Berkeley by
42 1.1 leo * the Systems Programming Group of the University of Utah Computer
43 1.1 leo * Science Department.
44 1.1 leo *
45 1.1 leo * Redistribution and use in source and binary forms, with or without
46 1.1 leo * modification, are permitted provided that the following conditions
47 1.1 leo * are met:
48 1.1 leo * 1. Redistributions of source code must retain the above copyright
49 1.1 leo * notice, this list of conditions and the following disclaimer.
50 1.1 leo * 2. Redistributions in binary form must reproduce the above copyright
51 1.1 leo * notice, this list of conditions and the following disclaimer in the
52 1.1 leo * documentation and/or other materials provided with the distribution.
53 1.1 leo * 3. All advertising materials mentioning features or use of this software
54 1.1 leo * must display the following acknowledgement:
55 1.1 leo * This product includes software developed by the University of
56 1.1 leo * California, Berkeley and its contributors.
57 1.1 leo * 4. Neither the name of the University nor the names of its contributors
58 1.1 leo * may be used to endorse or promote products derived from this software
59 1.1 leo * without specific prior written permission.
60 1.1 leo *
61 1.1 leo * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
62 1.1 leo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
63 1.1 leo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
64 1.1 leo * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
65 1.1 leo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
66 1.1 leo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
67 1.1 leo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
68 1.1 leo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
69 1.1 leo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
70 1.1 leo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
71 1.1 leo * SUCH DAMAGE.
72 1.1 leo *
73 1.1 leo * @(#)pmap.h 7.6 (Berkeley) 5/10/91
74 1.1 leo */
75 1.1 leo
76 1.1 leo #ifndef _MACHINE_PMAP_H_
77 1.1 leo #define _MACHINE_PMAP_H_
78 1.1 leo
79 1.35.34.1 bouyer #include <sys/simplelock.h>
80 1.35.34.1 bouyer
81 1.1 leo /*
82 1.9 leo * Pmap stuff
83 1.1 leo */
84 1.1 leo struct pmap {
85 1.9 leo pt_entry_t *pm_ptab; /* KVA of page table */
86 1.9 leo st_entry_t *pm_stab; /* KVA of segment table */
87 1.9 leo int pm_stfree; /* 040: free lev2 blocks */
88 1.9 leo u_int *pm_stpa; /* 040: ST phys. address */
89 1.9 leo short pm_sref; /* segment table ref count */
90 1.9 leo short pm_count; /* pmap reference count */
91 1.9 leo long pm_ptpages; /* more stats: PT pages */
92 1.25 chs struct simplelock pm_lock; /* lock on pmap */
93 1.1 leo struct pmap_statistics pm_stats; /* pmap statistics */
94 1.1 leo };
95 1.1 leo
96 1.1 leo typedef struct pmap *pmap_t;
97 1.1 leo
98 1.1 leo /*
99 1.9 leo * On the 040 we keep track of which level 2 blocks are already in use
100 1.9 leo * with the pm_stfree mask. Bits are arranged from LSB (block 0) to MSB
101 1.9 leo * (block 31). For convenience, the level 1 table is considered to be
102 1.9 leo * block 0.
103 1.9 leo *
104 1.9 leo * MAX[KU]L2SIZE control how many pages of level 2 descriptors are allowed.
105 1.9 leo * for the kernel and users. 16 implies only the initial "segment table"
106 1.9 leo * page is used. WARNING: don't change MAXUL2SIZE unless you can allocate
107 1.9 leo * physically contiguous pages for the ST in pmap.c!
108 1.9 leo */
109 1.9 leo #define MAXKL2SIZE 32
110 1.9 leo #define MAXUL2SIZE 16
111 1.9 leo #define l2tobm(n) (1 << (n))
112 1.9 leo #define bmtol2(n) (ffs(n) - 1)
113 1.9 leo
114 1.9 leo /*
115 1.1 leo * Macros for speed
116 1.1 leo */
117 1.15 thorpej #define PMAP_ACTIVATE(pmap, loadhw) \
118 1.12 thorpej { \
119 1.15 thorpej if ((loadhw)) \
120 1.19 leo loadustp(m68k_btop((pmap)->pm_stpa)); \
121 1.12 thorpej }
122 1.1 leo
123 1.1 leo /*
124 1.6 leo * Description of the memory segments. Build in atari_init/start_c().
125 1.6 leo * This gives a better separation between machine dependent stuff and
126 1.6 leo * the pmap-module.
127 1.6 leo */
128 1.8 leo #define NMEM_SEGS 8
129 1.8 leo struct memseg {
130 1.19 leo paddr_t start; /* PA of first page in segment */
131 1.19 leo paddr_t end; /* PA of last page in segment */
132 1.19 leo int first_page; /* relative page# of 'start' */
133 1.6 leo };
134 1.6 leo
135 1.6 leo /*
136 1.26 chs * For each struct vm_page, there is a list of all currently valid virtual
137 1.1 leo * mappings of that page. An entry is a pv_entry_t, the list is pv_table.
138 1.1 leo */
139 1.1 leo typedef struct pv_entry {
140 1.1 leo struct pv_entry *pv_next; /* next pv_entry */
141 1.1 leo struct pmap *pv_pmap; /* pmap where mapping lies */
142 1.19 leo vaddr_t pv_va; /* virtual address for mapping */
143 1.1 leo u_int *pv_ptste; /* non-zero if VA maps a PT page */
144 1.1 leo struct pmap *pv_ptpmap; /* if pv_ptste, pmap for PT page */
145 1.1 leo int pv_flags; /* flags */
146 1.1 leo } *pv_entry_t;
147 1.1 leo
148 1.1 leo #define PV_CI 0x01 /* all entries must be cache inhibited */
149 1.1 leo #define PV_PTPAGE 0x02 /* entry maps a page table page */
150 1.1 leo
151 1.9 leo struct pv_page;
152 1.9 leo
153 1.9 leo struct pv_page_info {
154 1.9 leo TAILQ_ENTRY(pv_page) pgi_list;
155 1.9 leo struct pv_entry *pgi_freelist;
156 1.9 leo int pgi_nfree;
157 1.9 leo };
158 1.9 leo
159 1.9 leo /*
160 1.9 leo * This is basically:
161 1.30 thorpej * ((PAGE_SIZE - sizeof(struct pv_page_info)) / sizeof(struct pv_entry))
162 1.9 leo */
163 1.9 leo #define NPVPPG 340
164 1.9 leo
165 1.9 leo struct pv_page {
166 1.9 leo struct pv_page_info pvp_pgi;
167 1.9 leo struct pv_entry pvp_pv[NPVPPG];
168 1.9 leo };
169 1.9 leo
170 1.2 leo #ifdef _KERNEL
171 1.8 leo /*
172 1.8 leo * Memory segment descriptors.
173 1.8 leo * - boot_segs
174 1.8 leo * describes the segments obtainted from the bootcode.
175 1.8 leo * - usable_segs
176 1.8 leo * describes the segments available after system requirements are
177 1.8 leo * substracted (reserved pages, etc...).
178 1.8 leo */
179 1.8 leo struct memseg boot_segs[NMEM_SEGS];
180 1.8 leo struct memseg usable_segs[NMEM_SEGS];
181 1.8 leo
182 1.3 mycroft pv_entry_t pv_table; /* array of entries, one per page */
183 1.3 mycroft u_int *Sysmap;
184 1.3 mycroft char *vmmap; /* map for mem, dumps, etc. */
185 1.3 mycroft struct pmap kernel_pmap_store;
186 1.1 leo
187 1.6 leo #define pmap_kernel() (&kernel_pmap_store)
188 1.1 leo #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
189 1.21 is #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count)
190 1.22 thorpej
191 1.27 chris #define pmap_update(pmap) /* nothing (yet) */
192 1.28 chs
193 1.34 perry static __inline void
194 1.29 chs pmap_remove_all(struct pmap *pmap)
195 1.28 chs {
196 1.28 chs /* Nothing. */
197 1.28 chs }
198 1.7 leo
199 1.12 thorpej #define active_user_pmap(pm) \
200 1.12 thorpej (curproc && \
201 1.12 thorpej (pm) != pmap_kernel() && (pm) == curproc->p_vmspace->vm_map.pmap)
202 1.12 thorpej
203 1.19 leo void pmap_bootstrap __P((psize_t, u_int, u_int));
204 1.35 thorpej void pmap_changebit __P((paddr_t, int, bool));
205 1.17 cgd
206 1.19 leo vaddr_t pmap_map __P((vaddr_t, paddr_t, paddr_t, int));
207 1.20 is void pmap_procwr __P((struct proc *, vaddr_t, u_long));
208 1.20 is #define PMAP_NEED_PROCWR
209 1.12 thorpej
210 1.5 leo #endif /* _KERNEL */
211 1.1 leo
212 1.1 leo #endif /* !_MACHINE_PMAP_H_ */
213