pmap.h revision 1.75 1 1.75 skrll /* $NetBSD: pmap.h,v 1.75 2020/12/20 16:38:25 skrll Exp $ */
2 1.5 cgd
3 1.26 simonb /*
4 1.3 glass * Copyright (c) 1992, 1993
5 1.3 glass * The Regents of the University of California. All rights reserved.
6 1.44 agc *
7 1.44 agc * This code is derived from software contributed to Berkeley by
8 1.44 agc * Ralph Campbell.
9 1.44 agc *
10 1.44 agc * Redistribution and use in source and binary forms, with or without
11 1.44 agc * modification, are permitted provided that the following conditions
12 1.44 agc * are met:
13 1.44 agc * 1. Redistributions of source code must retain the above copyright
14 1.44 agc * notice, this list of conditions and the following disclaimer.
15 1.44 agc * 2. Redistributions in binary form must reproduce the above copyright
16 1.44 agc * notice, this list of conditions and the following disclaimer in the
17 1.44 agc * documentation and/or other materials provided with the distribution.
18 1.44 agc * 3. Neither the name of the University nor the names of its contributors
19 1.44 agc * may be used to endorse or promote products derived from this software
20 1.44 agc * without specific prior written permission.
21 1.44 agc *
22 1.44 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.44 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.44 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.44 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.44 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.44 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.44 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.44 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.44 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.44 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.44 agc * SUCH DAMAGE.
33 1.44 agc *
34 1.44 agc * @(#)pmap.h 8.1 (Berkeley) 6/10/93
35 1.44 agc */
36 1.44 agc
37 1.44 agc /*
38 1.44 agc * Copyright (c) 1987 Carnegie-Mellon University
39 1.1 deraadt *
40 1.1 deraadt * This code is derived from software contributed to Berkeley by
41 1.1 deraadt * Ralph Campbell.
42 1.1 deraadt *
43 1.1 deraadt * Redistribution and use in source and binary forms, with or without
44 1.1 deraadt * modification, are permitted provided that the following conditions
45 1.1 deraadt * are met:
46 1.1 deraadt * 1. Redistributions of source code must retain the above copyright
47 1.1 deraadt * notice, this list of conditions and the following disclaimer.
48 1.1 deraadt * 2. Redistributions in binary form must reproduce the above copyright
49 1.1 deraadt * notice, this list of conditions and the following disclaimer in the
50 1.1 deraadt * documentation and/or other materials provided with the distribution.
51 1.1 deraadt * 3. All advertising materials mentioning features or use of this software
52 1.1 deraadt * must display the following acknowledgement:
53 1.1 deraadt * This product includes software developed by the University of
54 1.1 deraadt * California, Berkeley and its contributors.
55 1.1 deraadt * 4. Neither the name of the University nor the names of its contributors
56 1.1 deraadt * may be used to endorse or promote products derived from this software
57 1.1 deraadt * without specific prior written permission.
58 1.1 deraadt *
59 1.1 deraadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
60 1.1 deraadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61 1.1 deraadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62 1.1 deraadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
63 1.1 deraadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
64 1.1 deraadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
65 1.1 deraadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
66 1.1 deraadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
67 1.1 deraadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
68 1.1 deraadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69 1.1 deraadt * SUCH DAMAGE.
70 1.1 deraadt *
71 1.5 cgd * @(#)pmap.h 8.1 (Berkeley) 6/10/93
72 1.1 deraadt */
73 1.1 deraadt
74 1.41 simonb #ifndef _MIPS_PMAP_H_
75 1.41 simonb #define _MIPS_PMAP_H_
76 1.1 deraadt
77 1.60 matt #ifdef _KERNEL_OPT
78 1.60 matt #include "opt_multiprocessor.h"
79 1.68 matt #include "opt_uvmhist.h"
80 1.70 mrg #include "opt_cputype.h"
81 1.60 matt #endif
82 1.60 matt
83 1.64 matt #include <sys/evcnt.h>
84 1.65 matt #include <sys/kcpuset.h>
85 1.68 matt #include <sys/kernhist.h>
86 1.64 matt
87 1.68 matt #ifndef __BSD_PTENTRY_T__
88 1.72 simonb #define __BSD_PTENTRY_T__
89 1.68 matt typedef uint32_t pt_entry_t;
90 1.72 simonb #define PRIxPTE PRIx32
91 1.68 matt #endif /* __BSD_PTENTRY_T__ */
92 1.68 matt
93 1.72 simonb #define KERNEL_PID 0
94 1.68 matt
95 1.68 matt #if defined(__PMAP_PRIVATE)
96 1.75 skrll struct vm_page_md;
97 1.68 matt
98 1.68 matt #include <mips/locore.h>
99 1.68 matt #include <mips/cache.h>
100 1.68 matt
101 1.72 simonb #define PMAP_VIRTUAL_CACHE_ALIASES
102 1.72 simonb #define PMAP_INVALID_SEGTAB_ADDRESS ((pmap_segtab_t *)NULL)
103 1.68 matt #define PMAP_TLB_NEED_SHOOTDOWN
104 1.72 simonb #define PMAP_TLB_FLUSH_ASID_ON_RESET false
105 1.68 matt #if UPAGES > 1
106 1.72 simonb #define PMAP_TLB_WIRED_UPAGES MIPS3_TLB_WIRED_UPAGES
107 1.68 matt #endif
108 1.72 simonb #define pmap_md_tlb_asid_max() (MIPS_TLB_NUM_PIDS - 1)
109 1.68 matt #ifdef MULTIPROCESSOR
110 1.72 simonb #define PMAP_NO_PV_UNCACHED
111 1.68 matt #endif
112 1.68 matt
113 1.68 matt /*
114 1.68 matt * We need the pmap_segtab's to be aligned on MIPS*R2 so we can use the
115 1.68 matt * EXT/INS instructions on their addresses.
116 1.72 simonb */
117 1.68 matt #if (MIPS32R2 + MIPS64R2 + MIPS64R2_RMIXL) > 0
118 1.72 simonb #define PMAP_SEGTAB_ALIGN __aligned(sizeof(void *)*NSEGPG) __section(".data1")
119 1.72 simonb #endif
120 1.68 matt
121 1.69 cherry #include <uvm/uvm_physseg.h>
122 1.68 matt
123 1.68 matt void pmap_md_init(void);
124 1.68 matt void pmap_md_icache_sync_all(void);
125 1.68 matt void pmap_md_icache_sync_range_index(vaddr_t, vsize_t);
126 1.75 skrll void pmap_md_page_syncicache(struct vm_page_md *, const kcpuset_t *);
127 1.75 skrll bool pmap_md_vca_add(struct vm_page_md *, vaddr_t, pt_entry_t *);
128 1.75 skrll void pmap_md_vca_clean(struct vm_page_md *, int);
129 1.68 matt void pmap_md_vca_remove(struct vm_page *, vaddr_t, bool, bool);
130 1.69 cherry bool pmap_md_ok_to_steal_p(const uvm_physseg_t, size_t);
131 1.68 matt bool pmap_md_tlb_check_entry(void *, vaddr_t, tlb_asid_t, pt_entry_t);
132 1.68 matt
133 1.68 matt static inline bool
134 1.68 matt pmap_md_virtual_cache_aliasing_p(void)
135 1.68 matt {
136 1.68 matt return MIPS_CACHE_VIRTUAL_ALIAS;
137 1.68 matt }
138 1.68 matt
139 1.68 matt static inline vsize_t
140 1.68 matt pmap_md_cache_prefer_mask(void)
141 1.68 matt {
142 1.68 matt return MIPS_HAS_R4K_MMU ? mips_cache_info.mci_cache_prefer_mask : 0;
143 1.68 matt }
144 1.73 skrll
145 1.73 skrll static inline void
146 1.73 skrll pmap_md_xtab_activate(struct pmap *pm, struct lwp *l)
147 1.73 skrll {
148 1.73 skrll
149 1.73 skrll /* nothing */
150 1.73 skrll }
151 1.73 skrll
152 1.73 skrll static inline void
153 1.73 skrll pmap_md_xtab_deactivate(struct pmap *pm)
154 1.73 skrll {
155 1.73 skrll
156 1.73 skrll /* nothing */
157 1.73 skrll }
158 1.73 skrll
159 1.68 matt #endif /* __PMAP_PRIVATE */
160 1.68 matt
161 1.68 matt struct tlbmask {
162 1.68 matt vaddr_t tlb_hi;
163 1.68 matt #ifdef __mips_o32
164 1.68 matt uint32_t tlb_lo0;
165 1.68 matt uint32_t tlb_lo1;
166 1.68 matt #else
167 1.68 matt uint64_t tlb_lo0;
168 1.68 matt uint64_t tlb_lo1;
169 1.68 matt #endif
170 1.68 matt uint32_t tlb_mask;
171 1.68 matt };
172 1.68 matt
173 1.68 matt #ifdef _LP64
174 1.72 simonb #define PMAP_SEGTABSIZE NSEGPG
175 1.68 matt #else
176 1.72 simonb #define PMAP_SEGTABSIZE (1 << (31 - SEGSHIFT))
177 1.68 matt #endif
178 1.68 matt
179 1.74 mrg #include <uvm/uvm_pmap.h>
180 1.68 matt #include <uvm/pmap/vmpagemd.h>
181 1.68 matt #include <uvm/pmap/pmap.h>
182 1.75 skrll #include <uvm/pmap/pmap_pvt.h>
183 1.68 matt #include <uvm/pmap/pmap_tlb.h>
184 1.68 matt #include <uvm/pmap/pmap_synci.h>
185 1.68 matt
186 1.68 matt #ifdef _KERNEL
187 1.68 matt /*
188 1.68 matt * Select CCA to use for unmanaged pages.
189 1.68 matt */
190 1.68 matt #define PMAP_CCA_FOR_PA(pa) CCA_UNCACHED /* uncached */
191 1.68 matt
192 1.68 matt #if defined(_MIPS_PADDR_T_64BIT) || defined(_LP64)
193 1.72 simonb #define PGC_NOCACHE 0x4000000000000000ULL
194 1.72 simonb #define PGC_PREFETCH 0x2000000000000000ULL
195 1.68 matt #endif
196 1.68 matt
197 1.68 matt #if defined(__PMAP_PRIVATE)
198 1.68 matt #include <mips/pte.h>
199 1.68 matt #endif
200 1.18 thorpej
201 1.1 deraadt /*
202 1.3 glass * The user address space is 2Gb (0x0 - 0x80000000).
203 1.3 glass * User programs are laid out in memory as follows:
204 1.3 glass * address
205 1.3 glass * USRTEXT 0x00001000
206 1.3 glass * USRDATA USRTEXT + text_size
207 1.3 glass * USRSTACK 0x7FFFFFFF
208 1.3 glass *
209 1.3 glass * The user address space is mapped using a two level structure where
210 1.3 glass * virtual address bits 30..22 are used to index into a segment table which
211 1.3 glass * points to a page worth of PTEs (4096 page can hold 1024 PTEs).
212 1.26 simonb * Bits 21..12 are then used to index a PTE which describes a page within
213 1.3 glass * a segment.
214 1.3 glass *
215 1.1 deraadt * The wired entries in the TLB will contain the following:
216 1.3 glass * 0-1 (UPAGES) for curproc user struct and kernel stack.
217 1.3 glass *
218 1.3 glass * Note: The kernel doesn't use the same data structures as user programs.
219 1.3 glass * All the PTE entries are stored in a single array in Sysmap which is
220 1.3 glass * dynamically allocated at boot time.
221 1.1 deraadt */
222 1.1 deraadt
223 1.72 simonb #define pmap_phys_address(x) mips_ptob(x)
224 1.39 chs
225 1.12 jonathan /*
226 1.13 jonathan * Bootstrap the system enough to run with virtual memory.
227 1.13 jonathan */
228 1.38 simonb void pmap_bootstrap(void);
229 1.68 matt void pmap_md_alloc_ephemeral_address_space(struct cpu_info *);
230 1.38 simonb void pmap_procwr(struct proc *, vaddr_t, size_t);
231 1.25 is #define PMAP_NEED_PROCWR
232 1.13 jonathan
233 1.13 jonathan /*
234 1.28 soren * pmap_prefer() helps reduce virtual-coherency exceptions in
235 1.13 jonathan * the virtually-indexed cache on mips3 CPUs.
236 1.13 jonathan */
237 1.38 simonb #ifdef MIPS3_PLUS
238 1.72 simonb #define PMAP_PREFER(pa, va, sz, td) pmap_prefer((pa), (va), (sz), (td))
239 1.60 matt void pmap_prefer(vaddr_t, vaddr_t *, vsize_t, int);
240 1.38 simonb #endif /* MIPS3_PLUS */
241 1.13 jonathan
242 1.63 skrll #define PMAP_ENABLE_PMAP_KMPAGE /* enable the PMAP_KMPAGE flag */
243 1.18 thorpej
244 1.71 msaitoh // these use register_t so we can pass XKPHYS addresses to them on N32
245 1.68 matt bool pmap_md_direct_mapped_vaddr_p(register_t);
246 1.68 matt paddr_t pmap_md_direct_mapped_vaddr_to_paddr(register_t);
247 1.68 matt bool pmap_md_io_vaddr_p(vaddr_t);
248 1.66 matt
249 1.18 thorpej /*
250 1.18 thorpej * Alternate mapping hooks for pool pages. Avoids thrashing the TLB.
251 1.18 thorpej */
252 1.68 matt vaddr_t pmap_md_map_poolpage(paddr_t, size_t);
253 1.68 matt paddr_t pmap_md_unmap_poolpage(vaddr_t, size_t);
254 1.68 matt struct vm_page *pmap_md_alloc_poolpage(int);
255 1.42 thorpej
256 1.42 thorpej /*
257 1.42 thorpej * Other hooks for the pool allocator.
258 1.42 thorpej */
259 1.68 matt paddr_t pmap_md_pool_vtophys(vaddr_t);
260 1.68 matt vaddr_t pmap_md_pool_phystov(paddr_t);
261 1.68 matt #define POOL_VTOPHYS(va) pmap_md_pool_vtophys((vaddr_t)va)
262 1.68 matt #define POOL_PHYSTOV(pa) pmap_md_pool_phystov((paddr_t)pa)
263 1.60 matt
264 1.70 mrg #ifdef MIPS64_SB1
265 1.70 mrg /* uncached accesses are bad; all accesses should be cached (and coherent) */
266 1.70 mrg #undef PMAP_PAGEIDLEZERO
267 1.70 mrg #define PMAP_PAGEIDLEZERO(pa) (pmap_zero_page(pa), true)
268 1.70 mrg
269 1.70 mrg int sbmips_cca_for_pa(paddr_t);
270 1.70 mrg
271 1.70 mrg #undef PMAP_CCA_FOR_PA
272 1.70 mrg #define PMAP_CCA_FOR_PA(pa) sbmips_cca_for_pa(pa)
273 1.70 mrg #endif
274 1.70 mrg
275 1.75 skrll #ifdef __HAVE_PMAP_PV_TRACK
276 1.75 skrll struct pmap_page {
277 1.75 skrll struct vm_page_md pp_md;
278 1.75 skrll };
279 1.75 skrll
280 1.75 skrll #define PMAP_PAGE_TO_MD(ppage) (&((ppage)->pp_md))
281 1.75 skrll #endif
282 1.75 skrll
283 1.6 jtc #endif /* _KERNEL */
284 1.41 simonb #endif /* _MIPS_PMAP_H_ */
285