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