Sun Aug 16 16:48:08 2020 UTC ()
Be explcit that all calls to pmap_activate() and pmap_deactivate()
from MI code are made with preemption disabled and with l == curlwp.


(thorpej)
diff -r1.47 -r1.48 src/share/man/man9/pmap.9

cvs diff -r1.47 -r1.48 src/share/man/man9/pmap.9 (switch to unified diff)

--- src/share/man/man9/pmap.9 2020/03/14 14:05:42 1.47
+++ src/share/man/man9/pmap.9 2020/08/16 16:48:08 1.48
@@ -1,1245 +1,1243 @@ @@ -1,1245 +1,1243 @@
1.\" $NetBSD: pmap.9,v 1.47 2020/03/14 14:05:42 ad Exp $ 1.\" $NetBSD: pmap.9,v 1.48 2020/08/16 16:48:08 thorpej Exp $
2.\" 2.\"
3.\" Copyright (c) 2000, 2001, 2002, 2020 The NetBSD Foundation, Inc. 3.\" Copyright (c) 2000, 2001, 2002, 2020 The NetBSD Foundation, Inc.
4.\" All rights reserved. 4.\" All rights reserved.
5.\" 5.\"
6.\" This code is derived from software contributed to The NetBSD Foundation 6.\" This code is derived from software contributed to The NetBSD Foundation
7.\" by Jason R. Thorpe. 7.\" by Jason R. Thorpe.
8.\" 8.\"
9.\" Redistribution and use in source and binary forms, with or without 9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions 10.\" modification, are permitted provided that the following conditions
11.\" are met: 11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright 12.\" 1. Redistributions of source code must retain the above copyright
13.\" notice, this list of conditions and the following disclaimer. 13.\" notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright 14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\" notice, this list of conditions and the following disclaimer in the 15.\" notice, this list of conditions and the following disclaimer in the
16.\" documentation and/or other materials provided with the distribution. 16.\" documentation and/or other materials provided with the distribution.
17.\" 17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28.\" POSSIBILITY OF SUCH DAMAGE. 28.\" POSSIBILITY OF SUCH DAMAGE.
29.\" 29.\"
30.Dd March 14, 2020 30.Dd August 16, 2020
31.Dt PMAP 9 31.Dt PMAP 9
32.Os 32.Os
33.Sh NAME 33.Sh NAME
34.Nm pmap 34.Nm pmap
35.Nd machine-dependent portion of the virtual memory system 35.Nd machine-dependent portion of the virtual memory system
36.Sh SYNOPSIS 36.Sh SYNOPSIS
37.In sys/param.h 37.In sys/param.h
38.In uvm/uvm_extern.h 38.In uvm/uvm_extern.h
39.Ft void 39.Ft void
40.Fn "pmap_init" "void" 40.Fn "pmap_init" "void"
41.Ft void 41.Ft void
42.Fn "pmap_virtual_space" "vaddr_t *vstartp" "vaddr_t *vendp" 42.Fn "pmap_virtual_space" "vaddr_t *vstartp" "vaddr_t *vendp"
43.Ft vaddr_t 43.Ft vaddr_t
44.Fn "pmap_steal_memory" "vsize_t size" "vaddr_t *vstartp" "vaddr_t *vendp" 44.Fn "pmap_steal_memory" "vsize_t size" "vaddr_t *vstartp" "vaddr_t *vendp"
45.Ft pmap_t 45.Ft pmap_t
46.Fn "pmap_kernel" "void" 46.Fn "pmap_kernel" "void"
47.Ft pmap_t 47.Ft pmap_t
48.Fn "pmap_create" "void" 48.Fn "pmap_create" "void"
49.Ft void 49.Ft void
50.Fn "pmap_destroy" "pmap_t pmap" 50.Fn "pmap_destroy" "pmap_t pmap"
51.Ft void 51.Ft void
52.Fn "pmap_reference" "pmap_t pmap" 52.Fn "pmap_reference" "pmap_t pmap"
53.Ft void 53.Ft void
54.Fn "pmap_fork" "pmap_t src_map" "pmap_t dst_map" 54.Fn "pmap_fork" "pmap_t src_map" "pmap_t dst_map"
55.Ft long 55.Ft long
56.Fn "pmap_resident_count" "pmap_t pmap" 56.Fn "pmap_resident_count" "pmap_t pmap"
57.Ft long 57.Ft long
58.Fn "pmap_wired_count" "pmap_t pmap" 58.Fn "pmap_wired_count" "pmap_t pmap"
59.Ft vaddr_t 59.Ft vaddr_t
60.Fn "pmap_growkernel" "vaddr_t maxkvaddr" 60.Fn "pmap_growkernel" "vaddr_t maxkvaddr"
61.Ft int 61.Ft int
62.Fn "pmap_enter" "pmap_t pmap" "vaddr_t va" "paddr_t pa" "vm_prot_t prot" \ 62.Fn "pmap_enter" "pmap_t pmap" "vaddr_t va" "paddr_t pa" "vm_prot_t prot" \
63 "u_int flags" 63 "u_int flags"
64.Ft void 64.Ft void
65.Fn "pmap_remove" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva" 65.Fn "pmap_remove" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva"
66.Ft bool 66.Ft bool
67.Fn "pmap_remove_all" "pmap_t pmap" 67.Fn "pmap_remove_all" "pmap_t pmap"
68.Ft void 68.Ft void
69.Fn "pmap_protect" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva" "vm_prot_t prot" 69.Fn "pmap_protect" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva" "vm_prot_t prot"
70.Ft void 70.Ft void
71.Fn "pmap_unwire" "pmap_t pmap" "vaddr_t va" 71.Fn "pmap_unwire" "pmap_t pmap" "vaddr_t va"
72.Ft bool 72.Ft bool
73.Fn "pmap_extract" "pmap_t pmap" "vaddr_t va" "paddr_t *pap" 73.Fn "pmap_extract" "pmap_t pmap" "vaddr_t va" "paddr_t *pap"
74.Ft void 74.Ft void
75.Fn "pmap_kenter_pa" "vaddr_t va" "paddr_t pa" "vm_prot_t prot" "u_int flags" 75.Fn "pmap_kenter_pa" "vaddr_t va" "paddr_t pa" "vm_prot_t prot" "u_int flags"
76.Ft void 76.Ft void
77.Fn "pmap_kremove" "vaddr_t va" "vsize_t size" 77.Fn "pmap_kremove" "vaddr_t va" "vsize_t size"
78.Ft void 78.Ft void
79.Fn "pmap_copy" "pmap_t dst_map" "pmap_t src_map" "vaddr_t dst_addr" \ 79.Fn "pmap_copy" "pmap_t dst_map" "pmap_t src_map" "vaddr_t dst_addr" \
80 "vsize_t len" "vaddr_t src_addr" 80 "vsize_t len" "vaddr_t src_addr"
81.Ft void 81.Ft void
82.Fn "pmap_update" "pmap_t pmap" 82.Fn "pmap_update" "pmap_t pmap"
83.Ft void 83.Ft void
84.Fn "pmap_activate" "struct lwp *l" 84.Fn "pmap_activate" "struct lwp *l"
85.Ft void 85.Ft void
86.Fn "pmap_deactivate" "struct lwp *l" 86.Fn "pmap_deactivate" "struct lwp *l"
87.Ft void 87.Ft void
88.Fn "pmap_zero_page" "paddr_t pa" 88.Fn "pmap_zero_page" "paddr_t pa"
89.Ft void 89.Ft void
90.Fn "pmap_copy_page" "paddr_t src" "paddr_t dst" 90.Fn "pmap_copy_page" "paddr_t src" "paddr_t dst"
91.Ft void 91.Ft void
92.Fn "pmap_page_protect" "struct vm_page *pg" "vm_prot_t prot" 92.Fn "pmap_page_protect" "struct vm_page *pg" "vm_prot_t prot"
93.Ft bool 93.Ft bool
94.Fn "pmap_clear_modify" "struct vm_page *pg" 94.Fn "pmap_clear_modify" "struct vm_page *pg"
95.Ft bool 95.Ft bool
96.Fn "pmap_clear_reference" "struct vm_page *pg" 96.Fn "pmap_clear_reference" "struct vm_page *pg"
97.Ft bool 97.Ft bool
98.Fn "pmap_is_modified" "struct vm_page *pg" 98.Fn "pmap_is_modified" "struct vm_page *pg"
99.Ft bool 99.Ft bool
100.Fn "pmap_is_referenced" "struct vm_page *pg" 100.Fn "pmap_is_referenced" "struct vm_page *pg"
101.Ft paddr_t 101.Ft paddr_t
102.Fn "pmap_phys_address" "paddr_t cookie" 102.Fn "pmap_phys_address" "paddr_t cookie"
103.Ft vaddr_t 103.Ft vaddr_t
104.Fn "PMAP_MAP_POOLPAGE" "paddr_t pa" 104.Fn "PMAP_MAP_POOLPAGE" "paddr_t pa"
105.Ft paddr_t 105.Ft paddr_t
106.Fn "PMAP_UNMAP_POOLPAGE" "vaddr_t va" 106.Fn "PMAP_UNMAP_POOLPAGE" "vaddr_t va"
107.Ft void 107.Ft void
108.Fn "PMAP_PREFER" "vaddr_t hint" "vaddr_t *vap" "vsize_t sz" "int td" 108.Fn "PMAP_PREFER" "vaddr_t hint" "vaddr_t *vap" "vsize_t sz" "int td"
109.Sh DESCRIPTION 109.Sh DESCRIPTION
110The 110The
111.Nm 111.Nm
112module is the machine-dependent portion of the 112module is the machine-dependent portion of the
113.Nx 113.Nx
114virtual memory system 114virtual memory system
115.Xr uvm 9 . 115.Xr uvm 9 .
116The purpose of the 116The purpose of the
117.Nm 117.Nm
118module is to manage physical address maps, to program the 118module is to manage physical address maps, to program the
119memory management hardware on the system, and perform any 119memory management hardware on the system, and perform any
120cache operations necessary to ensure correct operation of 120cache operations necessary to ensure correct operation of
121the virtual memory system. 121the virtual memory system.
122The 122The
123.Nm 123.Nm
124module is also responsible for maintaining certain information 124module is also responsible for maintaining certain information
125required by 125required by
126.Xr uvm 9 . 126.Xr uvm 9 .
127.Pp 127.Pp
128In order to cope with hardware architectures that make the 128In order to cope with hardware architectures that make the
129invalidation of virtual address mappings expensive (e.g., 129invalidation of virtual address mappings expensive (e.g.,
130TLB invalidations, TLB shootdown operations for multiple 130TLB invalidations, TLB shootdown operations for multiple
131processors), the 131processors), the
132.Nm 132.Nm
133module is allowed to delay mapping invalidation or protection 133module is allowed to delay mapping invalidation or protection
134operations until such time as they are actually necessary. 134operations until such time as they are actually necessary.
135The functions that are allowed to delay such actions are 135The functions that are allowed to delay such actions are
136.Fn pmap_enter , 136.Fn pmap_enter ,
137.Fn pmap_remove , 137.Fn pmap_remove ,
138.Fn pmap_protect , 138.Fn pmap_protect ,
139.Fn pmap_kenter_pa , 139.Fn pmap_kenter_pa ,
140and 140and
141.Fn pmap_kremove . 141.Fn pmap_kremove .
142Callers of these functions must use the 142Callers of these functions must use the
143.Fn pmap_update 143.Fn pmap_update
144function to notify the 144function to notify the
145.Nm 145.Nm
146module that the mappings need to be made correct. 146module that the mappings need to be made correct.
147Since the 147Since the
148.Nm 148.Nm
149module is provided with information as to which processors are 149module is provided with information as to which processors are
150using a given physical map, the 150using a given physical map, the
151.Nm 151.Nm
152module may use whatever optimizations it has available to reduce 152module may use whatever optimizations it has available to reduce
153the expense of virtual-to-physical mapping synchronization. 153the expense of virtual-to-physical mapping synchronization.
154.Ss HEADER FILES AND DATA STRUCTURES 154.Ss HEADER FILES AND DATA STRUCTURES
155Machine-dependent code must provide the header file 155Machine-dependent code must provide the header file
156.In machine/pmap.h . 156.In machine/pmap.h .
157This file contains the definition of the 157This file contains the definition of the
158.Dv pmap 158.Dv pmap
159structure: 159structure:
160.Bd -literal -offset indent 160.Bd -literal -offset indent
161struct pmap { 161struct pmap {
162 /* Contents defined by pmap implementation. */ 162 /* Contents defined by pmap implementation. */
163}; 163};
164typedef struct pmap *pmap_t; 164typedef struct pmap *pmap_t;
165.Ed 165.Ed
166.Pp 166.Pp
167This header file may also define other data structures that the 167This header file may also define other data structures that the
168.Nm 168.Nm
169implementation uses. 169implementation uses.
170.Pp 170.Pp
171Note that all prototypes for 171Note that all prototypes for
172.Nm 172.Nm
173interface functions are provided by the header file 173interface functions are provided by the header file
174.In uvm/uvm_pmap.h . 174.In uvm/uvm_pmap.h .
175It is possible to override this behavior by defining the 175It is possible to override this behavior by defining the
176C pre-processor macro 176C pre-processor macro
177.Dv PMAP_EXCLUDE_DECLS . 177.Dv PMAP_EXCLUDE_DECLS .
178This may be used to add a layer of indirection to 178This may be used to add a layer of indirection to
179.Nm 179.Nm
180API calls, for handling different MMU types in a single 180API calls, for handling different MMU types in a single
181.Nm 181.Nm
182module, for example. 182module, for example.
183If the 183If the
184.Dv PMAP_EXCLUDE_DECLS 184.Dv PMAP_EXCLUDE_DECLS
185macro is defined, 185macro is defined,
186.In machine/pmap.h 186.In machine/pmap.h
187.Em must 187.Em must
188provide function prototypes in a block like so: 188provide function prototypes in a block like so:
189.Bd -literal -offset indent 189.Bd -literal -offset indent
190#ifdef _KERNEL /* not exposed to user namespace */ 190#ifdef _KERNEL /* not exposed to user namespace */
191__BEGIN_DECLS /* make safe for C++ */ 191__BEGIN_DECLS /* make safe for C++ */
192/* Prototypes go here. */ 192/* Prototypes go here. */
193__END_DECLS 193__END_DECLS
194#endif /* _KERNEL */ 194#endif /* _KERNEL */
195.Ed 195.Ed
196.Pp 196.Pp
197The header file 197The header file
198.In uvm/uvm_pmap.h 198.In uvm/uvm_pmap.h
199defines a structure for tracking 199defines a structure for tracking
200.Nm 200.Nm
201statistics (see below). 201statistics (see below).
202This structure is defined as: 202This structure is defined as:
203.Bd -literal -offset indent 203.Bd -literal -offset indent
204struct pmap_statistics { 204struct pmap_statistics {
205 long resident_count; /* number of mapped pages */ 205 long resident_count; /* number of mapped pages */
206 long wired_count; /* number of wired pages */ 206 long wired_count; /* number of wired pages */
207}; 207};
208.Ed 208.Ed
209.Ss WIRED MAPPINGS 209.Ss WIRED MAPPINGS
210The 210The
211.Nm 211.Nm
212module is based on the premise that all information contained 212module is based on the premise that all information contained
213in the physical maps it manages is redundant. 213in the physical maps it manages is redundant.
214That is, physical map information may be 214That is, physical map information may be
215.Dq forgotten 215.Dq forgotten
216by the 216by the
217.Nm 217.Nm
218module in the event that it is necessary to do so; it can be rebuilt 218module in the event that it is necessary to do so; it can be rebuilt
219by 219by
220.Xr uvm 9 220.Xr uvm 9
221by taking a page fault. 221by taking a page fault.
222There is one exception to this rule: so-called 222There is one exception to this rule: so-called
223.Dq wired 223.Dq wired
224mappings may not be forgotten. 224mappings may not be forgotten.
225Wired mappings are those for which either no high-level information 225Wired mappings are those for which either no high-level information
226exists with which to rebuild the mapping, or mappings which are needed 226exists with which to rebuild the mapping, or mappings which are needed
227by critical sections of code where taking a page fault is unacceptable. 227by critical sections of code where taking a page fault is unacceptable.
228Information about which mappings are wired is provided to the 228Information about which mappings are wired is provided to the
229.Nm 229.Nm
230module when a mapping is established. 230module when a mapping is established.
231.Ss MODIFIED/REFERENCED INFORMATION 231.Ss MODIFIED/REFERENCED INFORMATION
232The 232The
233.Nm 233.Nm
234module is required to keep track of whether or not a page managed 234module is required to keep track of whether or not a page managed
235by the virtual memory system has been referenced or modified. 235by the virtual memory system has been referenced or modified.
236This information is used by 236This information is used by
237.Xr uvm 9 237.Xr uvm 9
238to determine what happens to the page when scanned by the 238to determine what happens to the page when scanned by the
239pagedaemon. 239pagedaemon.
240.Pp 240.Pp
241Many CPUs provide hardware support for tracking 241Many CPUs provide hardware support for tracking
242modified/referenced information. 242modified/referenced information.
243However, many CPUs, particularly modern RISC CPUs, do not. 243However, many CPUs, particularly modern RISC CPUs, do not.
244On CPUs which lack hardware support for modified/referenced tracking, the 244On CPUs which lack hardware support for modified/referenced tracking, the
245.Nm 245.Nm
246module must emulate it in software. 246module must emulate it in software.
247There are several strategies for doing this, and the best strategy 247There are several strategies for doing this, and the best strategy
248depends on the CPU. 248depends on the CPU.
249.Pp 249.Pp
250The 250The
251.Dq referenced 251.Dq referenced
252attribute is used by the pagedaemon to determine if a page is 252attribute is used by the pagedaemon to determine if a page is
253.Dq active . 253.Dq active .
254Active pages are not candidates for re-use in the page replacement algorithm. 254Active pages are not candidates for re-use in the page replacement algorithm.
255Accurate referenced information is not required for correct operation; if 255Accurate referenced information is not required for correct operation; if
256supplying referenced information for a page is not feasible, then the 256supplying referenced information for a page is not feasible, then the
257.Nm 257.Nm
258implementation should always consider the 258implementation should always consider the
259.Dq referenced 259.Dq referenced
260attribute to be 260attribute to be
261.Dv false . 261.Dv false .
262.Pp 262.Pp
263The 263The
264.Dq modified 264.Dq modified
265attribute is used by the pagedaemon to determine if a page needs 265attribute is used by the pagedaemon to determine if a page needs
266to be cleaned (written to backing store; swap space, a regular file, etc.). 266to be cleaned (written to backing store; swap space, a regular file, etc.).
267Accurate modified information 267Accurate modified information
268.Em must 268.Em must
269be provided by the 269be provided by the
270.Nm 270.Nm
271module for correct operation of the virtual memory system. 271module for correct operation of the virtual memory system.
272.Pp 272.Pp
273Note that modified/referenced information is only tracked for 273Note that modified/referenced information is only tracked for
274pages managed by the virtual memory system (i.e., pages for 274pages managed by the virtual memory system (i.e., pages for
275which a vm_page structure exists). 275which a vm_page structure exists).
276In addition, only 276In addition, only
277.Dq managed 277.Dq managed
278mappings of those pages have modified/referenced tracking. 278mappings of those pages have modified/referenced tracking.
279Mappings entered with the 279Mappings entered with the
280.Fn pmap_enter 280.Fn pmap_enter
281function are 281function are
282.Dq managed 282.Dq managed
283mappings. 283mappings.
284It is possible for 284It is possible for
285.Dq unmanaged 285.Dq unmanaged
286mappings of a page to be created, using the 286mappings of a page to be created, using the
287.Fn pmap_kenter_pa 287.Fn pmap_kenter_pa
288function. 288function.
289The use of 289The use of
290.Dq unmanaged 290.Dq unmanaged
291mappings should be limited to code which may execute in interrupt context 291mappings should be limited to code which may execute in interrupt context
292(for example, the kernel memory allocator), or to enter mappings for 292(for example, the kernel memory allocator), or to enter mappings for
293physical addresses which are not managed by the virtual memory system. 293physical addresses which are not managed by the virtual memory system.
294.Dq Unmanaged 294.Dq Unmanaged
295mappings may only be entered into the kernel's virtual address space. 295mappings may only be entered into the kernel's virtual address space.
296This constraint is placed on the callers of the 296This constraint is placed on the callers of the
297.Fn pmap_kenter_pa 297.Fn pmap_kenter_pa
298and 298and
299.Fn pmap_kremove 299.Fn pmap_kremove
300functions so that the 300functions so that the
301.Nm 301.Nm
302implementation need not block interrupts when manipulating data 302implementation need not block interrupts when manipulating data
303structures or holding locks. 303structures or holding locks.
304.Pp 304.Pp
305Also note that the modified/referenced information must be tracked 305Also note that the modified/referenced information must be tracked
306on a per-page basis; they are not attributes of a mapping, but attributes 306on a per-page basis; they are not attributes of a mapping, but attributes
307of a page. 307of a page.
308Therefore, even after all mappings for a given page have 308Therefore, even after all mappings for a given page have
309been removed, the modified/referenced information for that page 309been removed, the modified/referenced information for that page
310.Em must 310.Em must
311be preserved. 311be preserved.
312The only time the modified/referenced attributes may 312The only time the modified/referenced attributes may
313be cleared is when the virtual memory system explicitly calls the 313be cleared is when the virtual memory system explicitly calls the
314.Fn pmap_clear_modify 314.Fn pmap_clear_modify
315and 315and
316.Fn pmap_clear_reference 316.Fn pmap_clear_reference
317functions. 317functions.
318These functions must also change any internal state necessary to detect 318These functions must also change any internal state necessary to detect
319the page being modified or referenced again after the modified or 319the page being modified or referenced again after the modified or
320referenced state is cleared. 320referenced state is cleared.
321(Prior to 321(Prior to
322.Nx 1.6 , 322.Nx 1.6 ,
323.Nm 323.Nm
324implementations could get away without this because UVM (and Mach VM 324implementations could get away without this because UVM (and Mach VM
325before that) always called 325before that) always called
326.Fn pmap_page_protect 326.Fn pmap_page_protect
327before clearing the modified or referenced state, but UVM has been changed 327before clearing the modified or referenced state, but UVM has been changed
328to not do this anymore, so all 328to not do this anymore, so all
329.Nm 329.Nm
330implementations must now handle this.) 330implementations must now handle this.)
331.Ss STATISTICS 331.Ss STATISTICS
332The 332The
333.Nm 333.Nm
334is required to keep statistics as to the number of 334is required to keep statistics as to the number of
335.Dq resident 335.Dq resident
336pages and the number of 336pages and the number of
337.Dq wired 337.Dq wired
338pages. 338pages.
339.Pp 339.Pp
340A 340A
341.Dq resident 341.Dq resident
342page is one for which a mapping exists. 342page is one for which a mapping exists.
343This statistic is used to compute the resident size of a process and 343This statistic is used to compute the resident size of a process and
344enforce resource limits. 344enforce resource limits.
345Only pages (whether managed by the virtual memory system or not) 345Only pages (whether managed by the virtual memory system or not)
346which are mapped into a physical map should be counted in the resident 346which are mapped into a physical map should be counted in the resident
347count. 347count.
348.Pp 348.Pp
349A 349A
350.Dq wired 350.Dq wired
351page is one for which a wired mapping exists. 351page is one for which a wired mapping exists.
352This statistic is used to enforce resource limits. 352This statistic is used to enforce resource limits.
353.Pp 353.Pp
354Note that it is recommended (though not required) that the 354Note that it is recommended (though not required) that the
355.Nm 355.Nm
356implementation use the 356implementation use the
357.Dv pmap_statistics 357.Dv pmap_statistics
358structure in the tracking of 358structure in the tracking of
359.Nm 359.Nm
360statistics by placing it inside the 360statistics by placing it inside the
361.Dv pmap 361.Dv pmap
362structure and adjusting the counts when mappings are established, changed, 362structure and adjusting the counts when mappings are established, changed,
363or removed. 363or removed.
364This avoids potentially expensive data structure traversals when the 364This avoids potentially expensive data structure traversals when the
365statistics are queried. 365statistics are queried.
366.Ss REQUIRED FUNCTIONS 366.Ss REQUIRED FUNCTIONS
367This section describes functions that a 367This section describes functions that a
368.Nm 368.Nm
369module must provide to the virtual memory system. 369module must provide to the virtual memory system.
370.Bl -tag -width indent -offset indent 370.Bl -tag -width indent -offset indent
371.It void Fn "pmap_init" "void" 371.It void Fn "pmap_init" "void"
372This function initializes the 372This function initializes the
373.Nm 373.Nm
374module. 374module.
375It is called by 375It is called by
376.Fn uvm_init 376.Fn uvm_init
377to initialize any data structures that the module needs to 377to initialize any data structures that the module needs to
378manage physical maps. 378manage physical maps.
379.It pmap_t Fn "pmap_kernel" "void" 379.It pmap_t Fn "pmap_kernel" "void"
380A machine independent macro which expands to 380A machine independent macro which expands to
381.Va kernel_pmap_ptr . 381.Va kernel_pmap_ptr .
382This variable must be exported by the platform's pmap module and it 382This variable must be exported by the platform's pmap module and it
383must point to the kernel pmap. 383must point to the kernel pmap.
384.It void Fn "pmap_virtual_space" "vaddr_t *vstartp" "vaddr_t *vendp" 384.It void Fn "pmap_virtual_space" "vaddr_t *vstartp" "vaddr_t *vendp"
385The 385The
386.Fn pmap_virtual_space 386.Fn pmap_virtual_space
387function is called to determine the initial kernel virtual address 387function is called to determine the initial kernel virtual address
388space beginning and end. 388space beginning and end.
389These values are used to create the kernel's virtual memory map. 389These values are used to create the kernel's virtual memory map.
390The function must set 390The function must set
391.Fa *vstartp 391.Fa *vstartp
392to the first kernel virtual address that will be managed by 392to the first kernel virtual address that will be managed by
393.Xr uvm 9 , 393.Xr uvm 9 ,
394and must set 394and must set
395.Fa *vendp 395.Fa *vendp
396to the last kernel virtual address that will be managed by 396to the last kernel virtual address that will be managed by
397.Xr uvm 9 . 397.Xr uvm 9 .
398.Pp 398.Pp
399If the 399If the
400.Fn pmap_growkernel 400.Fn pmap_growkernel
401feature is used by a 401feature is used by a
402.Nm 402.Nm
403implementation, then 403implementation, then
404.Fa *vendp 404.Fa *vendp
405should be set to the maximum kernel virtual address allowed by the 405should be set to the maximum kernel virtual address allowed by the
406implementation. 406implementation.
407If 407If
408.Fn pmap_growkernel 408.Fn pmap_growkernel
409is not used, then 409is not used, then
410.Fa *vendp 410.Fa *vendp
411.Em must 411.Em must
412be set to the maximum kernel virtual address that can be mapped with 412be set to the maximum kernel virtual address that can be mapped with
413the resources currently allocated to map the kernel virtual address 413the resources currently allocated to map the kernel virtual address
414space. 414space.
415.It pmap_t Fn "pmap_create" "void" 415.It pmap_t Fn "pmap_create" "void"
416Create a physical map and return it to the caller. 416Create a physical map and return it to the caller.
417The reference count on the new map is 1. 417The reference count on the new map is 1.
418.It void Fn "pmap_destroy" "pmap_t pmap" 418.It void Fn "pmap_destroy" "pmap_t pmap"
419Drop the reference count on the specified physical map. 419Drop the reference count on the specified physical map.
420If the reference count drops to 0, all resources associated with the 420If the reference count drops to 0, all resources associated with the
421physical map are released and the physical map destroyed. 421physical map are released and the physical map destroyed.
422In the case of a drop-to-0, no mappings will exist in the map. 422In the case of a drop-to-0, no mappings will exist in the map.
423The 423The
424.Nm 424.Nm
425implementation may assert this. 425implementation may assert this.
426.It void Fn "pmap_reference" "pmap_t pmap" 426.It void Fn "pmap_reference" "pmap_t pmap"
427Increment the reference count on the specified physical map. 427Increment the reference count on the specified physical map.
428.It long Fn "pmap_resident_count" "pmap_t pmap" 428.It long Fn "pmap_resident_count" "pmap_t pmap"
429Query the 429Query the
430.Dq resident pages 430.Dq resident pages
431statistic for 431statistic for
432.Fa pmap . 432.Fa pmap .
433.Pp 433.Pp
434Note that this function may be provided as a C pre-processor macro. 434Note that this function may be provided as a C pre-processor macro.
435.It long Fn "pmap_wired_count" "pmap_t pmap" 435.It long Fn "pmap_wired_count" "pmap_t pmap"
436Query the 436Query the
437.Dq wired pages 437.Dq wired pages
438statistic for 438statistic for
439.Fa pmap . 439.Fa pmap .
440.Pp 440.Pp
441Note that this function may be provided as a C pre-processor macro. 441Note that this function may be provided as a C pre-processor macro.
442.It int Fn "pmap_enter" "pmap_t pmap" "vaddr_t va" "paddr_t pa" \ 442.It int Fn "pmap_enter" "pmap_t pmap" "vaddr_t va" "paddr_t pa" \
443 "vm_prot_t prot" "u_int flags" 443 "vm_prot_t prot" "u_int flags"
444Create a mapping in physical map 444Create a mapping in physical map
445.Fa pmap 445.Fa pmap
446for the physical address 446for the physical address
447.Fa pa 447.Fa pa
448at the virtual address 448at the virtual address
449.Fa va 449.Fa va
450with protection specified by bits in 450with protection specified by bits in
451.Fa prot : 451.Fa prot :
452.Bl -tag -width "VM_PROT_EXECUTE " -offset indent 452.Bl -tag -width "VM_PROT_EXECUTE " -offset indent
453.It VM_PROT_READ 453.It VM_PROT_READ
454The mapping must allow reading. 454The mapping must allow reading.
455.It VM_PROT_WRITE 455.It VM_PROT_WRITE
456The mapping must allow writing. 456The mapping must allow writing.
457.It VM_PROT_EXECUTE 457.It VM_PROT_EXECUTE
458The page mapped contains instructions that will be executed by the 458The page mapped contains instructions that will be executed by the
459processor. 459processor.
460.El 460.El
461.Pp 461.Pp
462The 462The
463.Fa flags 463.Fa flags
464argument contains protection bits (the same bits as used in the 464argument contains protection bits (the same bits as used in the
465.Fa prot 465.Fa prot
466argument) indicating the type of access that caused the mapping to 466argument) indicating the type of access that caused the mapping to
467be created. 467be created.
468This information may be used to seed modified/referenced 468This information may be used to seed modified/referenced
469information for the page being mapped, possibly avoiding redundant faults 469information for the page being mapped, possibly avoiding redundant faults
470on platforms that track modified/referenced information in software. 470on platforms that track modified/referenced information in software.
471Other information provided by 471Other information provided by
472.Fa flags : 472.Fa flags :
473.Bl -tag -width "PMAP_CANFAIL " -offset indent 473.Bl -tag -width "PMAP_CANFAIL " -offset indent
474.It PMAP_WIRED 474.It PMAP_WIRED
475The mapping being created is a wired mapping. 475The mapping being created is a wired mapping.
476.It PMAP_CANFAIL 476.It PMAP_CANFAIL
477The call to 477The call to
478.Fn pmap_enter 478.Fn pmap_enter
479is allowed to fail. 479is allowed to fail.
480If this flag is 480If this flag is
481.Em not 481.Em not
482set, and the 482set, and the
483.Fn pmap_enter 483.Fn pmap_enter
484call is unable to create the mapping, perhaps due to insufficient 484call is unable to create the mapping, perhaps due to insufficient
485resources, the 485resources, the
486.Nm 486.Nm
487module must panic. 487module must panic.
488.It PMAP_NOCACHE 488.It PMAP_NOCACHE
489The mapping being created is 489The mapping being created is
490.Em not 490.Em not
491cached. 491cached.
492Write accesses have a write-through policy. 492Write accesses have a write-through policy.
493No speculative memory accesses. 493No speculative memory accesses.
494.It PMAP_WRITE_COMBINE 494.It PMAP_WRITE_COMBINE
495The mapping being created is 495The mapping being created is
496.Em not 496.Em not
497cached. 497cached.
498Writes are combined and done in one burst. 498Writes are combined and done in one burst.
499Speculative read accesses may be allowed. 499Speculative read accesses may be allowed.
500.It PMAP_WRITE_BACK 500.It PMAP_WRITE_BACK
501All accesses to the created mapping are cached. 501All accesses to the created mapping are cached.
502On reads, cachelines become shared or exclusive if allocated on cache miss. 502On reads, cachelines become shared or exclusive if allocated on cache miss.
503On writes, cachelines become modified on a cache miss. 503On writes, cachelines become modified on a cache miss.
504.It PMAP_NOCACHE_OVR 504.It PMAP_NOCACHE_OVR
505Same as PMAP_NOCACHE but mapping is overrideable (e.g. on x86 by MTRRs). 505Same as PMAP_NOCACHE but mapping is overrideable (e.g. on x86 by MTRRs).
506.El 506.El
507.Pp 507.Pp
508The access type provided in the 508The access type provided in the
509.Fa flags 509.Fa flags
510argument will never exceed the protection specified by 510argument will never exceed the protection specified by
511.Fa prot . 511.Fa prot .
512The 512The
513.Nm 513.Nm
514implementation may assert this. 514implementation may assert this.
515Note that on systems that do not provide hardware support for 515Note that on systems that do not provide hardware support for
516tracking modified/referenced information, modified/referenced 516tracking modified/referenced information, modified/referenced
517information for the page 517information for the page
518.Em must 518.Em must
519be seeded with the access type provided in 519be seeded with the access type provided in
520.Fa flags 520.Fa flags
521if the 521if the
522.Dv PMAP_WIRED 522.Dv PMAP_WIRED
523flag is set. 523flag is set.
524This is to prevent a fault for the purpose of tracking 524This is to prevent a fault for the purpose of tracking
525modified/referenced information from occurring while the system is in 525modified/referenced information from occurring while the system is in
526a critical section where a fault would be unacceptable. 526a critical section where a fault would be unacceptable.
527.Pp 527.Pp
528Note that 528Note that
529.Fn pmap_enter 529.Fn pmap_enter
530is sometimes called to enter a mapping at a virtual address 530is sometimes called to enter a mapping at a virtual address
531for which a mapping already exists. 531for which a mapping already exists.
532In this situation, the implementation must take whatever action is 532In this situation, the implementation must take whatever action is
533necessary to invalidate the previous mapping before entering the new one. 533necessary to invalidate the previous mapping before entering the new one.
534.Pp 534.Pp
535Also note that 535Also note that
536.Fn pmap_enter 536.Fn pmap_enter
537is sometimes called to change the protection for a pre-existing 537is sometimes called to change the protection for a pre-existing
538mapping, or to change the 538mapping, or to change the
539.Dq wired 539.Dq wired
540attribute for a pre-existing mapping. 540attribute for a pre-existing mapping.
541.Pp 541.Pp
542The 542The
543.Fn pmap_enter 543.Fn pmap_enter
544function returns 0 on success or an error code indicating the mode 544function returns 0 on success or an error code indicating the mode
545of failure. 545of failure.
546.It void Fn "pmap_remove" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva" 546.It void Fn "pmap_remove" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva"
547Remove mappings from the virtual address range 547Remove mappings from the virtual address range
548.Fa sva 548.Fa sva
549to 549to
550.Fa eva 550.Fa eva
551from the specified physical map. 551from the specified physical map.
552.It bool Fn "pmap_remove_all" "pmap_t pmap" 552.It bool Fn "pmap_remove_all" "pmap_t pmap"
553This function is a hint to the 553This function is a hint to the
554.Nm pmap 554.Nm pmap
555implementation that all entries in 555implementation that all entries in
556.Fa pmap 556.Fa pmap
557will be removed before any more entries are entered. 557will be removed before any more entries are entered.
558Following this call, there will be 558Following this call, there will be
559.Fn pmap_remove 559.Fn pmap_remove
560calls resulting in every mapping being removed, followed by either 560calls resulting in every mapping being removed, followed by either
561.Fn pmap_destroy 561.Fn pmap_destroy
562or 562or
563.Fn pmap_update . 563.Fn pmap_update .
564No other 564No other
565.Nm pmap 565.Nm pmap
566interfaces which take 566interfaces which take
567.Fa pmap 567.Fa pmap
568as an argument will be called during this process. 568as an argument will be called during this process.
569Other interfaces which might need to access 569Other interfaces which might need to access
570.Fa pmap 570.Fa pmap
571(such as 571(such as
572.Fn pmap_page_protect ) 572.Fn pmap_page_protect )
573are permitted during this process. 573are permitted during this process.
574.Pp 574.Pp
575The 575The
576.Nm pmap 576.Nm pmap
577implementation is free to either remove all the 577implementation is free to either remove all the
578.Nm pmap Ns 's 578.Nm pmap Ns 's
579mappings immediately in 579mappings immediately in
580.Fn pmap_remove_all , 580.Fn pmap_remove_all ,
581or to use the knowledge of the upcoming 581or to use the knowledge of the upcoming
582.Fn pmap_remove 582.Fn pmap_remove
583calls to optimize the removals (or to just ignore this call). 583calls to optimize the removals (or to just ignore this call).
584.Pp 584.Pp
585If all mappings in the address space have been removed, 585If all mappings in the address space have been removed,
586.Fn pmap_remove_all 586.Fn pmap_remove_all
587should return 587should return
588.Dv true 588.Dv true
589to indicate that that the pmap is now empty. 589to indicate that that the pmap is now empty.
590In this case UVM will skip all subsequent calls to 590In this case UVM will skip all subsequent calls to
591.Fn pmap_remove 591.Fn pmap_remove
592and 592and
593.Fn pmap_update 593.Fn pmap_update
594for the pmap, that would otherwise be required to clean it out. 594for the pmap, that would otherwise be required to clean it out.
595If any mappings could possibly remain, 595If any mappings could possibly remain,
596.Fn pmap_remove_all 596.Fn pmap_remove_all
597must return 597must return
598.Dv false . 598.Dv false .
599.It void Fn "pmap_protect" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva" \ 599.It void Fn "pmap_protect" "pmap_t pmap" "vaddr_t sva" "vaddr_t eva" \
600 "vm_prot_t prot" 600 "vm_prot_t prot"
601Set the protection of the mappings in the virtual address range 601Set the protection of the mappings in the virtual address range
602.Fa sva 602.Fa sva
603to 603to
604.Fa eva 604.Fa eva
605in the specified physical map. 605in the specified physical map.
606.It void Fn "pmap_unwire" "pmap_t pmap" "vaddr_t va" 606.It void Fn "pmap_unwire" "pmap_t pmap" "vaddr_t va"
607Clear the 607Clear the
608.Dq wired 608.Dq wired
609attribute on the mapping for virtual address 609attribute on the mapping for virtual address
610.Fa va . 610.Fa va .
611.It bool Fn "pmap_extract" "pmap_t pmap" "vaddr_t va" "paddr_t *pap" 611.It bool Fn "pmap_extract" "pmap_t pmap" "vaddr_t va" "paddr_t *pap"
612This function extracts a mapping from the specified physical map. 612This function extracts a mapping from the specified physical map.
613It serves two purposes: to determine if a mapping exists for the specified 613It serves two purposes: to determine if a mapping exists for the specified
614virtual address, and to determine what physical address is mapped at the 614virtual address, and to determine what physical address is mapped at the
615specified virtual address. 615specified virtual address.
616The 616The
617.Fn pmap_extract 617.Fn pmap_extract
618should return the physical address for any kernel-accessible address, 618should return the physical address for any kernel-accessible address,
619including KSEG-style direct-mapped kernel addresses. 619including KSEG-style direct-mapped kernel addresses.
620.Pp 620.Pp
621The 621The
622.Fn pmap_extract 622.Fn pmap_extract
623function returns 623function returns
624.Dv false 624.Dv false
625if a mapping for 625if a mapping for
626.Fa va 626.Fa va
627does not exist. 627does not exist.
628Otherwise, it returns 628Otherwise, it returns
629.Dv true 629.Dv true
630and places the physical address mapped at 630and places the physical address mapped at
631.Fa va 631.Fa va
632into 632into
633.Fa *pap 633.Fa *pap
634if the 634if the
635.Fa pap 635.Fa pap
636argument is non-NULL. 636argument is non-NULL.
637.It void Fn "pmap_kenter_pa" "vaddr_t va" "paddr_t pa" "vm_prot_t prot" \ 637.It void Fn "pmap_kenter_pa" "vaddr_t va" "paddr_t pa" "vm_prot_t prot" \
638 "u_int flags" 638 "u_int flags"
639Enter an 639Enter an
640.Dq unmanaged 640.Dq unmanaged
641mapping for physical address 641mapping for physical address
642.Fa pa 642.Fa pa
643at virtual address 643at virtual address
644.Fa va 644.Fa va
645with protection specified by bits in 645with protection specified by bits in
646.Fa prot : 646.Fa prot :
647.Bl -tag -width "VM_PROT_EXECUTE " -offset indent 647.Bl -tag -width "VM_PROT_EXECUTE " -offset indent
648.It VM_PROT_READ 648.It VM_PROT_READ
649The mapping must allow reading. 649The mapping must allow reading.
650.It VM_PROT_WRITE 650.It VM_PROT_WRITE
651The mapping must allow writing. 651The mapping must allow writing.
652.It VM_PROT_EXECUTE 652.It VM_PROT_EXECUTE
653The page mapped contains instructions that will be executed by the 653The page mapped contains instructions that will be executed by the
654processor. 654processor.
655.El 655.El
656.Pp 656.Pp
657Information provided by 657Information provided by
658.Fa flags : 658.Fa flags :
659.Bl -tag -width "PMAP_NOCACHE " -offset indent 659.Bl -tag -width "PMAP_NOCACHE " -offset indent
660.It PMAP_NOCACHE 660.It PMAP_NOCACHE
661The mapping being created is 661The mapping being created is
662.Em not 662.Em not
663cached. 663cached.
664Write accesses have a write-through policy. 664Write accesses have a write-through policy.
665No speculative memory accesses. 665No speculative memory accesses.
666.It PMAP_WRITE_COMBINE 666.It PMAP_WRITE_COMBINE
667The mapping being created is 667The mapping being created is
668.Em not 668.Em not
669cached. 669cached.
670Writes are combined and done in one burst. 670Writes are combined and done in one burst.
671Speculative read accesses may be allowed. 671Speculative read accesses may be allowed.
672.It PMAP_WRITE_BACK 672.It PMAP_WRITE_BACK
673All accesses to the created mapping are cached. 673All accesses to the created mapping are cached.
674On reads, cachelines become shared or exclusive if allocated on cache miss. 674On reads, cachelines become shared or exclusive if allocated on cache miss.
675On writes, cachelines become modified on a cache miss. 675On writes, cachelines become modified on a cache miss.
676.It PMAP_NOCACHE_OVR 676.It PMAP_NOCACHE_OVR
677Same as PMAP_NOCACHE but mapping is overrideable (e.g. on x86 by MTRRs). 677Same as PMAP_NOCACHE but mapping is overrideable (e.g. on x86 by MTRRs).
678.El 678.El
679.Pp 679.Pp
680Mappings of this type are always 680Mappings of this type are always
681.Dq wired , 681.Dq wired ,
682and are unaffected by routines that alter the protection of pages 682and are unaffected by routines that alter the protection of pages
683(such as 683(such as
684.Fn pmap_page_protect ) . 684.Fn pmap_page_protect ) .
685Such mappings are also not included in the gathering of modified/referenced 685Such mappings are also not included in the gathering of modified/referenced
686information about a page. 686information about a page.
687Mappings entered with 687Mappings entered with
688.Fn pmap_kenter_pa 688.Fn pmap_kenter_pa
689by machine-independent code 689by machine-independent code
690.Em must not 690.Em must not
691have execute permission, as the 691have execute permission, as the
692data structures required to track execute permission of a page may not 692data structures required to track execute permission of a page may not
693be available to 693be available to
694.Fn pmap_kenter_pa . 694.Fn pmap_kenter_pa .
695Machine-independent code is not allowed to enter a mapping with 695Machine-independent code is not allowed to enter a mapping with
696.Fn pmap_kenter_pa 696.Fn pmap_kenter_pa
697at a virtual address for which a valid mapping already exists. 697at a virtual address for which a valid mapping already exists.
698Mappings created with 698Mappings created with
699.Fn pmap_kenter_pa 699.Fn pmap_kenter_pa
700may be removed only with a call to 700may be removed only with a call to
701.Fn pmap_kremove . 701.Fn pmap_kremove .
702.Pp 702.Pp
703Note that 703Note that
704.Fn pmap_kenter_pa 704.Fn pmap_kenter_pa
705must be safe for use in interrupt context. 705must be safe for use in interrupt context.
706.Fn splvm 706.Fn splvm
707blocks interrupts that might cause 707blocks interrupts that might cause
708.Fn pmap_kenter_pa 708.Fn pmap_kenter_pa
709to be called. 709to be called.
710.It void Fn "pmap_kremove" "vaddr_t va" "vsize_t size" 710.It void Fn "pmap_kremove" "vaddr_t va" "vsize_t size"
711Remove all mappings starting at virtual address 711Remove all mappings starting at virtual address
712.Fa va 712.Fa va
713for 713for
714.Fa size 714.Fa size
715bytes from the kernel physical map. 715bytes from the kernel physical map.
716All mappings that are removed must be the 716All mappings that are removed must be the
717.Dq unmanaged 717.Dq unmanaged
718type created with 718type created with
719.Fn pmap_kenter_pa . 719.Fn pmap_kenter_pa .
720The implementation may assert this. 720The implementation may assert this.
721.It void Fn "pmap_copy" "pmap_t dst_map" "pmap_t src_map" "vaddr_t dst_addr" \ 721.It void Fn "pmap_copy" "pmap_t dst_map" "pmap_t src_map" "vaddr_t dst_addr" \
722 "vsize_t len" "vaddr_t src_addr" 722 "vsize_t len" "vaddr_t src_addr"
723This function copies the mappings starting at 723This function copies the mappings starting at
724.Fa src_addr 724.Fa src_addr
725in 725in
726.Fa src_map 726.Fa src_map
727for 727for
728.Fa len 728.Fa len
729bytes into 729bytes into
730.Fa dst_map 730.Fa dst_map
731starting at 731starting at
732.Fa dst_addr . 732.Fa dst_addr .
733.Pp 733.Pp
734Note that while this function is required to be provided by a 734Note that while this function is required to be provided by a
735.Nm 735.Nm
736implementation, it is not actually required to do anything. 736implementation, it is not actually required to do anything.
737.Fn pmap_copy 737.Fn pmap_copy
738is merely advisory (it is used in the 738is merely advisory (it is used in the
739.Xr fork 2 739.Xr fork 2
740path to 740path to
741.Dq pre-fault 741.Dq pre-fault
742the child's address space). 742the child's address space).
743.It void Fn "pmap_update" "pmap_t pmap" 743.It void Fn "pmap_update" "pmap_t pmap"
744This function is used to inform the 744This function is used to inform the
745.Nm 745.Nm
746module that all physical mappings, for the specified pmap, must now be 746module that all physical mappings, for the specified pmap, must now be
747correct. 747correct.
748That is, all delayed virtual-to-physical mappings updates (such as TLB 748That is, all delayed virtual-to-physical mappings updates (such as TLB
749invalidation or address space identifier updates) must be completed. 749invalidation or address space identifier updates) must be completed.
750This routine must be used after calls to 750This routine must be used after calls to
751.Fn pmap_enter , 751.Fn pmap_enter ,
752.Fn pmap_remove , 752.Fn pmap_remove ,
753.Fn pmap_protect , 753.Fn pmap_protect ,
754.Fn pmap_kenter_pa , 754.Fn pmap_kenter_pa ,
755and 755and
756.Fn pmap_kremove 756.Fn pmap_kremove
757in order to ensure correct operation of the virtual memory system. 757in order to ensure correct operation of the virtual memory system.
758.Pp 758.Pp
759If a 759If a
760.Nm 760.Nm
761implementation does not delay virtual-to-physical mapping updates, 761implementation does not delay virtual-to-physical mapping updates,
762.Fn pmap_update 762.Fn pmap_update
763has no operation. 763has no operation.
764In this case, the call may be deleted using a C pre-processor macro in 764In this case, the call may be deleted using a C pre-processor macro in
765.In machine/pmap.h . 765.In machine/pmap.h .
766.It void Fn "pmap_activate" "struct lwp *l" 766.It void Fn "pmap_activate" "struct lwp *l"
767Activate the physical map used by the process behind lwp 767Activate the physical map used by the process behind lwp
768.Fa l . 768.Fa l .
 769on the current CPU.
769This is called by the virtual memory system when the 770This is called by the virtual memory system when the
770virtual memory context for a process is changed, and is also 771virtual memory context for a process is changed, and is also
771often used by machine-dependent context switch code to program 772used by the context switch code to program the memory management hardware
772the memory management hardware with the process's page table 773with the process's page table base, etc.
773base, etc. 774All calls to
774Note that 
775.Fn pmap_activate 775.Fn pmap_activate
776may not always be called when 776from machine-independent code are made with preemption disabled and with
777.Fa l 777.Fa l
778is the current lwp. 778as the current lwp.
779.Fn pmap_activate 
780must be able to handle this scenario. 
781.Pp 779.Pp
782The 780The
783.Fn pmap_activate 781.Fn pmap_activate
784call, like 782call, like
785.Fn pmap_deactivate , 783.Fn pmap_deactivate ,
786must never block, as it is used for context switching. 784must never block, as it is used for context switching.
787.It void Fn "pmap_deactivate" "struct lwp *l" 785.It void Fn "pmap_deactivate" "struct lwp *l"
788Deactivate the physical map used by the process behind lwp 786Deactivate the physical map used by the process behind lwp
789.Fa l . 787.Fa l .
790It is generally used in conjunction with 788It is generally used in conjunction with
791.Fn pmap_activate . 789.Fn pmap_activate .
792Like 790Like
793.Fn pmap_activate , 791.Fn pmap_activate ,
794.Fn pmap_deactivate 792.Fn pmap_deactivate
795may not always be called when 793is called by machine-independent code with preemption disabled and with
796.Fa l 794.Fa l
797is the current lwp. 795as the current lwp.
798.Pp 796.Pp
799As above, 797As above,
800.Fn pmap_deactivate 798.Fn pmap_deactivate
801must never block. 799must never block.
802.It void Fn "pmap_zero_page" "paddr_t pa" 800.It void Fn "pmap_zero_page" "paddr_t pa"
803Zero the PAGE_SIZE sized region starting at physical address 801Zero the PAGE_SIZE sized region starting at physical address
804.Fa pa . 802.Fa pa .
805The 803The
806.Nm 804.Nm
807implementation must take whatever steps are necessary to map the 805implementation must take whatever steps are necessary to map the
808page to a kernel-accessible address and zero the page. 806page to a kernel-accessible address and zero the page.
809It is suggested that implementations use an optimized zeroing algorithm, 807It is suggested that implementations use an optimized zeroing algorithm,
810as the performance of this function directly impacts page fault performance. 808as the performance of this function directly impacts page fault performance.
811The implementation may assume that the region is 809The implementation may assume that the region is
812PAGE_SIZE aligned and exactly PAGE_SIZE bytes in length. 810PAGE_SIZE aligned and exactly PAGE_SIZE bytes in length.
813.Pp 811.Pp
814Note that the cache configuration of the platform should also be 812Note that the cache configuration of the platform should also be
815considered in the implementation of 813considered in the implementation of
816.Fn pmap_zero_page . 814.Fn pmap_zero_page .
817For example, on systems with a physically-addressed cache, the cache 815For example, on systems with a physically-addressed cache, the cache
818load caused by zeroing the page will not be wasted, as the zeroing is 816load caused by zeroing the page will not be wasted, as the zeroing is
819usually done on-demand. 817usually done on-demand.
820However, on systems with a virtually-addressed cached, the cache load 818However, on systems with a virtually-addressed cached, the cache load
821caused by zeroing the page 819caused by zeroing the page
822.Em will 820.Em will
823be wasted, as the page will be mapped at a virtual address which is 821be wasted, as the page will be mapped at a virtual address which is
824different from that used to zero the page. 822different from that used to zero the page.
825In the virtually-addressed cache case, care should also be taken to 823In the virtually-addressed cache case, care should also be taken to
826avoid cache alias problems. 824avoid cache alias problems.
827.It void Fn "pmap_copy_page" "paddr_t src" "paddr_t dst" 825.It void Fn "pmap_copy_page" "paddr_t src" "paddr_t dst"
828Copy the PAGE_SIZE sized region starting at physical address 826Copy the PAGE_SIZE sized region starting at physical address
829.Fa src 827.Fa src
830to the same sized region starting at physical address 828to the same sized region starting at physical address
831.Fa dst . 829.Fa dst .
832The 830The
833.Nm 831.Nm
834implementation must take whatever steps are necessary to map the 832implementation must take whatever steps are necessary to map the
835source and destination pages to a kernel-accessible address and 833source and destination pages to a kernel-accessible address and
836perform the copy. 834perform the copy.
837It is suggested that implementations use an optimized copy algorithm, 835It is suggested that implementations use an optimized copy algorithm,
838as the performance of this function directly impacts page fault performance. 836as the performance of this function directly impacts page fault performance.
839The implementation may assume that both regions are PAGE_SIZE aligned 837The implementation may assume that both regions are PAGE_SIZE aligned
840and exactly PAGE_SIZE bytes in length. 838and exactly PAGE_SIZE bytes in length.
841.Pp 839.Pp
842The same cache considerations that apply to 840The same cache considerations that apply to
843.Fn pmap_zero_page 841.Fn pmap_zero_page
844apply to 842apply to
845.Fn pmap_copy_page . 843.Fn pmap_copy_page .
846.It void Fn "pmap_page_protect" "struct vm_page *pg" "vm_prot_t prot" 844.It void Fn "pmap_page_protect" "struct vm_page *pg" "vm_prot_t prot"
847Lower the permissions for all mappings of the page 845Lower the permissions for all mappings of the page
848.Fa pg 846.Fa pg
849to 847to
850.Fa prot . 848.Fa prot .
851This function is used by the virtual memory system to implement 849This function is used by the virtual memory system to implement
852copy-on-write (called with VM_PROT_READ set in 850copy-on-write (called with VM_PROT_READ set in
853.Fa prot ) 851.Fa prot )
854and to revoke all mappings when cleaning a page (called with 852and to revoke all mappings when cleaning a page (called with
855no bits set in 853no bits set in
856.Fa prot ) . 854.Fa prot ) .
857Access permissions must never be added to a page as a result of 855Access permissions must never be added to a page as a result of
858this call. 856this call.
859.It bool Fn "pmap_clear_modify" "struct vm_page *pg" 857.It bool Fn "pmap_clear_modify" "struct vm_page *pg"
860Clear the 858Clear the
861.Dq modified 859.Dq modified
862attribute on the page 860attribute on the page
863.Fa pg . 861.Fa pg .
864.Pp 862.Pp
865The 863The
866.Fn pmap_clear_modify 864.Fn pmap_clear_modify
867function returns 865function returns
868.Dv true 866.Dv true
869or 867or
870.Dv false 868.Dv false
871indicating whether or not the 869indicating whether or not the
872.Dq modified 870.Dq modified
873attribute was set on the page before it was cleared. 871attribute was set on the page before it was cleared.
874.Pp 872.Pp
875Note that this function may be provided as a C pre-processor macro. 873Note that this function may be provided as a C pre-processor macro.
876.It bool Fn "pmap_clear_reference" "struct vm_page *pg" 874.It bool Fn "pmap_clear_reference" "struct vm_page *pg"
877Clear the 875Clear the
878.Dq referenced 876.Dq referenced
879attribute on the page 877attribute on the page
880.Fa pg . 878.Fa pg .
881.Pp 879.Pp
882The 880The
883.Fn pmap_clear_reference 881.Fn pmap_clear_reference
884function returns 882function returns
885.Dv true 883.Dv true
886or 884or
887.Dv false 885.Dv false
888indicating whether or not the 886indicating whether or not the
889.Dq referenced 887.Dq referenced
890attribute was set on the page before it was cleared. 888attribute was set on the page before it was cleared.
891.Pp 889.Pp
892Note that this function may be provided as a C pre-processor macro. 890Note that this function may be provided as a C pre-processor macro.
893.It bool Fn "pmap_is_modified" "struct vm_page *pg" 891.It bool Fn "pmap_is_modified" "struct vm_page *pg"
894Test whether or not the 892Test whether or not the
895.Dq modified 893.Dq modified
896attribute is set on page 894attribute is set on page
897.Fa pg . 895.Fa pg .
898.Pp 896.Pp
899Note that this function may be provided as a C pre-processor macro. 897Note that this function may be provided as a C pre-processor macro.
900.It bool Fn "pmap_is_referenced" "struct vm_page *pg" 898.It bool Fn "pmap_is_referenced" "struct vm_page *pg"
901Test whether or not the 899Test whether or not the
902.Dq referenced 900.Dq referenced
903attribute is set on page 901attribute is set on page
904.Fa pg . 902.Fa pg .
905.Pp 903.Pp
906Note that this function may be provided as a C pre-processor macro. 904Note that this function may be provided as a C pre-processor macro.
907.It paddr_t Fn "pmap_phys_address" "paddr_t cookie" 905.It paddr_t Fn "pmap_phys_address" "paddr_t cookie"
908Convert a cookie returned by a device 906Convert a cookie returned by a device
909.Fn mmap 907.Fn mmap
910function into a physical address. 908function into a physical address.
911This function is provided to accommodate systems which have physical 909This function is provided to accommodate systems which have physical
912address spaces larger than can be directly addressed by the platform's 910address spaces larger than can be directly addressed by the platform's
913.Fa paddr_t 911.Fa paddr_t
914type. 912type.
915The existence of this function is highly dubious, and it is 913The existence of this function is highly dubious, and it is
916expected that this function will be removed from the 914expected that this function will be removed from the
917.Nm pmap 915.Nm pmap
918API in a future release of 916API in a future release of
919.Nx . 917.Nx .
920.Pp 918.Pp
921Note that this function may be provided as a C pre-processor macro. 919Note that this function may be provided as a C pre-processor macro.
922.El 920.El
923.Ss OPTIONAL FUNCTIONS 921.Ss OPTIONAL FUNCTIONS
924This section describes several optional functions in the 922This section describes several optional functions in the
925.Nm 923.Nm
926API. 924API.
927.Bl -tag -width indent -offset indent 925.Bl -tag -width indent -offset indent
928.It vaddr_t Fn "pmap_steal_memory" "vsize_t size" "vaddr_t *vstartp" \ 926.It vaddr_t Fn "pmap_steal_memory" "vsize_t size" "vaddr_t *vstartp" \
929 "vaddr_t *vendp" 927 "vaddr_t *vendp"
930This function is a bootstrap memory allocator, which may be provided 928This function is a bootstrap memory allocator, which may be provided
931as an alternative to the bootstrap memory allocator used within 929as an alternative to the bootstrap memory allocator used within
932.Xr uvm 9 930.Xr uvm 9
933itself. 931itself.
934It is particularly useful on systems which provide for example a direct-mapped 932It is particularly useful on systems which provide for example a direct-mapped
935memory segment. 933memory segment.
936This function works by stealing pages from the (to be) managed memory 934This function works by stealing pages from the (to be) managed memory
937pool, which has already been provided to 935pool, which has already been provided to
938.Xr uvm 9 936.Xr uvm 9
939in the vm_physmem[] array. 937in the vm_physmem[] array.
940The pages are then mapped, or otherwise made accessible to the kernel, 938The pages are then mapped, or otherwise made accessible to the kernel,
941in a machine-dependent way. 939in a machine-dependent way.
942The memory must be zeroed by 940The memory must be zeroed by
943.Fn pmap_steal_memory . 941.Fn pmap_steal_memory .
944Note that memory allocated with 942Note that memory allocated with
945.Fn pmap_steal_memory 943.Fn pmap_steal_memory
946will never be freed, and mappings made by 944will never be freed, and mappings made by
947.Fn pmap_steal_memory 945.Fn pmap_steal_memory
948must never be 946must never be
949.Dq forgotten . 947.Dq forgotten .
950.Pp 948.Pp
951Note that 949Note that
952.Fn pmap_steal_memory 950.Fn pmap_steal_memory
953should not be used as a general-purpose early-startup memory 951should not be used as a general-purpose early-startup memory
954allocation routine. 952allocation routine.
955It is intended to be used only by the 953It is intended to be used only by the
956.Fn uvm_pageboot_alloc 954.Fn uvm_pageboot_alloc
957routine and its supporting routines. 955routine and its supporting routines.
958If you need to allocate memory before the virtual memory system is 956If you need to allocate memory before the virtual memory system is
959initialized, use 957initialized, use
960.Fn uvm_pageboot_alloc . 958.Fn uvm_pageboot_alloc .
961See 959See
962.Xr uvm 9 960.Xr uvm 9
963for more information. 961for more information.
964.Pp 962.Pp
965The 963The
966.Fn pmap_steal_memory 964.Fn pmap_steal_memory
967function returns the kernel-accessible address of the allocated memory. 965function returns the kernel-accessible address of the allocated memory.
968If no memory can be allocated, or if allocated memory cannot be mapped, 966If no memory can be allocated, or if allocated memory cannot be mapped,
969the function must panic. 967the function must panic.
970.Pp 968.Pp
971If the 969If the
972.Fn pmap_steal_memory 970.Fn pmap_steal_memory
973function uses address space from the range provided to 971function uses address space from the range provided to
974.Xr uvm 9 972.Xr uvm 9
975by the 973by the
976.Fn pmap_virtual_space 974.Fn pmap_virtual_space
977call, then 975call, then
978.Fn pmap_steal_memory 976.Fn pmap_steal_memory
979must adjust 977must adjust
980.Fa *vstartp 978.Fa *vstartp
981and 979and
982.Fa *vendp 980.Fa *vendp
983upon return. 981upon return.
984.Pp 982.Pp
985The 983The
986.Fn pmap_steal_memory 984.Fn pmap_steal_memory
987function is enabled by defining the C pre-processor macro 985function is enabled by defining the C pre-processor macro
988.Dv PMAP_STEAL_MEMORY 986.Dv PMAP_STEAL_MEMORY
989in 987in
990.In machine/pmap.h . 988.In machine/pmap.h .
991.It vaddr_t Fn "pmap_growkernel" "vaddr_t maxkvaddr" 989.It vaddr_t Fn "pmap_growkernel" "vaddr_t maxkvaddr"
992Management of the kernel virtual address space is complicated by the 990Management of the kernel virtual address space is complicated by the
993fact that it is not always safe to wait for resources with which to 991fact that it is not always safe to wait for resources with which to
994map a kernel virtual address. 992map a kernel virtual address.
995However, it is not always desirable to pre-allocate all resources 993However, it is not always desirable to pre-allocate all resources
996necessary to map the entire kernel virtual address space. 994necessary to map the entire kernel virtual address space.
997.Pp 995.Pp
998The 996The
999.Fn pmap_growkernel 997.Fn pmap_growkernel
1000interface is designed to help alleviate this problem. 998interface is designed to help alleviate this problem.
1001The virtual memory startup code may choose to allocate an initial set 999The virtual memory startup code may choose to allocate an initial set
1002of mapping resources (e.g., page tables) and set an internal variable 1000of mapping resources (e.g., page tables) and set an internal variable
1003indicating how much kernel virtual address space can be mapped using 1001indicating how much kernel virtual address space can be mapped using
1004those initial resources. 1002those initial resources.
1005Then, when the virtual memory system wishes to map something 1003Then, when the virtual memory system wishes to map something
1006at an address beyond that initial limit, it calls 1004at an address beyond that initial limit, it calls
1007.Fn pmap_growkernel 1005.Fn pmap_growkernel
1008to pre-allocate more sources with which to create the mapping. 1006to pre-allocate more sources with which to create the mapping.
1009Note that once additional kernel virtual address space mapping resources 1007Note that once additional kernel virtual address space mapping resources
1010have been allocated, they should not be freed; it is likely they will 1008have been allocated, they should not be freed; it is likely they will
1011be needed again. 1009be needed again.
1012.Pp 1010.Pp
1013The 1011The
1014.Fn pmap_growkernel 1012.Fn pmap_growkernel
1015function returns the new maximum kernel virtual address that can be mapped 1013function returns the new maximum kernel virtual address that can be mapped
1016with the resources it has available. 1014with the resources it has available.
1017If new resources cannot be allocated, 1015If new resources cannot be allocated,
1018.Fn pmap_growkernel 1016.Fn pmap_growkernel
1019must panic. 1017must panic.
1020.Pp 1018.Pp
1021The 1019The
1022.Fn pmap_growkernel 1020.Fn pmap_growkernel
1023function is enabled by defining the C pre-processor macro 1021function is enabled by defining the C pre-processor macro
1024.Dv PMAP_GROWKERNEL 1022.Dv PMAP_GROWKERNEL
1025in 1023in
1026.In machine/pmap.h . 1024.In machine/pmap.h .
1027.It void Fn "pmap_fork" "pmap_t src_map" "pmap_t dst_map" 1025.It void Fn "pmap_fork" "pmap_t src_map" "pmap_t dst_map"
1028Some 1026Some
1029.Nm 1027.Nm
1030implementations may need to keep track of other information not 1028implementations may need to keep track of other information not
1031directly related to the virtual address space. 1029directly related to the virtual address space.
1032For example, on the i386 port, the Local Descriptor Table state of a 1030For example, on the i386 port, the Local Descriptor Table state of a
1033process is associated with the pmap (this is due to the fact that 1031process is associated with the pmap (this is due to the fact that
1034applications manipulate the Local Descriptor Table directly expect it 1032applications manipulate the Local Descriptor Table directly expect it
1035to be logically associated with the virtual memory state of the process). 1033to be logically associated with the virtual memory state of the process).
1036.Pp 1034.Pp
1037The 1035The
1038.Fn pmap_fork 1036.Fn pmap_fork
1039function is provided as a way to associate information from 1037function is provided as a way to associate information from
1040.Fa src_map 1038.Fa src_map
1041with 1039with
1042.Fa dst_map 1040.Fa dst_map
1043when a 1041when a
1044.Dv vmspace 1042.Dv vmspace
1045is forked. 1043is forked.
1046.Fn pmap_fork 1044.Fn pmap_fork
1047is called from 1045is called from
1048.Fn uvmspace_fork . 1046.Fn uvmspace_fork .
1049.Pp 1047.Pp
1050The 1048The
1051.Fn pmap_fork 1049.Fn pmap_fork
1052function is enabled by defining the C pre-processor macro 1050function is enabled by defining the C pre-processor macro
1053.Dv PMAP_FORK 1051.Dv PMAP_FORK
1054in 1052in
1055.In machine/pmap.h . 1053.In machine/pmap.h .
1056.It vaddr_t Fn "PMAP_MAP_POOLPAGE" "paddr_t pa" 1054.It vaddr_t Fn "PMAP_MAP_POOLPAGE" "paddr_t pa"
1057This function is used by the 1055This function is used by the
1058.Xr pool 9 1056.Xr pool 9
1059memory pool manager. 1057memory pool manager.
1060Pools allocate backing pages one at a time. 1058Pools allocate backing pages one at a time.
1061This is provided as a means to use hardware features such as a 1059This is provided as a means to use hardware features such as a
1062direct-mapped memory segment to map the pages used by the 1060direct-mapped memory segment to map the pages used by the
1063.Xr pool 9 1061.Xr pool 9
1064allocator. 1062allocator.
1065This can lead to better performance by e.g. reducing TLB contention. 1063This can lead to better performance by e.g. reducing TLB contention.
1066.Pp 1064.Pp
1067.Fn PMAP_MAP_POOLPAGE 1065.Fn PMAP_MAP_POOLPAGE
1068returns the kernel-accessible address of the page being mapped. 1066returns the kernel-accessible address of the page being mapped.
1069It must always succeed. 1067It must always succeed.
1070.Pp 1068.Pp
1071The use of 1069The use of
1072.Fn PMAP_MAP_POOLPAGE 1070.Fn PMAP_MAP_POOLPAGE
1073is enabled by defining it as a C pre-processor macro in 1071is enabled by defining it as a C pre-processor macro in
1074.In machine/pmap.h . 1072.In machine/pmap.h .
1075If 1073If
1076.Fn PMAP_MAP_POOLPAGE 1074.Fn PMAP_MAP_POOLPAGE
1077is defined, 1075is defined,
1078.Fn PMAP_UNMAP_POOLPAGE 1076.Fn PMAP_UNMAP_POOLPAGE
1079must also be defined. 1077must also be defined.
1080.Pp 1078.Pp
1081The following is an example of how to define 1079The following is an example of how to define
1082.Fn PMAP_MAP_POOLPAGE : 1080.Fn PMAP_MAP_POOLPAGE :
1083.Bd -literal -offset indent 1081.Bd -literal -offset indent
1084#define PMAP_MAP_POOLPAGE(pa) MIPS_PHYS_TO_KSEG0((pa)) 1082#define PMAP_MAP_POOLPAGE(pa) MIPS_PHYS_TO_KSEG0((pa))
1085.Ed 1083.Ed
1086.Pp 1084.Pp
1087This takes the physical address of a page and returns the KSEG0 1085This takes the physical address of a page and returns the KSEG0
1088address of that page on a MIPS processor. 1086address of that page on a MIPS processor.
1089.It paddr_t Fn "PMAP_UNMAP_POOLPAGE" "vaddr_t va" 1087.It paddr_t Fn "PMAP_UNMAP_POOLPAGE" "vaddr_t va"
1090This function is the inverse of 1088This function is the inverse of
1091.Fn PMAP_MAP_POOLPAGE . 1089.Fn PMAP_MAP_POOLPAGE .
1092.Pp 1090.Pp
1093.Fn PMAP_UNMAP_POOLPAGE 1091.Fn PMAP_UNMAP_POOLPAGE
1094returns the physical address of the page corresponding to the 1092returns the physical address of the page corresponding to the
1095provided kernel-accessible address. 1093provided kernel-accessible address.
1096.Pp 1094.Pp
1097The use of 1095The use of
1098.Fn PMAP_UNMAP_POOLPAGE 1096.Fn PMAP_UNMAP_POOLPAGE
1099is enabled by defining it as a C pre-processor macro in 1097is enabled by defining it as a C pre-processor macro in
1100.In machine/pmap.h . 1098.In machine/pmap.h .
1101If 1099If
1102.Fn PMAP_UNMAP_POOLPAGE 1100.Fn PMAP_UNMAP_POOLPAGE
1103is defined, 1101is defined,
1104.Fn PMAP_MAP_POOLPAGE 1102.Fn PMAP_MAP_POOLPAGE
1105must also be defined. 1103must also be defined.
1106.Pp 1104.Pp
1107The following is an example of how to define 1105The following is an example of how to define
1108.Fn PMAP_UNMAP_POOLPAGE : 1106.Fn PMAP_UNMAP_POOLPAGE :
1109.Bd -literal -offset indent 1107.Bd -literal -offset indent
1110#define PMAP_UNMAP_POOLPAGE(pa) MIPS_KSEG0_TO_PHYS((va)) 1108#define PMAP_UNMAP_POOLPAGE(pa) MIPS_KSEG0_TO_PHYS((va))
1111.Ed 1109.Ed
1112.Pp 1110.Pp
1113This takes the KSEG0 address of a previously-mapped pool page 1111This takes the KSEG0 address of a previously-mapped pool page
1114and returns the physical address of that page on a MIPS processor. 1112and returns the physical address of that page on a MIPS processor.
1115.It void Fn "PMAP_PREFER" "vaddr_t hint" "vaddr_t *vap" "vsize_t sz" "int td" 1113.It void Fn "PMAP_PREFER" "vaddr_t hint" "vaddr_t *vap" "vsize_t sz" "int td"
1116This function is used by 1114This function is used by
1117.Xr uvm_map 9 1115.Xr uvm_map 9
1118to adjust a virtual address being allocated in order to avoid 1116to adjust a virtual address being allocated in order to avoid
1119cache alias problems. 1117cache alias problems.
1120If necessary, the virtual address pointed by 1118If necessary, the virtual address pointed by
1121.Fa vap 1119.Fa vap
1122will be advanced. 1120will be advanced.
1123.Fa hint 1121.Fa hint
1124is an object offset which will be mapped into the resulting virtual address, and 1122is an object offset which will be mapped into the resulting virtual address, and
1125.Fa sz 1123.Fa sz
1126is size of the region being mapped in bytes. 1124is size of the region being mapped in bytes.
1127.Fa td 1125.Fa td
1128indicates if the machine dependent pmap uses the topdown VM. 1126indicates if the machine dependent pmap uses the topdown VM.
1129.Pp 1127.Pp
1130The use of 1128The use of
1131.Fn PMAP_PREFER 1129.Fn PMAP_PREFER
1132is enabled by defining it as a C pre-processor macro in 1130is enabled by defining it as a C pre-processor macro in
1133.In machine/pmap.h . 1131.In machine/pmap.h .
1134.It void Fn "pmap_procwr" "struct proc *p" "vaddr_t va" "vsize_t size" 1132.It void Fn "pmap_procwr" "struct proc *p" "vaddr_t va" "vsize_t size"
1135Synchronize CPU instruction caches of the specified range. 1133Synchronize CPU instruction caches of the specified range.
1136The address space is designated by 1134The address space is designated by
1137.Fa p . 1135.Fa p .
1138This function is typically used to flush instruction caches 1136This function is typically used to flush instruction caches
1139after code modification. 1137after code modification.
1140.Pp 1138.Pp
1141The use of 1139The use of
1142.Fn pmap_procwr 1140.Fn pmap_procwr
1143is enabled by defining a C pre-processor macro 1141is enabled by defining a C pre-processor macro
1144.Dv PMAP_NEED_PROCWR 1142.Dv PMAP_NEED_PROCWR
1145in 1143in
1146.In machine/pmap.h . 1144.In machine/pmap.h .
1147.El 1145.El
1148.Sh SEE ALSO 1146.Sh SEE ALSO
1149.Xr uvm 9 1147.Xr uvm 9
1150.Sh HISTORY 1148.Sh HISTORY
1151The 1149The
1152.Nm 1150.Nm
1153module was originally part of the design of the virtual memory system 1151module was originally part of the design of the virtual memory system
1154in the Mach Operating System. 1152in the Mach Operating System.
1155The goal was to provide a clean separation between the machine-independent 1153The goal was to provide a clean separation between the machine-independent
1156and the machine-dependent portions of the virtual memory system, in 1154and the machine-dependent portions of the virtual memory system, in
1157stark contrast to the original 1155stark contrast to the original
1158.Bx 3 1156.Bx 3
1159virtual memory system, which was specific to the VAX. 1157virtual memory system, which was specific to the VAX.
1160.Pp 1158.Pp
1161Between 1159Between
1162.Bx 4.3 1160.Bx 4.3
1163and 1161and
1164.Bx 4.4 , 1162.Bx 4.4 ,
1165the Mach virtual memory system, including the 1163the Mach virtual memory system, including the
1166.Nm 1164.Nm
1167API, was ported to 1165API, was ported to
1168.Bx 1166.Bx
1169and included in the 1167and included in the
1170.Bx 4.4 1168.Bx 4.4
1171release. 1169release.
1172.Pp 1170.Pp
1173.Nx 1171.Nx
1174inherited the 1172inherited the
1175.Bx 1173.Bx
1176version of the Mach virtual memory system. 1174version of the Mach virtual memory system.
1177.Nx 1.4 1175.Nx 1.4
1178was the first 1176was the first
1179.Nx 1177.Nx
1180release with the new 1178release with the new
1181.Xr uvm 9 1179.Xr uvm 9
1182virtual memory system, which included several changes to the 1180virtual memory system, which included several changes to the
1183.Nm 1181.Nm
1184API. 1182API.
1185Since the introduction of 1183Since the introduction of
1186.Xr uvm 9 , 1184.Xr uvm 9 ,
1187the 1185the
1188.Nm 1186.Nm
1189API has evolved further. 1187API has evolved further.
1190.Sh AUTHORS 1188.Sh AUTHORS
1191The original Mach VAX 1189The original Mach VAX
1192.Nm 1190.Nm
1193module was written by 1191module was written by
1194.An Avadis Tevanian, Jr. 1192.An Avadis Tevanian, Jr.
1195and 1193and
1196.An Michael Wayne Young . 1194.An Michael Wayne Young .
1197.Pp 1195.Pp
1198.An Mike Hibler 1196.An Mike Hibler
1199did the integration of the Mach virtual memory system into 1197did the integration of the Mach virtual memory system into
1200.Bx 4.4 1198.Bx 4.4
1201and implemented a 1199and implemented a
1202.Nm 1200.Nm
1203module for the Motorola 68020+68851/68030/68040. 1201module for the Motorola 68020+68851/68030/68040.
1204.Pp 1202.Pp
1205The 1203The
1206.Nm 1204.Nm
1207API as it exists in 1205API as it exists in
1208.Nx 1206.Nx
1209is derived from 1207is derived from
1210.Bx 4.4 , 1208.Bx 4.4 ,
1211and has been modified by 1209and has been modified by
1212.An Chuck Cranor , 1210.An Chuck Cranor ,
1213.An Charles M. Hannum , 1211.An Charles M. Hannum ,
1214.An Chuck Silvers , 1212.An Chuck Silvers ,
1215.An Wolfgang Solfrank , 1213.An Wolfgang Solfrank ,
1216.An Bill Sommerfeld , 1214.An Bill Sommerfeld ,
1217and 1215and
1218.An Jason R. Thorpe . 1216.An Jason R. Thorpe .
1219.Pp 1217.Pp
1220The author of this document is 1218The author of this document is
1221.An Jason R. Thorpe 1219.An Jason R. Thorpe
1222.Aq thorpej@NetBSD.org . 1220.Aq thorpej@NetBSD.org .
1223.Sh BUGS 1221.Sh BUGS
1224The use and definition of 1222The use and definition of
1225.Fn pmap_activate 1223.Fn pmap_activate
1226and 1224and
1227.Fn pmap_deactivate 1225.Fn pmap_deactivate
1228needs to be reexamined. 1226needs to be reexamined.
1229.Pp 1227.Pp
1230The use of 1228The use of
1231.Fn pmap_copy 1229.Fn pmap_copy
1232needs to be reexamined. 1230needs to be reexamined.
1233Empirical evidence suggests that performance of the system suffers when 1231Empirical evidence suggests that performance of the system suffers when
1234.Fn pmap_copy 1232.Fn pmap_copy
1235actually performs its defined function. 1233actually performs its defined function.
1236This is largely due to the fact that the copy of the virtual-to-physical 1234This is largely due to the fact that the copy of the virtual-to-physical
1237mappings is wasted if the process calls 1235mappings is wasted if the process calls
1238.Xr execve 2 1236.Xr execve 2
1239after 1237after
1240.Xr fork 2 . 1238.Xr fork 2 .
1241For this reason, it is recommended that 1239For this reason, it is recommended that
1242.Nm 1240.Nm
1243implementations leave the body of the 1241implementations leave the body of the
1244.Fn pmap_copy 1242.Fn pmap_copy
1245function empty for now. 1243function empty for now.