pmap.h revision 1.31 1 1.31 agc /* $NetBSD: pmap.h,v 1.31 2003/08/07 16:27:04 agc 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.1 leo /*
80 1.9 leo * Pmap stuff
81 1.1 leo */
82 1.1 leo struct pmap {
83 1.9 leo pt_entry_t *pm_ptab; /* KVA of page table */
84 1.9 leo st_entry_t *pm_stab; /* KVA of segment table */
85 1.9 leo int pm_stfree; /* 040: free lev2 blocks */
86 1.9 leo u_int *pm_stpa; /* 040: ST phys. address */
87 1.9 leo short pm_sref; /* segment table ref count */
88 1.9 leo short pm_count; /* pmap reference count */
89 1.9 leo long pm_ptpages; /* more stats: PT pages */
90 1.25 chs struct simplelock pm_lock; /* lock on pmap */
91 1.1 leo struct pmap_statistics pm_stats; /* pmap statistics */
92 1.1 leo };
93 1.1 leo
94 1.1 leo typedef struct pmap *pmap_t;
95 1.1 leo
96 1.1 leo /*
97 1.9 leo * On the 040 we keep track of which level 2 blocks are already in use
98 1.9 leo * with the pm_stfree mask. Bits are arranged from LSB (block 0) to MSB
99 1.9 leo * (block 31). For convenience, the level 1 table is considered to be
100 1.9 leo * block 0.
101 1.9 leo *
102 1.9 leo * MAX[KU]L2SIZE control how many pages of level 2 descriptors are allowed.
103 1.9 leo * for the kernel and users. 16 implies only the initial "segment table"
104 1.9 leo * page is used. WARNING: don't change MAXUL2SIZE unless you can allocate
105 1.9 leo * physically contiguous pages for the ST in pmap.c!
106 1.9 leo */
107 1.9 leo #define MAXKL2SIZE 32
108 1.9 leo #define MAXUL2SIZE 16
109 1.9 leo #define l2tobm(n) (1 << (n))
110 1.9 leo #define bmtol2(n) (ffs(n) - 1)
111 1.9 leo
112 1.9 leo /*
113 1.1 leo * Macros for speed
114 1.1 leo */
115 1.15 thorpej #define PMAP_ACTIVATE(pmap, loadhw) \
116 1.12 thorpej { \
117 1.15 thorpej if ((loadhw)) \
118 1.19 leo loadustp(m68k_btop((pmap)->pm_stpa)); \
119 1.12 thorpej }
120 1.1 leo
121 1.1 leo /*
122 1.6 leo * Description of the memory segments. Build in atari_init/start_c().
123 1.6 leo * This gives a better separation between machine dependent stuff and
124 1.6 leo * the pmap-module.
125 1.6 leo */
126 1.8 leo #define NMEM_SEGS 8
127 1.8 leo struct memseg {
128 1.19 leo paddr_t start; /* PA of first page in segment */
129 1.19 leo paddr_t end; /* PA of last page in segment */
130 1.19 leo int first_page; /* relative page# of 'start' */
131 1.6 leo };
132 1.6 leo
133 1.6 leo /*
134 1.26 chs * For each struct vm_page, there is a list of all currently valid virtual
135 1.1 leo * mappings of that page. An entry is a pv_entry_t, the list is pv_table.
136 1.1 leo */
137 1.1 leo typedef struct pv_entry {
138 1.1 leo struct pv_entry *pv_next; /* next pv_entry */
139 1.1 leo struct pmap *pv_pmap; /* pmap where mapping lies */
140 1.19 leo vaddr_t pv_va; /* virtual address for mapping */
141 1.1 leo u_int *pv_ptste; /* non-zero if VA maps a PT page */
142 1.1 leo struct pmap *pv_ptpmap; /* if pv_ptste, pmap for PT page */
143 1.1 leo int pv_flags; /* flags */
144 1.1 leo } *pv_entry_t;
145 1.1 leo
146 1.1 leo #define PV_CI 0x01 /* all entries must be cache inhibited */
147 1.1 leo #define PV_PTPAGE 0x02 /* entry maps a page table page */
148 1.1 leo
149 1.9 leo struct pv_page;
150 1.9 leo
151 1.9 leo struct pv_page_info {
152 1.9 leo TAILQ_ENTRY(pv_page) pgi_list;
153 1.9 leo struct pv_entry *pgi_freelist;
154 1.9 leo int pgi_nfree;
155 1.9 leo };
156 1.9 leo
157 1.9 leo /*
158 1.9 leo * This is basically:
159 1.30 thorpej * ((PAGE_SIZE - sizeof(struct pv_page_info)) / sizeof(struct pv_entry))
160 1.9 leo */
161 1.9 leo #define NPVPPG 340
162 1.9 leo
163 1.9 leo struct pv_page {
164 1.9 leo struct pv_page_info pvp_pgi;
165 1.9 leo struct pv_entry pvp_pv[NPVPPG];
166 1.9 leo };
167 1.9 leo
168 1.2 leo #ifdef _KERNEL
169 1.8 leo /*
170 1.8 leo * Memory segment descriptors.
171 1.8 leo * - boot_segs
172 1.8 leo * describes the segments obtainted from the bootcode.
173 1.8 leo * - usable_segs
174 1.8 leo * describes the segments available after system requirements are
175 1.8 leo * substracted (reserved pages, etc...).
176 1.8 leo */
177 1.8 leo struct memseg boot_segs[NMEM_SEGS];
178 1.8 leo struct memseg usable_segs[NMEM_SEGS];
179 1.8 leo
180 1.3 mycroft pv_entry_t pv_table; /* array of entries, one per page */
181 1.3 mycroft u_int *Sysmap;
182 1.3 mycroft char *vmmap; /* map for mem, dumps, etc. */
183 1.3 mycroft struct pmap kernel_pmap_store;
184 1.1 leo
185 1.6 leo #define pmap_kernel() (&kernel_pmap_store)
186 1.1 leo #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
187 1.21 is #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count)
188 1.22 thorpej
189 1.27 chris #define pmap_update(pmap) /* nothing (yet) */
190 1.28 chs
191 1.28 chs static __inline void
192 1.29 chs pmap_remove_all(struct pmap *pmap)
193 1.28 chs {
194 1.28 chs /* Nothing. */
195 1.28 chs }
196 1.7 leo
197 1.12 thorpej #define active_user_pmap(pm) \
198 1.12 thorpej (curproc && \
199 1.12 thorpej (pm) != pmap_kernel() && (pm) == curproc->p_vmspace->vm_map.pmap)
200 1.12 thorpej
201 1.19 leo void pmap_bootstrap __P((psize_t, u_int, u_int));
202 1.19 leo void pmap_changebit __P((paddr_t, int, boolean_t));
203 1.17 cgd
204 1.19 leo vaddr_t pmap_map __P((vaddr_t, paddr_t, paddr_t, int));
205 1.20 is void pmap_procwr __P((struct proc *, vaddr_t, u_long));
206 1.20 is #define PMAP_NEED_PROCWR
207 1.12 thorpej
208 1.5 leo #endif /* _KERNEL */
209 1.1 leo
210 1.1 leo #endif /* !_MACHINE_PMAP_H_ */
211