1.\" $NetBSD: pmap.9,v 1.47 2020/03/14 14:05:42 ad 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 March 14, 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 . 769This is called by the virtual memory system when the 770virtual memory context for a process is changed, and is also 771often used by machine-dependent context switch code to program 772the memory management hardware with the process's page table 773base, etc. 774Note that 775.Fn pmap_activate 776may not always be called when 777.Fa l 778is the current lwp. 779.Fn pmap_activate 780must be able to handle this scenario. 781.Pp 782The 783.Fn pmap_activate 784call, like 785.Fn pmap_deactivate , 786must never block, as it is used for context switching. 787.It void Fn "pmap_deactivate" "struct lwp *l" 788Deactivate the physical map used by the process behind lwp 789.Fa l . 790It is generally used in conjunction with 791.Fn pmap_activate . 792Like 793.Fn pmap_activate , 794.Fn pmap_deactivate 795may not always be called when 796.Fa l 797is the current lwp. 798.Pp 799As above, 800.Fn pmap_deactivate 801must never block. 802.It void Fn "pmap_zero_page" "paddr_t pa" 803Zero the PAGE_SIZE sized region starting at physical address 804.Fa pa . 805The 806.Nm 807implementation must take whatever steps are necessary to map the 808page to a kernel-accessible address and zero the page. 809It is suggested that implementations use an optimized zeroing algorithm, 810as the performance of this function directly impacts page fault performance. 811The implementation may assume that the region is 812PAGE_SIZE aligned and exactly PAGE_SIZE bytes in length. 813.Pp 814Note that the cache configuration of the platform should also be 815considered in the implementation of 816.Fn pmap_zero_page . 817For example, on systems with a physically-addressed cache, the cache 818load caused by zeroing the page will not be wasted, as the zeroing is 819usually done on-demand. 820However, on systems with a virtually-addressed cached, the cache load 821caused by zeroing the page 822.Em will 823be wasted, as the page will be mapped at a virtual address which is 824different from that used to zero the page. 825In the virtually-addressed cache case, care should also be taken to 826avoid cache alias problems. 827.It void Fn "pmap_copy_page" "paddr_t src" "paddr_t dst" 828Copy the PAGE_SIZE sized region starting at physical address 829.Fa src 830to the same sized region starting at physical address 831.Fa dst . 832The 833.Nm 834implementation must take whatever steps are necessary to map the 835source and destination pages to a kernel-accessible address and 836perform the copy. 837It is suggested that implementations use an optimized copy algorithm, 838as the performance of this function directly impacts page fault performance. 839The implementation may assume that both regions are PAGE_SIZE aligned 840and exactly PAGE_SIZE bytes in length. 841.Pp 842The same cache considerations that apply to 843.Fn pmap_zero_page 844apply to 845.Fn pmap_copy_page . 846.It void Fn "pmap_page_protect" "struct vm_page *pg" "vm_prot_t prot" 847Lower the permissions for all mappings of the page 848.Fa pg 849to 850.Fa prot . 851This function is used by the virtual memory system to implement 852copy-on-write (called with VM_PROT_READ set in 853.Fa prot ) 854and to revoke all mappings when cleaning a page (called with 855no bits set in 856.Fa prot ) . 857Access permissions must never be added to a page as a result of 858this call. 859.It bool Fn "pmap_clear_modify" "struct vm_page *pg" 860Clear the 861.Dq modified 862attribute on the page 863.Fa pg . 864.Pp 865The 866.Fn pmap_clear_modify 867function returns 868.Dv true 869or 870.Dv false 871indicating whether or not the 872.Dq modified 873attribute was set on the page before it was cleared. 874.Pp 875Note that this function may be provided as a C pre-processor macro. 876.It bool Fn "pmap_clear_reference" "struct vm_page *pg" 877Clear the 878.Dq referenced 879attribute on the page 880.Fa pg . 881.Pp 882The 883.Fn pmap_clear_reference 884function returns 885.Dv true 886or 887.Dv false 888indicating whether or not the 889.Dq referenced 890attribute was set on the page before it was cleared. 891.Pp 892Note that this function may be provided as a C pre-processor macro. 893.It bool Fn "pmap_is_modified" "struct vm_page *pg" 894Test whether or not the 895.Dq modified 896attribute is set on page 897.Fa pg . 898.Pp 899Note that this function may be provided as a C pre-processor macro. 900.It bool Fn "pmap_is_referenced" "struct vm_page *pg" 901Test whether or not the 902.Dq referenced 903attribute is set on page 904.Fa pg . 905.Pp 906Note that this function may be provided as a C pre-processor macro. 907.It paddr_t Fn "pmap_phys_address" "paddr_t cookie" 908Convert a cookie returned by a device 909.Fn mmap 910function into a physical address. 911This function is provided to accommodate systems which have physical 912address spaces larger than can be directly addressed by the platform's 913.Fa paddr_t 914type. 915The existence of this function is highly dubious, and it is 916expected that this function will be removed from the 917.Nm pmap 918API in a future release of 919.Nx . 920.Pp 921Note that this function may be provided as a C pre-processor macro. 922.El 923.Ss OPTIONAL FUNCTIONS 924This section describes several optional functions in the 925.Nm 926API. 927.Bl -tag -width indent -offset indent 928.It vaddr_t Fn "pmap_steal_memory" "vsize_t size" "vaddr_t *vstartp" \ 929 "vaddr_t *vendp" 930This function is a bootstrap memory allocator, which may be provided 931as an alternative to the bootstrap memory allocator used within 932.Xr uvm 9 933itself. 934It is particularly useful on systems which provide for example a direct-mapped 935memory segment. 936This function works by stealing pages from the (to be) managed memory 937pool, which has already been provided to 938.Xr uvm 9 939in the vm_physmem[] array. 940The pages are then mapped, or otherwise made accessible to the kernel, 941in a machine-dependent way. 942The memory must be zeroed by 943.Fn pmap_steal_memory . 944Note that memory allocated with 945.Fn pmap_steal_memory 946will never be freed, and mappings made by 947.Fn pmap_steal_memory 948must never be 949.Dq forgotten . 950.Pp 951Note that 952.Fn pmap_steal_memory 953should not be used as a general-purpose early-startup memory 954allocation routine. 955It is intended to be used only by the 956.Fn uvm_pageboot_alloc 957routine and its supporting routines. 958If you need to allocate memory before the virtual memory system is 959initialized, use 960.Fn uvm_pageboot_alloc . 961See 962.Xr uvm 9 963for more information. 964.Pp 965The 966.Fn pmap_steal_memory 967function returns the kernel-accessible address of the allocated memory. 968If no memory can be allocated, or if allocated memory cannot be mapped, 969the function must panic. 970.Pp 971If the 972.Fn pmap_steal_memory 973function uses address space from the range provided to 974.Xr uvm 9 975by the 976.Fn pmap_virtual_space 977call, then 978.Fn pmap_steal_memory 979must adjust 980.Fa *vstartp 981and 982.Fa *vendp 983upon return. 984.Pp 985The 986.Fn pmap_steal_memory 987function is enabled by defining the C pre-processor macro 988.Dv PMAP_STEAL_MEMORY 989in 990.In machine/pmap.h . 991.It vaddr_t Fn "pmap_growkernel" "vaddr_t maxkvaddr" 992Management of the kernel virtual address space is complicated by the 993fact that it is not always safe to wait for resources with which to 994map a kernel virtual address. 995However, it is not always desirable to pre-allocate all resources 996necessary to map the entire kernel virtual address space. 997.Pp 998The 999.Fn pmap_growkernel 1000interface is designed to help alleviate this problem. 1001The virtual memory startup code may choose to allocate an initial set 1002of mapping resources (e.g., page tables) and set an internal variable 1003indicating how much kernel virtual address space can be mapped using 1004those initial resources. 1005Then, when the virtual memory system wishes to map something 1006at an address beyond that initial limit, it calls 1007.Fn pmap_growkernel 1008to pre-allocate more sources with which to create the mapping. 1009Note that once additional kernel virtual address space mapping resources 1010have been allocated, they should not be freed; it is likely they will 1011be needed again. 1012.Pp 1013The 1014.Fn pmap_growkernel 1015function returns the new maximum kernel virtual address that can be mapped 1016with the resources it has available. 1017If new resources cannot be allocated, 1018.Fn pmap_growkernel 1019must panic. 1020.Pp 1021The 1022.Fn pmap_growkernel 1023function is enabled by defining the C pre-processor macro 1024.Dv PMAP_GROWKERNEL 1025in 1026.In machine/pmap.h . 1027.It void Fn "pmap_fork" "pmap_t src_map" "pmap_t dst_map" 1028Some 1029.Nm 1030implementations may need to keep track of other information not 1031directly related to the virtual address space. 1032For 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 1034applications manipulate the Local Descriptor Table directly expect it 1035to be logically associated with the virtual memory state of the process). 1036.Pp 1037The 1038.Fn pmap_fork 1039function is provided as a way to associate information from 1040.Fa src_map 1041with 1042.Fa dst_map 1043when a 1044.Dv vmspace 1045is forked. 1046.Fn pmap_fork 1047is called from 1048.Fn uvmspace_fork . 1049.Pp 1050The 1051.Fn pmap_fork 1052function is enabled by defining the C pre-processor macro 1053.Dv PMAP_FORK 1054in 1055.In machine/pmap.h . 1056.It vaddr_t Fn "PMAP_MAP_POOLPAGE" "paddr_t pa" 1057This function is used by the 1058.Xr pool 9 1059memory pool manager. 1060Pools allocate backing pages one at a time. 1061This is provided as a means to use hardware features such as a 1062direct-mapped memory segment to map the pages used by the 1063.Xr pool 9 1064allocator. 1065This can lead to better performance by e.g. reducing TLB contention. 1066.Pp 1067.Fn PMAP_MAP_POOLPAGE 1068returns the kernel-accessible address of the page being mapped. 1069It must always succeed. 1070.Pp 1071The use of 1072.Fn PMAP_MAP_POOLPAGE 1073is enabled by defining it as a C pre-processor macro in 1074.In machine/pmap.h . 1075If 1076.Fn PMAP_MAP_POOLPAGE 1077is defined, 1078.Fn PMAP_UNMAP_POOLPAGE 1079must also be defined. 1080.Pp 1081The following is an example of how to define 1082.Fn PMAP_MAP_POOLPAGE : 1083.Bd -literal -offset indent 1084#define PMAP_MAP_POOLPAGE(pa) MIPS_PHYS_TO_KSEG0((pa)) 1085.Ed 1086.Pp 1087This takes the physical address of a page and returns the KSEG0 1088address of that page on a MIPS processor. 1089.It paddr_t Fn "PMAP_UNMAP_POOLPAGE" "vaddr_t va" 1090This function is the inverse of 1091.Fn PMAP_MAP_POOLPAGE . 1092.Pp 1093.Fn PMAP_UNMAP_POOLPAGE 1094returns the physical address of the page corresponding to the 1095provided kernel-accessible address. 1096.Pp 1097The use of 1098.Fn PMAP_UNMAP_POOLPAGE 1099is enabled by defining it as a C pre-processor macro in 1100.In machine/pmap.h . 1101If 1102.Fn PMAP_UNMAP_POOLPAGE 1103is defined, 1104.Fn PMAP_MAP_POOLPAGE 1105must also be defined. 1106.Pp 1107The following is an example of how to define 1108.Fn PMAP_UNMAP_POOLPAGE : 1109.Bd -literal -offset indent 1110#define PMAP_UNMAP_POOLPAGE(pa) MIPS_KSEG0_TO_PHYS((va)) 1111.Ed 1112.Pp 1113This takes the KSEG0 address of a previously-mapped pool page 1114and 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" 1116This function is used by 1117.Xr uvm_map 9 1118to adjust a virtual address being allocated in order to avoid 1119cache alias problems. 1120If necessary, the virtual address pointed by 1121.Fa vap 1122will be advanced. 1123.Fa hint 1124is an object offset which will be mapped into the resulting virtual address, and 1125.Fa sz 1126is size of the region being mapped in bytes. 1127.Fa td 1128indicates if the machine dependent pmap uses the topdown VM. 1129.Pp 1130The use of 1131.Fn PMAP_PREFER 1132is enabled by defining it as a C pre-processor macro in 1133.In machine/pmap.h . 1134.It void Fn "pmap_procwr" "struct proc *p" "vaddr_t va" "vsize_t size" 1135Synchronize CPU instruction caches of the specified range. 1136The address space is designated by 1137.Fa p . 1138This function is typically used to flush instruction caches 1139after code modification. 1140.Pp 1141The use of 1142.Fn pmap_procwr 1143is enabled by defining a C pre-processor macro 1144.Dv PMAP_NEED_PROCWR 1145in 1146.In machine/pmap.h . 1147.El 1148.Sh SEE ALSO 1149.Xr uvm 9 1150.Sh HISTORY 1151The 1152.Nm 1153module was originally part of the design of the virtual memory system 1154in the Mach Operating System. 1155The goal was to provide a clean separation between the machine-independent 1156and the machine-dependent portions of the virtual memory system, in 1157stark contrast to the original 1158.Bx 3 1159virtual memory system, which was specific to the VAX. 1160.Pp 1161Between 1162.Bx 4.3 1163and 1164.Bx 4.4 , 1165the Mach virtual memory system, including the 1166.Nm 1167API, was ported to 1168.Bx 1169and included in the 1170.Bx 4.4 1171release. 1172.Pp 1173.Nx 1174inherited the 1175.Bx 1176version of the Mach virtual memory system. 1177.Nx 1.4 1178was the first 1179.Nx 1180release with the new 1181.Xr uvm 9 1182virtual memory system, which included several changes to the 1183.Nm 1184API. 1185Since the introduction of 1186.Xr uvm 9 , 1187the 1188.Nm 1189API has evolved further. 1190.Sh AUTHORS 1191The original Mach VAX 1192.Nm 1193module was written by 1194.An Avadis Tevanian, Jr. 1195and 1196.An Michael Wayne Young . 1197.Pp 1198.An Mike Hibler 1199did the integration of the Mach virtual memory system into 1200.Bx 4.4 1201and implemented a 1202.Nm 1203module for the Motorola 68020+68851/68030/68040. 1204.Pp 1205The 1206.Nm 1207API as it exists in 1208.Nx 1209is derived from 1210.Bx 4.4 , 1211and has been modified by 1212.An Chuck Cranor , 1213.An Charles M. Hannum , 1214.An Chuck Silvers , 1215.An Wolfgang Solfrank , 1216.An Bill Sommerfeld , 1217and 1218.An Jason R. Thorpe . 1219.Pp 1220The author of this document is 1221.An Jason R. Thorpe 1222.Aq thorpej@NetBSD.org . 1223.Sh BUGS 1224The use and definition of 1225.Fn pmap_activate 1226and 1227.Fn pmap_deactivate 1228needs to be reexamined. 1229.Pp 1230The use of 1231.Fn pmap_copy 1232needs to be reexamined. 1233Empirical evidence suggests that performance of the system suffers when 1234.Fn pmap_copy 1235actually performs its defined function. 1236This is largely due to the fact that the copy of the virtual-to-physical 1237mappings is wasted if the process calls 1238.Xr execve 2 1239after 1240.Xr fork 2 . 1241For this reason, it is recommended that 1242.Nm 1243implementations leave the body of the 1244.Fn pmap_copy 1245function empty for now. 1246