summaryrefslogtreecommitdiff
path: root/share/man/man9
diff options
context:
space:
mode:
authorMartin Pieuchot <mpi@cvs.openbsd.org>2019-12-05 15:14:29 +0000
committerMartin Pieuchot <mpi@cvs.openbsd.org>2019-12-05 15:14:29 +0000
commit3a6ea69ab8dbb923f79a9ea231945e06344895a0 (patch)
treed1a1195a095770285c4106ca43a98501aad59432 /share/man/man9
parent8e454681a8053bb3cb659946fe1900ce84b859a6 (diff)
Split uvm(9) into smaller manuals.
ok jmc@, deraadt@, schwarze@
Diffstat (limited to 'share/man/man9')
-rw-r--r--share/man/man9/Makefile10
-rw-r--r--share/man/man9/uvm.91083
-rw-r--r--share/man/man9/uvm_fault.955
-rw-r--r--share/man/man9/uvm_init.9441
-rw-r--r--share/man/man9/uvm_km_alloc.9165
-rw-r--r--share/man/man9/uvm_map.9325
-rw-r--r--share/man/man9/uvm_pagealloc.9169
-rw-r--r--share/man/man9/uvn_attach.999
8 files changed, 1261 insertions, 1086 deletions
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index 74eca431bc6..deaaf6f43b8 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.297 2019/11/08 07:36:52 dlg Exp $
+# $OpenBSD: Makefile,v 1.298 2019/12/05 15:14:28 mpi Exp $
# $NetBSD: Makefile,v 1.4 1996/01/09 03:23:01 thorpej Exp $
# Makefile for section 9 (kernel function and variable) manual pages.
@@ -39,8 +39,12 @@ MAN= aml_evalnode.9 atomic_add_int.9 atomic_cas_uint.9 \
socreate.9 sosplice.9 strcmp.9 style.9 syscall.9 sysctl_int.9 \
task_add.9 tc_init.9 tfind.9 thread_fork.9 \
time_second.9 timeout.9 tsleep.9 tvtohz.9 \
- uiomove.9 uvm.9 usb_add_task.9 usbd_close_pipe.9 usbd_open_pipe.9 \
- usbd_ref_wait.9 usbd_transfer.9 vfs.9 vfs_busy.9 \
+ uiomove.9 \
+ usb_add_task.9 usbd_close_pipe.9 usbd_open_pipe.9 \
+ usbd_ref_wait.9 usbd_transfer.9 \
+ uvm_fault.9 uvm_init.9 uvm_km_alloc.9 uvm_map.9 uvm_pagealloc.9 \
+ uvn_attach.9 \
+ vfs.9 vfs_busy.9 \
vfs_cache.9 vaccess.9 vclean.9 vcount.9 vdevgone.9 vfinddev.9 vflush.9 \
vflushbuf.9 vget.9 vgone.9 vhold.9 vinvalbuf.9 vnode.9 vnsubr.9 \
VOP_LOOKUP.9 vput.9 vrecycle.9 vref.9 vrele.9 \
diff --git a/share/man/man9/uvm.9 b/share/man/man9/uvm.9
deleted file mode 100644
index 77a9c428e51..00000000000
--- a/share/man/man9/uvm.9
+++ /dev/null
@@ -1,1083 +0,0 @@
-.\" $OpenBSD: uvm.9,v 1.72 2019/12/05 12:46:54 mpi Exp $
-.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
-.\"
-.\" Copyright (c) 1998 Matthew R. Green
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" XXX this manual sets nS to 1 or 0 in the description, to obtain
-.\" synopsis-like function prototypes. any better way?
-.\"
-.Dd $Mdocdate: December 5 2019 $
-.Dt UVM_INIT 9
-.Os
-.Sh NAME
-.Nm uvm_init ,
-.Nm uvm_init_limits ,
-.Nm uvm_setpagesize ,
-.Nm uvm_swap_init ,
-.Nm uvm_map ,
-.Nm uvm_map_pageable ,
-.Nm uvm_map_pageable_all ,
-.Nm uvm_map_checkprot ,
-.Nm uvm_map_protect ,
-.Nm uvmspace_alloc ,
-.Nm uvmspace_exec ,
-.Nm uvmspace_fork ,
-.Nm uvmspace_free ,
-.Nm uvmspace_share ,
-.Nm uvm_uarea_alloc ,
-.Nm uvm_uarea_free ,
-.Nm UVM_MAPFLAG ,
-.Nm uvm_fault ,
-.Nm uvn_attach ,
-.Nm uvm_vnp_setsize ,
-.Nm uvm_vnp_sync ,
-.Nm uvm_vnp_terminate ,
-.Nm uvm_vnp_uncache ,
-.Nm uvm_io ,
-.Nm uvm_km_alloc ,
-.Nm uvm_km_zalloc ,
-.Nm uvm_km_alloc1 ,
-.Nm uvm_km_kmemalloc ,
-.Nm uvm_km_valloc ,
-.Nm uvm_km_valloc_wait ,
-.Nm uvm_km_suballoc ,
-.Nm uvm_km_free ,
-.Nm uvm_km_free_wakeup ,
-.Nm uvm_pagealloc ,
-.Nm uvm_pagerealloc ,
-.Nm uvm_pagefree ,
-.Nm uvm_pglistalloc ,
-.Nm uvm_pglistfree ,
-.Nm uvm_page_physload ,
-.Nm uvm_pageout ,
-.Nm uao_create ,
-.Nm uao_detach ,
-.Nm uao_reference ,
-.Nm uvm_chgkprot ,
-.Nm uvm_kernacc ,
-.Nm uvm_vslock ,
-.Nm uvm_vsunlock ,
-.Nm uvm_meter ,
-.Nm uvm_sysctl ,
-.Nm uvm_grow ,
-.Nm uvm_coredump
-.Nd virtual memory system external interface
-.Sh SYNOPSIS
-.In sys/param.h
-.In uvm/uvm.h
-.Sh DESCRIPTION
-The UVM virtual memory system manages access to the computer's memory
-resources.
-User processes and the kernel access these resources through
-UVM's external interface.
-UVM's external interface includes functions that:
-.Pp
-.Bl -hyphen -compact
-.It
-initialise UVM subsystems
-.It
-manage virtual address spaces
-.It
-resolve page faults
-.It
-memory map files and devices
-.It
-perform uio-based I/O to virtual memory
-.It
-allocate and free kernel virtual memory
-.It
-allocate and free physical memory
-.El
-.Pp
-In addition to exporting these services, UVM has two kernel-level processes:
-pagedaemon and swapper.
-The pagedaemon process sleeps until physical memory becomes scarce.
-When that happens, pagedaemon is awoken.
-It scans physical memory, paging out and freeing memory that has not been
-recently used.
-The swapper process swaps in runnable processes that are currently swapped out,
-if there is room.
-.Pp
-UVM has a machine independent and a machine dependent layer.
-See
-.Xr pmap 9
-for the machine dependent layer.
-.Sh INITIALISATION
-.nr nS 1
-.Ft void
-.Fn uvm_init "void"
-.Ft void
-.Fn uvm_init_limits "struct plimit *limit0"
-.Ft void
-.Fn uvm_setpagesize "void"
-.Ft void
-.Fn uvm_swap_init "void"
-.nr nS 0
-.Pp
-The
-.Fn uvm_init
-function sets up the UVM system at system boot time, after the
-copyright has been printed.
-It initialises global state, the page, map, kernel virtual memory state,
-machine-dependent physical map, kernel memory allocator,
-pager and anonymous memory subsystems, and then enables
-paging of kernel objects.
-.Fn uvm_init
-must be called after machine-dependent code has registered some free RAM
-with the
-.Fn uvm_page_physload
-function.
-.Pp
-The
-.Fn uvm_init_limits
-function initialises process limits in the given limit structure.
-This is for use by the system startup for process zero, before any other
-processes are created.
-.Pp
-The
-.Fn uvm_setpagesize
-function initialises the uvmexp members pagesize (if not already done by
-machine-dependent code), pageshift and pagemask.
-It should be called by machine-dependent code early in the
-.Xr pmap_init 9
-call.
-.Pp
-The
-.Fn uvm_swap_init
-function initialises the swap subsystem.
-.Sh VIRTUAL ADDRESS SPACE MANAGEMENT
-.nr nS 1
-.Ft int
-.Fn uvm_map "vm_map_t map" "vaddr_t *startp" "vsize_t size" "struct uvm_object *uobj" "voff_t uoffset" "vsize_t alignment" "unsigned int flags"
-.Ft int
-.Fn uvm_map_pageable "vm_map_t map" "vaddr_t start" "vaddr_t end" "boolean_t new_pageable" "int lockflags"
-.Ft int
-.Fn uvm_map_pageable_all "vm_map_t map" "int flags" "vsize_t limit"
-.Ft boolean_t
-.Fn uvm_map_checkprot "vm_map_t map" "vaddr_t start" "vaddr_t end" "vm_prot_t protection"
-.Ft int
-.Fn uvm_map_protect "vm_map_t map" "vaddr_t start" "vaddr_t end" "vm_prot_t new_prot" "boolean_t set_max"
-.Ft struct vmspace *
-.Fn uvmspace_alloc "vaddr_t min" "vaddr_t max" "boolean_t pageable" "boolean_t remove_holes"
-.Ft void
-.Fn uvmspace_exec "struct proc *p" "vaddr_t start" "vaddr_t end"
-.Ft struct vmspace *
-.Fn uvmspace_fork "struct process *pr"
-.Ft void
-.Fn uvmspace_free "struct vmspace *vm"
-.Ft struct vmspace *
-.Fn uvmspace_share "struct process *pr"
-.Ft vaddr_t
-.Fn uvm_uarea_alloc "void"
-.Ft void
-.Fn uvm_uarea_free "struct proc *p"
-.Ft unsigned int
-.Fn UVM_MAPFLAG "vm_prot_t prot" "vm_prot_t maxprot" "vm_inherit_t inh" "int advice" "int flags"
-.nr nS 0
-.Pp
-The
-.Fn uvm_map
-function establishes a valid mapping in map
-.Fa map ,
-which must be unlocked.
-The new mapping has size
-.Fa size ,
-which must be in
-.Dv PAGE_SIZE
-units.
-If
-.Fa alignment
-is non-zero, it describes the required alignment of the list, in
-power-of-two notation.
-The
-.Fa uobj
-and
-.Fa uoffset
-arguments can have four meanings.
-When
-.Fa uobj
-is
-.Dv NULL
-and
-.Fa uoffset
-is
-.Dv UVM_UNKNOWN_OFFSET ,
-.Fn uvm_map
-does not use the machine-dependent
-.Dv PMAP_PREFER
-function.
-If
-.Fa uoffset
-is any other value, it is used as the hint to
-.Dv PMAP_PREFER .
-When
-.Fa uobj
-is not
-.Dv NULL
-and
-.Fa uoffset
-is
-.Dv UVM_UNKNOWN_OFFSET ,
-.Fn uvm_map
-finds the offset based upon the virtual address, passed as
-.Fa startp .
-If
-.Fa uoffset
-is any other value, we are doing a normal mapping at this offset.
-The start address of the map will be returned in
-.Fa startp .
-.Pp
-.Fa flags
-passed to
-.Fn uvm_map
-are typically created using the
-.Fn UVM_MAPFLAG
-macro, which uses the following values.
-The
-.Fa prot
-and
-.Fa maxprot
-can take a mix of the following values:
-.Bd -literal
-#define PROT_MASK 0x07 /* protection mask */
-#define PROT_NONE 0x00 /* protection none */
-#define PROT_READ 0x01 /* read */
-#define PROT_WRITE 0x02 /* write */
-#define PROT_EXEC 0x04 /* exec */
-.Ed
-.Pp
-The values that
-.Fa inh
-can take are:
-.Bd -literal
-#define MAP_INHERIT_MASK 0x30 /* inherit mask */
-#define MAP_INHERIT_SHARE 0x00 /* "share" */
-#define MAP_INHERIT_COPY 0x10 /* "copy" */
-#define MAP_INHERIT_NONE 0x20 /* "none" */
-#define MAP_INHERIT_ZERO 0x30 /* "zero" */
-.Ed
-.Pp
-The values that
-.Fa advice
-can take are:
-.Bd -literal
-#define MADV_NORMAL 0x0 /* 'normal' */
-#define MADV_RANDOM 0x1 /* 'random' */
-#define MADV_SEQUENTIAL 0x2 /* 'sequential' */
-#define MADV_MASK 0x7 /* mask */
-.Ed
-.Pp
-The values that
-.Fa flags
-can take are:
-.Bd -literal
-#define UVM_FLAG_FIXED 0x0010000 /* find space */
-#define UVM_FLAG_OVERLAY 0x0020000 /* establish overlay */
-#define UVM_FLAG_NOMERGE 0x0040000 /* don't merge map entries */
-#define UVM_FLAG_COPYONW 0x0080000 /* set copy_on_write flag */
-#define UVM_FLAG_TRYLOCK 0x0100000 /* fail if we can not lock map */
-#define UVM_FLAG_HOLE 0x0200000 /* no backend */
-#define UVM_FLAG_QUERY 0x0400000 /* do everything,
- except actual execution */
-#define UVM_FLAG_NOFAULT 0x0800000 /* don't fault */
-#define UVM_FLAG_UNMAP 0x1000000 /* unmap to make space */
-#define UVM_FLAG_STACK 0x2000000 /* page may contain a stack */
-.Ed
-.Pp
-The
-.Dv UVM_MAPFLAG
-macro arguments can be combined with an or operator.
-There are also some additional macros to extract bits from the flags.
-The
-.Dv UVM_PROTECTION ,
-.Dv UVM_INHERIT ,
-.Dv UVM_MAXPROTECTION
-and
-.Dv UVM_ADVICE
-macros return the protection, inheritance, maximum protection and advice,
-respectively.
-.Fn uvm_map
-returns a standard errno.
-.Pp
-The
-.Fn uvm_map_pageable
-function changes the pageability of the pages in the range from
-.Fa start
-to
-.Fa end
-in map
-.Fa map
-to
-.Fa new_pageable .
-The
-.Fn uvm_map_pageable_all
-function changes the pageability of all mapped regions.
-If
-.Fa limit
-is non-zero and
-.Fn pmap_wired_count
-is implemented,
-.Dv ENOMEM
-is returned if the amount of wired pages exceed
-.Fa limit .
-The map is locked on entry if
-.Fa lockflags
-contain
-.Dv UVM_LK_ENTER ,
-and locked on exit if
-.Fa lockflags
-contain
-.Dv UVM_LK_EXIT .
-.Fn uvm_map_pageable
-and
-.Fn uvm_map_pageable_all
-return a standard errno.
-.Pp
-The
-.Fn uvm_map_checkprot
-function checks the protection of the range from
-.Fa start
-to
-.Fa end
-in map
-.Fa map
-against
-.Fa protection .
-This returns either
-.Dv TRUE
-or
-.Dv FALSE .
-.Pp
-The
-.Fn uvm_map_protect
-function changes the protection
-.Fa start
-to
-.Fa end
-in map
-.Fa map
-to
-.Fa new_prot ,
-also setting the maximum protection to the region to
-.Fa new_prot
-if
-.Fa set_max
-is non-zero.
-This function returns a standard errno.
-.Pp
-The
-.Fn uvmspace_alloc
-function allocates and returns a new address space, with ranges from
-.Fa min
-to
-.Fa max ,
-setting the pageability of the address space to
-.Fa pageable .
-If
-.Fa remove_holes
-is non-zero, hardware
-.Sq holes
-in the virtual address space will be removed from the newly allocated
-address space.
-.Pp
-The
-.Fn uvmspace_exec
-function either reuses the address space of process
-.Fa p
-if there are no other references to it, or creates
-a new one with
-.Fn uvmspace_alloc .
-The range of valid addresses in the address space is reset to
-.Fa start
-through
-.Fa end .
-.Pp
-The
-.Fn uvmspace_fork
-function creates and returns a new address space based upon the
-address space of process
-.Fa pr
-and is typically used when allocating an address space for a
-child process.
-.Pp
-The
-.Fn uvmspace_free
-function lowers the reference count on the address space
-.Fa vm ,
-freeing the data structures if there are no other references.
-.Pp
-The
-.Fn uvmspace_share
-function returns a reference to the address space of process
-.Fa pr ,
-increasing its reference count.
-.Pp
-The
-.Fn uvm_uarea_alloc
-function allocates a thread's
-.Sq uarea ,
-the memory where its kernel stack and PCB are stored.
-The
-.Fn uvm_uarea_free
-function frees the uarea for
-thread
-.Fa p ,
-which must no longer be running.
-.Sh PAGE FAULT HANDLING
-.nr nS 1
-.Ft int
-.Fn uvm_fault "vm_map_t orig_map" "vaddr_t vaddr" "vm_fault_t fault_type" "vm_prot_t access_type"
-.nr nS 0
-.Pp
-The
-.Fn uvm_fault
-function is the main entry point for faults.
-It takes
-.Fa orig_map
-as the map the fault originated in, a
-.Fa vaddr
-offset into the map the fault occurred,
-.Fa fault_type
-describing the type of fault, and
-.Fa access_type
-describing the type of access requested.
-.Fn uvm_fault
-returns a standard errno.
-.Sh MEMORY MAPPING FILES AND DEVICES
-.nr nS 1
-.Ft struct uvm_object *
-.Fn uvn_attach "struct vnode *vp" "vm_prot_t accessprot"
-.Ft void
-.Fn uvm_vnp_setsize "struct vnode *vp" "voff_t newsize"
-.Ft void
-.Fn uvm_vnp_sync "struct mount *mp"
-.Ft void
-.Fn uvm_vnp_terminate "struct vnode *vp"
-.Ft boolean_t
-.Fn uvm_vnp_uncache "struct vnode *vp"
-.nr nS 0
-.Pp
-The
-.Fn uvn_attach
-function attaches a UVM object to vnode
-.Fa vp ,
-creating the object if necessary.
-The object is returned.
-.Pp
-The
-.Fn uvm_vnp_setsize
-function sets the size of vnode
-.Fa vp
-to
-.Fa newsize .
-Caller must hold a reference to the vnode.
-If the vnode shrinks, pages no longer used are discarded.
-This function will be removed when the file system and VM buffer caches
-are merged.
-.Pp
-The
-.Fn uvm_vnp_sync
-function flushes dirty vnodes from either the mount point passed in
-.Fa mp ,
-or all dirty vnodes if
-.Fa mp
-is
-.Dv NULL .
-This function will be removed when the file system and VM buffer caches
-are merged.
-.Pp
-The
-.Fn uvm_vnp_terminate
-function frees all VM resources allocated to vnode
-.Fa vp .
-If the vnode still has references, it will not be destroyed; however
-all future operations using this vnode will fail.
-This function will be removed when the file system and VM buffer caches
-are merged.
-.Pp
-The
-.Fn uvm_vnp_uncache
-function disables vnode
-.Fa vp
-from persisting when all references are freed.
-This function will be removed when the file system and UVM caches
-are unified.
-Returns true if there is no active vnode.
-.Sh VIRTUAL MEMORY I/O
-.nr nS 1
-.Ft int
-.Fn uvm_io "vm_map_t map" "struct uio *uio"
-.nr nS 0
-.Pp
-The
-.Fn uvm_io
-function performs the I/O described in
-.Fa uio
-on the memory described in
-.Fa map .
-.Sh ALLOCATION OF KERNEL MEMORY
-.nr nS 1
-.Ft vaddr_t
-.Fn uvm_km_alloc "vm_map_t map" "vsize_t size"
-.Ft vaddr_t
-.Fn uvm_km_zalloc "vm_map_t map" "vsize_t size"
-.Ft vaddr_t
-.Fn uvm_km_alloc1 "vm_map_t map" "vsize_t size" "vsize_t align" "boolean_t zeroit"
-.Ft vaddr_t
-.Fn uvm_km_kmemalloc "vm_map_t map" "struct uvm_object *obj" "vsize_t size" "int flags"
-.Ft vaddr_t
-.Fn uvm_km_valloc "vm_map_t map" "vsize_t size"
-.Ft vaddr_t
-.Fn uvm_km_valloc_wait "vm_map_t map" "vsize_t size"
-.Ft struct vm_map *
-.Fn uvm_km_suballoc "vm_map_t map" "vaddr_t *min" "vaddr_t *max " "vsize_t size" "int flags" "boolean_t fixed" "vm_map_t submap"
-.Ft void
-.Fn uvm_km_free "vm_map_t map" "vaddr_t addr" "vsize_t size"
-.Ft void
-.Fn uvm_km_free_wakeup "vm_map_t map" "vaddr_t addr" "vsize_t size"
-.nr nS 0
-.Pp
-The
-.Fn uvm_km_alloc
-and
-.Fn uvm_km_zalloc
-functions allocate
-.Fa size
-bytes of wired kernel memory in map
-.Fa map .
-In addition to allocation,
-.Fn uvm_km_zalloc
-zeros the memory.
-Both of these functions are defined as macros in terms of
-.Fn uvm_km_alloc1 ,
-and should almost always be used in preference to
-.Fn uvm_km_alloc1 .
-.Pp
-The
-.Fn uvm_km_alloc1
-function allocates and returns
-.Fa size
-bytes of wired memory in the kernel map aligned to the
-.Fa align
-boundary, zeroing the memory if the
-.Fa zeroit
-argument is non-zero.
-.Pp
-The
-.Fn uvm_km_kmemalloc
-function allocates and returns
-.Fa size
-bytes of wired kernel memory into
-.Fa obj .
-The flags can be any of:
-.Bd -literal
-#define UVM_KMF_NOWAIT 0x1 /* matches M_NOWAIT */
-#define UVM_KMF_VALLOC 0x2 /* allocate VA only */
-#define UVM_KMF_TRYLOCK UVM_FLAG_TRYLOCK /* try locking only */
-.Ed
-.Pp
-The
-.Dv UVM_KMF_NOWAIT
-flag causes
-.Fn uvm_km_kmemalloc
-to return immediately if no memory is available.
-.Dv UVM_KMF_VALLOC
-causes no pages to be allocated, only a virtual address.
-.Dv UVM_KMF_TRYLOCK
-causes
-.Fn uvm_km_kmemalloc
-to only try and not sleep when locking maps.
-.Pp
-The
-.Fn uvm_km_valloc
-and
-.Fn uvm_km_valloc_wait
-functions return a newly allocated zero-filled address in the kernel map of size
-.Fa size .
-.Fn uvm_km_valloc_wait
-will also wait for kernel memory to become available, if there is a
-memory shortage.
-.Pp
-The
-.Fn uvm_km_suballoc
-function allocates submap (with the specified
-.Fa flags ,
-as described above) from
-.Fa map ,
-creating a new map if
-.Fa submap
-is
-.Dv NULL .
-The addresses of the submap can be specified exactly by setting the
-.Fa fixed
-argument to non-zero, which causes the
-.Fa min
-argument to specify the beginning of the address in the submap.
-If
-.Fa fixed
-is zero, any address of size
-.Fa size
-will be allocated from
-.Fa map
-and the start and end addresses returned in
-.Fa min
-and
-.Fa max .
-.Pp
-The
-.Fn uvm_km_free
-and
-.Fn uvm_km_free_wakeup
-functions free
-.Fa size
-bytes of memory in the kernel map, starting at address
-.Fa addr .
-.Fn uvm_km_free_wakeup
-calls
-.Fn wakeup
-on the map before unlocking the map.
-.Sh ALLOCATION OF PHYSICAL MEMORY
-.nr nS 1
-.Ft struct vm_page *
-.Fn uvm_pagealloc "struct uvm_object *uobj" "voff_t off" "struct vm_anon *anon" "int flags"
-.Ft void
-.Fn uvm_pagerealloc "struct vm_page *pg" "struct uvm_object *newobj" "voff_t newoff"
-.Ft void
-.Fn uvm_pagefree "struct vm_page *pg"
-.Ft int
-.Fn uvm_pglistalloc "psize_t size" "paddr_t low" "paddr_t high" "paddr_t alignment" "paddr_t boundary" "struct pglist *rlist" "int nsegs" "int flags"
-.Ft void
-.Fn uvm_pglistfree "struct pglist *list"
-.Ft void
-.Fn uvm_page_physload "paddr_t start" "paddr_t end" "paddr_t avail_start" "paddr_t avail_end" "int free_list"
-.nr nS 0
-.Pp
-The
-.Fn uvm_pagealloc
-function allocates a page of memory at virtual address
-.Fa off
-in either the object
-.Fa uobj
-or the anonymous memory
-.Fa anon ,
-or returns
-.Dv NULL
-if no pages are free.
-Only one of
-.Fa anon
-and
-.Fa uobj
-can be non
-.Dv NULL .
-The
-.Fa flags
-can be any of:
-.Bd -literal
-#define UVM_PGA_USERESERVE 0x0001 /* ok to use reserve pages */
-#define UVM_PGA_ZERO 0x0002 /* returned page must be zeroed */
-.Ed
-.Pp
-The
-.Dv UVM_PGA_USERESERVE
-flag means to allocate a page even if that will result in the number of
-free pages being lower than
-.Dv uvmexp.reserve_pagedaemon
-(if the current thread is the pagedaemon) or
-.Dv uvmexp.reserve_kernel
-(if the current thread is not the pagedaemon).
-The
-.Dv UVM_PGA_ZERO
-flag causes the returned page to be filled with zeroes, either by allocating it
-from a pool of pre-zeroed pages or by zeroing it in-line as necessary.
-.Pp
-The
-.Fn uvm_pagerealloc
-function reallocates page
-.Fa pg
-to a new object
-.Fa newobj ,
-at a new offset
-.Fa newoff .
-.Pp
-The
-.Fn uvm_pagefree
-function frees the physical page
-.Fa pg .
-.Pp
-The
-.Fn uvm_pglistalloc
-function allocates a list of pages for size
-.Fa size
-byte under various constraints.
-.Fa low
-and
-.Fa high
-describe the lowest and highest addresses acceptable for the list.
-If
-.Fa alignment
-is non-zero, it describes the required alignment of the list, in
-power-of-two notation.
-If
-.Fa boundary
-is non-zero, no segment of the list may cross this power-of-two
-boundary, relative to zero.
-.Fa nsegs
-is the maximum number of physically contiguous segments.
-The allocated memory is returned in the
-.Fa rlist
-list.
-The
-.Fa flags
-can be any of:
-.Bd -literal
-#define UVM_PLA_WAITOK 0x0001 /* may sleep */
-#define UVM_PLA_NOWAIT 0x0002 /* can't sleep */
-#define UVM_PLA_ZERO 0x0004 /* zero all pages before returning */
-.Ed
-.Pp
-The
-.Dv UVM_PLA_WAITOK
-flag means that the function may sleep while trying to allocate the list of
-pages (this is currently ignored).
-Conversely, the
-.Dv UVM_PLA_NOWAIT
-flag signifies that the function may not sleep while allocating.
-It is an error not to provide one of the above flags.
-Optionally, one may also specify the
-.Dv UVM_PLA_ZERO
-flag to receive zeroed memory in the page list.
-.Pp
-The
-.Fn uvm_pglistfree
-function frees the list of pages pointed to by
-.Fa list .
-.Pp
-The
-.Fn uvm_page_physload
-function loads physical memory segments into VM space on the specified
-.Fa free_list .
-.Fn uvm_page_physload
-must be called at system boot time to set up physical memory management pages.
-The arguments describe the
-.Fa start
-and
-.Fa end
-of the physical addresses of the segment, and the available start and end
-addresses of pages not already in use.
-.\" XXX expand on "system boot time"!
-.Sh PROCESSES
-.nr nS 1
-.Ft void
-.Fn uvm_pageout "void *arg"
-.nr nS 0
-.Pp
-The
-.Fn uvm_pageout
-function is the main loop for the page daemon.
-The
-.Fa arg
-argument is ignored.
-.Sh MISCELLANEOUS FUNCTIONS
-.nr nS 1
-.Ft struct uvm_object *
-.Fn uao_create "vsize_t size" "int flags"
-.Ft void
-.Fn uao_detach "struct uvm_object *uobj"
-.Ft void
-.Fn uao_reference "struct uvm_object *uobj"
-.Ft boolean_t
-.Fn uvm_chgkprot "caddr_t addr" "size_t len" "int rw"
-.Ft void
-.Fn uvm_kernacc "caddr_t addr" "size_t len" "int rw"
-.Ft void
-.Fn uvm_vslock "struct proc *p" "caddr_t addr" "size_t len" \
- "vm_prot_t access_type"
-.Ft void
-.Fn uvm_vsunlock "struct proc *p" "caddr_t addr" "size_t len"
-.Ft void
-.Fn uvm_meter
-.Ft int
-.Fn uvm_sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "void *newp " "size_t newlen" "struct proc *p"
-.Ft int
-.Fn uvm_grow "struct proc *p" "vaddr_t sp"
-.Ft int
-.Fn uvm_coredump "struct proc *p" "struct vnode *vp" "struct ucred *cred" "struct core *chdr"
-.nr nS 0
-.Pp
-The
-.Fn uao_create ,
-.Fn uao_detach
-and
-.Fn uao_reference
-functions operate on anonymous memory objects, such as those used to support
-System V shared memory.
-.Fn uao_create
-returns an object of size
-.Fa size
-with flags:
-.Bd -literal
-#define UAO_FLAG_KERNOBJ 0x1 /* create kernel object */
-#define UAO_FLAG_KERNSWAP 0x2 /* enable kernel swap */
-.Pp
-.Ed
-which can only be used once each at system boot time.
-.Fn uao_reference
-creates an additional reference to the named anonymous memory object.
-.Fn uao_detach
-removes a reference from the named anonymous memory object, destroying
-it if removing the last reference.
-.Pp
-The
-.Fn uvm_kernacc
-function checks the access at address
-.Fa addr
-to
-.Fa addr + len
-for
-.Fa rw
-access, in the kernel address space.
-.Pp
-The
-.Fn uvm_vslock
-and
-.Fn uvm_vsunlock
-functions control the wiring and unwiring of pages for process
-.Fa p
-from
-.Fa addr
-to
-.Fa addr + len .
-The
-.Fa access_type
-argument of
-.Fn uvm_vslock
-is passed to
-.Fn uvm_fault .
-These functions are normally used to wire memory for I/O.
-.Pp
-The
-.Fn uvm_meter
-function calculates the load average and wakes up the swapper if necessary.
-.Pp
-The
-.Fn uvm_sysctl
-function provides support for the
-.Dv CTL_VM
-domain of the
-.Xr sysctl 2
-hierarchy.
-.Fn uvm_sysctl
-handles the
-.Dv VM_LOADAVG ,
-.Dv VM_METER
-and
-.Dv VM_UVMEXP
-calls, which return the current load averages, calculates current VM
-totals, and returns the uvmexp structure respectively.
-The load averages are accessed from userland using the
-.Xr getloadavg 3
-function.
-The uvmexp structure has all global state of the UVM system, and has
-the following members:
-.Bd -literal
-/* vm_page constants */
-int pagesize; /* size of a page (PAGE_SIZE): must be power of 2 */
-int pagemask; /* page mask */
-int pageshift; /* page shift */
-
-/* vm_page counters */
-int npages; /* number of pages we manage */
-int free; /* number of free pages */
-int active; /* number of active pages */
-int inactive; /* number of pages that we free'd but may want back */
-int paging; /* number of pages in the process of being paged out */
-int wired; /* number of wired pages */
-
-int zeropages; /* number of zero'd pages */
-int reserve_pagedaemon; /* number of pages reserved for pagedaemon */
-int reserve_kernel; /* number of pages reserved for kernel */
-int unused01; /* formerly anonpages */
-int vnodepages; /* XXX # of pages used by vnode page cache */
-int vtextpages; /* XXX # of pages used by vtext vnodes */
-
-/* pageout params */
-int freemin; /* min number of free pages */
-int freetarg; /* target number of free pages */
-int inactarg; /* target number of inactive pages */
-int wiredmax; /* max number of wired pages */
-int anonmin; /* min threshold for anon pages */
-int vtextmin; /* min threshold for vtext pages */
-int vnodemin; /* min threshold for vnode pages */
-int anonminpct; /* min percent anon pages */
-int vtextminpct;/* min percent vtext pages */
-int vnodeminpct;/* min percent vnode pages */
-
-/* swap */
-int nswapdev; /* number of configured swap devices in system */
-int swpages; /* number of PAGE_SIZE'ed swap pages */
-int swpginuse; /* number of swap pages in use */
-int swpgonly; /* number of swap pages in use, not also in RAM */
-int nswget; /* number of times fault calls uvm_swap_get() */
-int nanon; /* XXX number total of anon's in system */
-int unused05; /* formerly nanonneeded */
-int unused06; /* formerly nfreeanon */
-
-/* stat counters */
-int faults; /* page fault count */
-int traps; /* trap count */
-int intrs; /* interrupt count */
-int swtch; /* context switch count */
-int softs; /* software interrupt count */
-int syscalls; /* system calls */
-int pageins; /* pagein operation count */
- /* pageouts are in pdpageouts below */
-int unused07; /* formerly obsolete_swapins */
-int unused08; /* formerly obsolete_swapouts */
-int pgswapin; /* pages swapped in */
-int pgswapout; /* pages swapped out */
-int forks; /* forks */
-int forks_ppwait; /* forks where parent waits */
-int forks_sharevm; /* forks where vmspace is shared */
-int pga_zerohit; /* pagealloc where zero wanted and zero
- was available */
-int pga_zeromiss; /* pagealloc where zero wanted and zero
- not available */
-int unused09; /* formerly zeroaborts */
-
-/* fault subcounters */
-int fltnoram; /* number of times fault was out of ram */
-int fltnoanon; /* number of times fault was out of anons */
-int fltnoamap; /* number of times fault was out of amap chunks */
-int fltpgwait; /* number of times fault had to wait on a page */
-int fltpgrele; /* number of times fault found a released page */
-int fltrelck; /* number of times fault relock called */
-int fltrelckok; /* number of times fault relock is a success */
-int fltanget; /* number of times fault gets anon page */
-int fltanretry; /* number of times fault retrys an anon get */
-int fltamcopy; /* number of times fault clears "needs copy" */
-int fltnamap; /* number of times fault maps a neighbor anon page */
-int fltnomap; /* number of times fault maps a neighbor obj page */
-int fltlget; /* number of times fault does a locked pgo_get */
-int fltget; /* number of times fault does an unlocked get */
-int flt_anon; /* number of times fault anon (case 1a) */
-int flt_acow; /* number of times fault anon cow (case 1b) */
-int flt_obj; /* number of times fault is on object page (2a) */
-int flt_prcopy; /* number of times fault promotes with copy (2b) */
-int flt_przero; /* number of times fault promotes with zerofill (2b) */
-
-/* daemon counters */
-int pdwoke; /* number of times daemon woke up */
-int pdrevs; /* number of times daemon rev'd clock hand */
-int pdswout; /* number of times daemon called for swapout */
-int pdfreed; /* number of pages daemon freed since boot */
-int pdscans; /* number of pages daemon scanned since boot */
-int pdanscan; /* number of anonymous pages scanned by daemon */
-int pdobscan; /* number of object pages scanned by daemon */
-int pdreact; /* number of pages daemon reactivated since boot */
-int pdbusy; /* number of times daemon found a busy page */
-int pdpageouts; /* number of times daemon started a pageout */
-int pdpending; /* number of times daemon got a pending pagout */
-int pddeact; /* number of pages daemon deactivates */
-int unused11; /* formerly pdreanon */
-int unused12; /* formerly pdrevnode */
-int unused13; /* formerly pdrevtext */
-
-int fpswtch; /* FPU context switches */
-int kmapent; /* number of kernel map entries */
-.Ed
-.Pp
-The
-.Fn uvm_grow
-function increases the stack segment of process
-.Fa p
-to include
-.Fa sp .
-.Pp
-The
-.Fn uvm_coredump
-function generates a coredump on vnode
-.Fa vp
-for process
-.Fa p
-with credentials
-.Fa cred
-and core header description in
-.Fa chdr .
-.Sh NOTES
-The structure and types whose names begin with
-.Dq vm_
-were named so UVM could coexist with BSD VM during the early
-development stages.
-.Sh SEE ALSO
-.Xr sysctl 2 ,
-.Xr getloadavg 3 ,
-.Xr kvm 3 ,
-.Xr ddb 4 ,
-.Xr options 4 ,
-.Xr pmap 9
-.Rs
-.%A Charles D. Cranor
-.%D August 1998
-.%C St. Louis, Missouri
-.%Q Department of Computer Science, Sever Institute of Technology, Washington University
-.%T Design and Implementation of the UVM Virtual Memory System, D.Sc. dissertation
-.Re
-.Sh HISTORY
-The UVM virtual memory system was developed at Washington University in St. Louis.
-UVM's roots lie partly in the Mach-based
-.Bx 4.4
-VM system, the
-.Fx
-VM system, and the SunOS4 VM system.
-UVM's basic structure is based on the
-.Bx 4.4
-VM system.
-UVM's new anonymous memory system is based on the
-anonymous memory system found in the SunOS4 VM (as described in papers
-published by Sun Microsystems, Inc.).
-UVM also includes a number of features
-new to
-.Bx
-including page loanout, map entry passing, simplified
-copy-on-write, and clustered anonymous memory pageout.
-.Pp
-UVM appeared in
-.Ox 2.9 .
-.Sh AUTHORS
-.An -nosplit
-.An Charles D. Cranor Aq Mt chuck@ccrc.wustl.edu
-designed and implemented UVM.
-.Pp
-.An Matthew Green Aq Mt mrg@eterna.com.au
-wrote the swap-space management code.
-.Pp
-.An Chuck Silvers Aq Mt chuq@chuq.com
-implemented the aobj pager, thus allowing
-UVM to support System V shared memory and process swapping.
-.Pp
-.An Artur Grabowski Aq Mt art@openbsd.org
-handled the logistical issues involved with merging UVM into the
-.Ox
-source tree.
diff --git a/share/man/man9/uvm_fault.9 b/share/man/man9/uvm_fault.9
new file mode 100644
index 00000000000..adb4bff6df9
--- /dev/null
+++ b/share/man/man9/uvm_fault.9
@@ -0,0 +1,55 @@
+.\" $OpenBSD: uvm_fault.9,v 1.1 2019/12/05 15:14:28 mpi Exp $
+.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
+.\"
+.\" Copyright (c) 1998 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd $Mdocdate: December 5 2019 $
+.Dt UVM_FAULT 9
+.Os
+.Sh NAME
+.Nm uvm_fault
+.Nd page fault handling
+.Sh SYNOPSIS
+.In sys/param.h
+.In uvm/uvm.h
+.Ft int
+.Fn uvm_fault "vm_map_t orig_map" "vaddr_t vaddr" "vm_fault_t fault_type" "vm_prot_t access_type"
+.Sh DESCRIPTION
+The
+.Fn uvm_fault
+function is the main entry point for faults.
+It takes
+.Fa orig_map
+as the map the fault originated in, a
+.Fa vaddr
+offset into the map the fault occurred,
+.Fa fault_type
+describing the type of fault, and
+.Fa access_type
+describing the type of access requested.
+.Fn uvm_fault
+returns a standard errno.
+.Sh SEE ALSO
+.Xr pmap 9
diff --git a/share/man/man9/uvm_init.9 b/share/man/man9/uvm_init.9
new file mode 100644
index 00000000000..228025b1add
--- /dev/null
+++ b/share/man/man9/uvm_init.9
@@ -0,0 +1,441 @@
+.\" $OpenBSD: uvm_init.9,v 1.1 2019/12/05 15:14:28 mpi Exp $
+.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
+.\"
+.\" Copyright (c) 1998 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" XXX this manual sets nS to 1 or 0 in the description, to obtain
+.\" synopsis-like function prototypes. any better way?
+.\"
+.Dd $Mdocdate: December 5 2019 $
+.Dt UVM_INIT 9
+.Os
+.Sh NAME
+.Nm uvm_init ,
+.Nm uvm_init_limits ,
+.Nm uvm_setpagesize ,
+.Nm uvm_swap_init ,
+.Nm uvm_io ,
+.Nm uvm_pageout ,
+.Nm uao_create ,
+.Nm uao_detach ,
+.Nm uao_reference ,
+.Nm uvm_chgkprot ,
+.Nm uvm_kernacc ,
+.Nm uvm_vslock ,
+.Nm uvm_vsunlock ,
+.Nm uvm_meter ,
+.Nm uvm_sysctl ,
+.Nm uvm_grow ,
+.Nm uvm_coredump
+.Nd virtual memory system external interface
+.Sh SYNOPSIS
+.In sys/param.h
+.In uvm/uvm.h
+.Sh DESCRIPTION
+The UVM virtual memory system manages access to the computer's memory
+resources.
+User processes and the kernel access these resources through
+UVM's external interface.
+UVM's external interface includes functions that:
+.Pp
+.Bl -hyphen -compact
+.It
+initialise UVM subsystems
+.It
+manage virtual address spaces
+.It
+resolve page faults
+.It
+memory map files and devices
+.It
+perform uio-based I/O to virtual memory
+.It
+allocate and free kernel virtual memory
+.It
+allocate and free physical memory
+.El
+.Pp
+In addition to exporting these services, UVM has two kernel-level processes:
+pagedaemon and swapper.
+The pagedaemon process sleeps until physical memory becomes scarce.
+When that happens, pagedaemon is awoken.
+It scans physical memory, paging out and freeing memory that has not been
+recently used.
+The swapper process swaps in runnable processes that are currently swapped out,
+if there is room.
+.Pp
+UVM has a machine independent and a machine dependent layer.
+See
+.Xr pmap 9
+for the machine dependent layer.
+.Sh INITIALISATION
+.nr nS 1
+.Ft void
+.Fn uvm_init "void"
+.Ft void
+.Fn uvm_init_limits "struct plimit *limit0"
+.Ft void
+.Fn uvm_setpagesize "void"
+.Ft void
+.Fn uvm_swap_init "void"
+.nr nS 0
+.Pp
+The
+.Fn uvm_init
+function sets up the UVM system at system boot time, after the
+copyright has been printed.
+It initialises global state, the page, map, kernel virtual memory state,
+machine-dependent physical map, kernel memory allocator,
+pager and anonymous memory subsystems, and then enables
+paging of kernel objects.
+.Fn uvm_init
+must be called after machine-dependent code has registered some free RAM
+with the
+.Fn uvm_page_physload
+function.
+.Pp
+The
+.Fn uvm_init_limits
+function initialises process limits in the given limit structure.
+This is for use by the system startup for process zero, before any other
+processes are created.
+.Pp
+The
+.Fn uvm_setpagesize
+function initialises the uvmexp members pagesize (if not already done by
+machine-dependent code), pageshift and pagemask.
+It should be called by machine-dependent code early in the
+.Xr pmap_init 9
+call.
+.Pp
+The
+.Fn uvm_swap_init
+function initialises the swap subsystem.
+.Sh VIRTUAL MEMORY I/O
+.nr nS 1
+.Ft int
+.Fn uvm_io "vm_map_t map" "struct uio *uio"
+.nr nS 0
+.Pp
+The
+.Fn uvm_io
+function performs the I/O described in
+.Fa uio
+on the memory described in
+.Fa map .
+.Sh PROCESSES
+.nr nS 1
+.Ft void
+.Fn uvm_pageout "void *arg"
+.nr nS 0
+.Pp
+The
+.Fn uvm_pageout
+function is the main loop for the page daemon.
+The
+.Fa arg
+argument is ignored.
+.Sh MISCELLANEOUS FUNCTIONS
+.nr nS 1
+.Ft struct uvm_object *
+.Fn uao_create "vsize_t size" "int flags"
+.Ft void
+.Fn uao_detach "struct uvm_object *uobj"
+.Ft void
+.Fn uao_reference "struct uvm_object *uobj"
+.Ft boolean_t
+.Fn uvm_chgkprot "caddr_t addr" "size_t len" "int rw"
+.Ft void
+.Fn uvm_kernacc "caddr_t addr" "size_t len" "int rw"
+.Ft void
+.Fn uvm_vslock "struct proc *p" "caddr_t addr" "size_t len" \
+ "vm_prot_t access_type"
+.Ft void
+.Fn uvm_vsunlock "struct proc *p" "caddr_t addr" "size_t len"
+.Ft void
+.Fn uvm_meter
+.Ft int
+.Fn uvm_sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "void *newp " "size_t newlen" "struct proc *p"
+.Ft int
+.Fn uvm_grow "struct proc *p" "vaddr_t sp"
+.Ft int
+.Fn uvm_coredump "struct proc *p" "struct vnode *vp" "struct ucred *cred" "struct core *chdr"
+.nr nS 0
+.Pp
+The
+.Fn uao_create ,
+.Fn uao_detach
+and
+.Fn uao_reference
+functions operate on anonymous memory objects, such as those used to support
+System V shared memory.
+.Fn uao_create
+returns an object of size
+.Fa size
+with flags:
+.Bd -literal
+#define UAO_FLAG_KERNOBJ 0x1 /* create kernel object */
+#define UAO_FLAG_KERNSWAP 0x2 /* enable kernel swap */
+.Pp
+.Ed
+which can only be used once each at system boot time.
+.Fn uao_reference
+creates an additional reference to the named anonymous memory object.
+.Fn uao_detach
+removes a reference from the named anonymous memory object, destroying
+it if removing the last reference.
+.Pp
+The
+.Fn uvm_kernacc
+function checks the access at address
+.Fa addr
+to
+.Fa addr + len
+for
+.Fa rw
+access, in the kernel address space.
+.Pp
+The
+.Fn uvm_vslock
+and
+.Fn uvm_vsunlock
+functions control the wiring and unwiring of pages for process
+.Fa p
+from
+.Fa addr
+to
+.Fa addr + len .
+The
+.Fa access_type
+argument of
+.Fn uvm_vslock
+is passed to
+.Fn uvm_fault .
+These functions are normally used to wire memory for I/O.
+.Pp
+The
+.Fn uvm_meter
+function calculates the load average and wakes up the swapper if necessary.
+.Pp
+The
+.Fn uvm_sysctl
+function provides support for the
+.Dv CTL_VM
+domain of the
+.Xr sysctl 2
+hierarchy.
+.Fn uvm_sysctl
+handles the
+.Dv VM_LOADAVG ,
+.Dv VM_METER
+and
+.Dv VM_UVMEXP
+calls, which return the current load averages, calculates current VM
+totals, and returns the uvmexp structure respectively.
+The load averages are accessed from userland using the
+.Xr getloadavg 3
+function.
+The uvmexp structure has all global state of the UVM system, and has
+the following members:
+.Bd -literal
+/* vm_page constants */
+int pagesize; /* size of a page (PAGE_SIZE): must be power of 2 */
+int pagemask; /* page mask */
+int pageshift; /* page shift */
+
+/* vm_page counters */
+int npages; /* number of pages we manage */
+int free; /* number of free pages */
+int active; /* number of active pages */
+int inactive; /* number of pages that we free'd but may want back */
+int paging; /* number of pages in the process of being paged out */
+int wired; /* number of wired pages */
+
+int zeropages; /* number of zero'd pages */
+int reserve_pagedaemon; /* number of pages reserved for pagedaemon */
+int reserve_kernel; /* number of pages reserved for kernel */
+int unused01; /* formerly anonpages */
+int vnodepages; /* XXX # of pages used by vnode page cache */
+int vtextpages; /* XXX # of pages used by vtext vnodes */
+
+/* pageout params */
+int freemin; /* min number of free pages */
+int freetarg; /* target number of free pages */
+int inactarg; /* target number of inactive pages */
+int wiredmax; /* max number of wired pages */
+int anonmin; /* min threshold for anon pages */
+int vtextmin; /* min threshold for vtext pages */
+int vnodemin; /* min threshold for vnode pages */
+int anonminpct; /* min percent anon pages */
+int vtextminpct;/* min percent vtext pages */
+int vnodeminpct;/* min percent vnode pages */
+
+/* swap */
+int nswapdev; /* number of configured swap devices in system */
+int swpages; /* number of PAGE_SIZE'ed swap pages */
+int swpginuse; /* number of swap pages in use */
+int swpgonly; /* number of swap pages in use, not also in RAM */
+int nswget; /* number of times fault calls uvm_swap_get() */
+int nanon; /* XXX number total of anon's in system */
+int unused05; /* formerly nanonneeded */
+int unused06; /* formerly nfreeanon */
+
+/* stat counters */
+int faults; /* page fault count */
+int traps; /* trap count */
+int intrs; /* interrupt count */
+int swtch; /* context switch count */
+int softs; /* software interrupt count */
+int syscalls; /* system calls */
+int pageins; /* pagein operation count */
+ /* pageouts are in pdpageouts below */
+int unused07; /* formerly obsolete_swapins */
+int unused08; /* formerly obsolete_swapouts */
+int pgswapin; /* pages swapped in */
+int pgswapout; /* pages swapped out */
+int forks; /* forks */
+int forks_ppwait; /* forks where parent waits */
+int forks_sharevm; /* forks where vmspace is shared */
+int pga_zerohit; /* pagealloc where zero wanted and zero
+ was available */
+int pga_zeromiss; /* pagealloc where zero wanted and zero
+ not available */
+int unused09; /* formerly zeroaborts */
+
+/* fault subcounters */
+int fltnoram; /* number of times fault was out of ram */
+int fltnoanon; /* number of times fault was out of anons */
+int fltnoamap; /* number of times fault was out of amap chunks */
+int fltpgwait; /* number of times fault had to wait on a page */
+int fltpgrele; /* number of times fault found a released page */
+int fltrelck; /* number of times fault relock called */
+int fltrelckok; /* number of times fault relock is a success */
+int fltanget; /* number of times fault gets anon page */
+int fltanretry; /* number of times fault retrys an anon get */
+int fltamcopy; /* number of times fault clears "needs copy" */
+int fltnamap; /* number of times fault maps a neighbor anon page */
+int fltnomap; /* number of times fault maps a neighbor obj page */
+int fltlget; /* number of times fault does a locked pgo_get */
+int fltget; /* number of times fault does an unlocked get */
+int flt_anon; /* number of times fault anon (case 1a) */
+int flt_acow; /* number of times fault anon cow (case 1b) */
+int flt_obj; /* number of times fault is on object page (2a) */
+int flt_prcopy; /* number of times fault promotes with copy (2b) */
+int flt_przero; /* number of times fault promotes with zerofill (2b) */
+
+/* daemon counters */
+int pdwoke; /* number of times daemon woke up */
+int pdrevs; /* number of times daemon rev'd clock hand */
+int pdswout; /* number of times daemon called for swapout */
+int pdfreed; /* number of pages daemon freed since boot */
+int pdscans; /* number of pages daemon scanned since boot */
+int pdanscan; /* number of anonymous pages scanned by daemon */
+int pdobscan; /* number of object pages scanned by daemon */
+int pdreact; /* number of pages daemon reactivated since boot */
+int pdbusy; /* number of times daemon found a busy page */
+int pdpageouts; /* number of times daemon started a pageout */
+int pdpending; /* number of times daemon got a pending pagout */
+int pddeact; /* number of pages daemon deactivates */
+int unused11; /* formerly pdreanon */
+int unused12; /* formerly pdrevnode */
+int unused13; /* formerly pdrevtext */
+
+int fpswtch; /* FPU context switches */
+int kmapent; /* number of kernel map entries */
+.Ed
+.Pp
+The
+.Fn uvm_grow
+function increases the stack segment of process
+.Fa p
+to include
+.Fa sp .
+.Pp
+The
+.Fn uvm_coredump
+function generates a coredump on vnode
+.Fa vp
+for process
+.Fa p
+with credentials
+.Fa cred
+and core header description in
+.Fa chdr .
+.Sh NOTES
+The structure and types whose names begin with
+.Dq vm_
+were named so UVM could coexist with BSD VM during the early
+development stages.
+.Sh SEE ALSO
+.Xr sysctl 2 ,
+.Xr getloadavg 3 ,
+.Xr kvm 3 ,
+.Xr ddb 4 ,
+.Xr options 4 ,
+.Xr pmap 9
+.Rs
+.%A Charles D. Cranor
+.%D August 1998
+.%C St. Louis, Missouri
+.%Q Department of Computer Science, Sever Institute of Technology, Washington University
+.%T Design and Implementation of the UVM Virtual Memory System, D.Sc. dissertation
+.Re
+.Sh HISTORY
+The UVM virtual memory system was developed at Washington University in St. Louis.
+UVM's roots lie partly in the Mach-based
+.Bx 4.4
+VM system, the
+.Fx
+VM system, and the SunOS4 VM system.
+UVM's basic structure is based on the
+.Bx 4.4
+VM system.
+UVM's new anonymous memory system is based on the
+anonymous memory system found in the SunOS4 VM (as described in papers
+published by Sun Microsystems, Inc.).
+UVM also includes a number of features
+new to
+.Bx
+including page loanout, map entry passing, simplified
+copy-on-write, and clustered anonymous memory pageout.
+.Pp
+UVM appeared in
+.Ox 2.9 .
+.Sh AUTHORS
+.An -nosplit
+.An Charles D. Cranor Aq Mt chuck@ccrc.wustl.edu
+designed and implemented UVM.
+.Pp
+.An Matthew Green Aq Mt mrg@eterna.com.au
+wrote the swap-space management code.
+.Pp
+.An Chuck Silvers Aq Mt chuq@chuq.com
+implemented the aobj pager, thus allowing
+UVM to support System V shared memory and process swapping.
+.Pp
+.An Artur Grabowski Aq Mt art@openbsd.org
+handled the logistical issues involved with merging UVM into the
+.Ox
+source tree.
diff --git a/share/man/man9/uvm_km_alloc.9 b/share/man/man9/uvm_km_alloc.9
new file mode 100644
index 00000000000..146d0a8a6f9
--- /dev/null
+++ b/share/man/man9/uvm_km_alloc.9
@@ -0,0 +1,165 @@
+.\" $OpenBSD: uvm_km_alloc.9,v 1.1 2019/12/05 15:14:28 mpi Exp $
+.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
+.\"
+.\" Copyright (c) 1998 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd $Mdocdate: December 5 2019 $
+.Dt UVM_KM_ALLOC 9
+.Os
+.Sh NAME
+.Nm uvm_km_alloc ,
+.Nm uvm_km_zalloc ,
+.Nm uvm_km_alloc1 ,
+.Nm uvm_km_kmemalloc ,
+.Nm uvm_km_valloc ,
+.Nm uvm_km_valloc_wait ,
+.Nm uvm_km_suballoc ,
+.Nm uvm_km_free ,
+.Nm uvm_km_free_wakeup
+.Nd raw kernel memory or address space allocator
+.Sh SYNOPSIS
+.In sys/param.h
+.In uvm/uvm.h
+.Ft vaddr_t
+.Fn uvm_km_alloc "vm_map_t map" "vsize_t size"
+.Ft vaddr_t
+.Fn uvm_km_zalloc "vm_map_t map" "vsize_t size"
+.Ft vaddr_t
+.Fn uvm_km_alloc1 "vm_map_t map" "vsize_t size" "vsize_t align" "boolean_t zeroit"
+.Ft vaddr_t
+.Fn uvm_km_kmemalloc "vm_map_t map" "struct uvm_object *obj" "vsize_t size" "int flags"
+.Ft vaddr_t
+.Fn uvm_km_valloc "vm_map_t map" "vsize_t size"
+.Ft vaddr_t
+.Fn uvm_km_valloc_wait "vm_map_t map" "vsize_t size"
+.Ft struct vm_map *
+.Fn uvm_km_suballoc "vm_map_t map" "vaddr_t *min" "vaddr_t *max " "vsize_t size" "int flags" "boolean_t fixed" "vm_map_t submap"
+.Ft void
+.Fn uvm_km_free "vm_map_t map" "vaddr_t addr" "vsize_t size"
+.Ft void
+.Fn uvm_km_free_wakeup "vm_map_t map" "vaddr_t addr" "vsize_t size"
+.Sh DESCRIPTION
+.Pp
+The
+.Fn uvm_km_alloc
+and
+.Fn uvm_km_zalloc
+functions allocate
+.Fa size
+bytes of wired kernel memory in map
+.Fa map .
+In addition to allocation,
+.Fn uvm_km_zalloc
+zeros the memory.
+Both of these functions are defined as macros in terms of
+.Fn uvm_km_alloc1 ,
+and should almost always be used in preference to
+.Fn uvm_km_alloc1 .
+.Pp
+The
+.Fn uvm_km_alloc1
+function allocates and returns
+.Fa size
+bytes of wired memory in the kernel map aligned to the
+.Fa align
+boundary, zeroing the memory if the
+.Fa zeroit
+argument is non-zero.
+.Pp
+The
+.Fn uvm_km_kmemalloc
+function allocates and returns
+.Fa size
+bytes of wired kernel memory into
+.Fa obj .
+The flags can be any of:
+.Bd -literal
+#define UVM_KMF_NOWAIT 0x1 /* matches M_NOWAIT */
+#define UVM_KMF_VALLOC 0x2 /* allocate VA only */
+#define UVM_KMF_TRYLOCK UVM_FLAG_TRYLOCK /* try locking only */
+.Ed
+.Pp
+The
+.Dv UVM_KMF_NOWAIT
+flag causes
+.Fn uvm_km_kmemalloc
+to return immediately if no memory is available.
+.Dv UVM_KMF_VALLOC
+causes no pages to be allocated, only a virtual address.
+.Dv UVM_KMF_TRYLOCK
+causes
+.Fn uvm_km_kmemalloc
+to only try and not sleep when locking maps.
+.Pp
+The
+.Fn uvm_km_valloc
+and
+.Fn uvm_km_valloc_wait
+functions return a newly allocated zero-filled address in the kernel map of size
+.Fa size .
+.Fn uvm_km_valloc_wait
+will also wait for kernel memory to become available, if there is a
+memory shortage.
+.Pp
+The
+.Fn uvm_km_suballoc
+function allocates submap (with the specified
+.Fa flags ,
+as described above) from
+.Fa map ,
+creating a new map if
+.Fa submap
+is
+.Dv NULL .
+The addresses of the submap can be specified exactly by setting the
+.Fa fixed
+argument to non-zero, which causes the
+.Fa min
+argument to specify the beginning of the address in the submap.
+If
+.Fa fixed
+is zero, any address of size
+.Fa size
+will be allocated from
+.Fa map
+and the start and end addresses returned in
+.Fa min
+and
+.Fa max .
+.Pp
+The
+.Fn uvm_km_free
+and
+.Fn uvm_km_free_wakeup
+functions free
+.Fa size
+bytes of memory in the kernel map, starting at address
+.Fa addr .
+.Fn uvm_km_free_wakeup
+calls
+.Fn wakeup
+on the map before unlocking the map.
+.Sh SEE ALSO
+.Xr km_alloc 9
diff --git a/share/man/man9/uvm_map.9 b/share/man/man9/uvm_map.9
new file mode 100644
index 00000000000..d9f8c8500bc
--- /dev/null
+++ b/share/man/man9/uvm_map.9
@@ -0,0 +1,325 @@
+.\" $OpenBSD: uvm_map.9,v 1.1 2019/12/05 15:14:28 mpi Exp $
+.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
+.\"
+.\" Copyright (c) 1998 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd $Mdocdate: December 5 2019 $
+.Dt UVM_MAP 9
+.Os
+.Sh NAME
+.Nm uvm_map ,
+.Nm uvm_map_pageable ,
+.Nm uvm_map_pageable_all ,
+.Nm uvm_map_checkprot ,
+.Nm uvm_map_protect ,
+.Nm uvmspace_alloc ,
+.Nm uvmspace_exec ,
+.Nm uvmspace_fork ,
+.Nm uvmspace_free ,
+.Nm uvmspace_share ,
+.Nm uvm_uarea_alloc ,
+.Nm uvm_uarea_free ,
+.Nm UVM_MAPFLAG
+.Nd virtual address space management interface
+.Sh SYNOPSIS
+.In sys/param.h
+.In uvm/uvm.h
+.Ft int
+.Fn uvm_map "vm_map_t map" "vaddr_t *startp" "vsize_t size" "struct uvm_object *uobj" "voff_t uoffset" "vsize_t alignment" "unsigned int flags"
+.Ft int
+.Fn uvm_map_pageable "vm_map_t map" "vaddr_t start" "vaddr_t end" "boolean_t new_pageable" "int lockflags"
+.Ft int
+.Fn uvm_map_pageable_all "vm_map_t map" "int flags" "vsize_t limit"
+.Ft boolean_t
+.Fn uvm_map_checkprot "vm_map_t map" "vaddr_t start" "vaddr_t end" "vm_prot_t protection"
+.Ft int
+.Fn uvm_map_protect "vm_map_t map" "vaddr_t start" "vaddr_t end" "vm_prot_t new_prot" "boolean_t set_max"
+.Ft struct vmspace *
+.Fn uvmspace_alloc "vaddr_t min" "vaddr_t max" "boolean_t pageable" "boolean_t remove_holes"
+.Ft void
+.Fn uvmspace_exec "struct proc *p" "vaddr_t start" "vaddr_t end"
+.Ft struct vmspace *
+.Fn uvmspace_fork "struct process *pr"
+.Ft void
+.Fn uvmspace_free "struct vmspace *vm"
+.Ft struct vmspace *
+.Fn uvmspace_share "struct process *pr"
+.Ft vaddr_t
+.Fn uvm_uarea_alloc "void"
+.Ft void
+.Fn uvm_uarea_free "struct proc *p"
+.Ft unsigned int
+.Fn UVM_MAPFLAG "vm_prot_t prot" "vm_prot_t maxprot" "vm_inherit_t inh" "int advice" "int flags"
+.Sh DESCRIPTION
+The
+.Fn uvm_map
+function establishes a valid mapping in map
+.Fa map ,
+which must be unlocked.
+The new mapping has size
+.Fa size ,
+which must be in
+.Dv PAGE_SIZE
+units.
+If
+.Fa alignment
+is non-zero, it describes the required alignment of the list, in
+power-of-two notation.
+The
+.Fa uobj
+and
+.Fa uoffset
+arguments can have four meanings.
+When
+.Fa uobj
+is
+.Dv NULL
+and
+.Fa uoffset
+is
+.Dv UVM_UNKNOWN_OFFSET ,
+.Fn uvm_map
+does not use the machine-dependent
+.Dv PMAP_PREFER
+function.
+If
+.Fa uoffset
+is any other value, it is used as the hint to
+.Dv PMAP_PREFER .
+When
+.Fa uobj
+is not
+.Dv NULL
+and
+.Fa uoffset
+is
+.Dv UVM_UNKNOWN_OFFSET ,
+.Fn uvm_map
+finds the offset based upon the virtual address, passed as
+.Fa startp .
+If
+.Fa uoffset
+is any other value, we are doing a normal mapping at this offset.
+The start address of the map will be returned in
+.Fa startp .
+.Pp
+.Fa flags
+passed to
+.Fn uvm_map
+are typically created using the
+.Fn UVM_MAPFLAG
+macro, which uses the following values.
+The
+.Fa prot
+and
+.Fa maxprot
+can take a mix of the following values:
+.Bd -literal
+#define PROT_MASK 0x07 /* protection mask */
+#define PROT_NONE 0x00 /* protection none */
+#define PROT_READ 0x01 /* read */
+#define PROT_WRITE 0x02 /* write */
+#define PROT_EXEC 0x04 /* exec */
+.Ed
+.Pp
+The values that
+.Fa inh
+can take are:
+.Bd -literal
+#define MAP_INHERIT_MASK 0x30 /* inherit mask */
+#define MAP_INHERIT_SHARE 0x00 /* "share" */
+#define MAP_INHERIT_COPY 0x10 /* "copy" */
+#define MAP_INHERIT_NONE 0x20 /* "none" */
+#define MAP_INHERIT_ZERO 0x30 /* "zero" */
+.Ed
+.Pp
+The values that
+.Fa advice
+can take are:
+.Bd -literal
+#define MADV_NORMAL 0x0 /* 'normal' */
+#define MADV_RANDOM 0x1 /* 'random' */
+#define MADV_SEQUENTIAL 0x2 /* 'sequential' */
+#define MADV_MASK 0x7 /* mask */
+.Ed
+.Pp
+The values that
+.Fa flags
+can take are:
+.Bd -literal
+#define UVM_FLAG_FIXED 0x0010000 /* find space */
+#define UVM_FLAG_OVERLAY 0x0020000 /* establish overlay */
+#define UVM_FLAG_NOMERGE 0x0040000 /* don't merge map entries */
+#define UVM_FLAG_COPYONW 0x0080000 /* set copy_on_write flag */
+#define UVM_FLAG_TRYLOCK 0x0100000 /* fail if we can not lock map */
+#define UVM_FLAG_HOLE 0x0200000 /* no backend */
+#define UVM_FLAG_QUERY 0x0400000 /* do everything,
+ except actual execution */
+#define UVM_FLAG_NOFAULT 0x0800000 /* don't fault */
+#define UVM_FLAG_UNMAP 0x1000000 /* unmap to make space */
+#define UVM_FLAG_STACK 0x2000000 /* page may contain a stack */
+.Ed
+.Pp
+The
+.Dv UVM_MAPFLAG
+macro arguments can be combined with an or operator.
+There are also some additional macros to extract bits from the flags.
+The
+.Dv UVM_PROTECTION ,
+.Dv UVM_INHERIT ,
+.Dv UVM_MAXPROTECTION
+and
+.Dv UVM_ADVICE
+macros return the protection, inheritance, maximum protection and advice,
+respectively.
+.Fn uvm_map
+returns a standard errno.
+.Pp
+The
+.Fn uvm_map_pageable
+function changes the pageability of the pages in the range from
+.Fa start
+to
+.Fa end
+in map
+.Fa map
+to
+.Fa new_pageable .
+The
+.Fn uvm_map_pageable_all
+function changes the pageability of all mapped regions.
+If
+.Fa limit
+is non-zero and
+.Fn pmap_wired_count
+is implemented,
+.Dv ENOMEM
+is returned if the amount of wired pages exceed
+.Fa limit .
+The map is locked on entry if
+.Fa lockflags
+contain
+.Dv UVM_LK_ENTER ,
+and locked on exit if
+.Fa lockflags
+contain
+.Dv UVM_LK_EXIT .
+.Fn uvm_map_pageable
+and
+.Fn uvm_map_pageable_all
+return a standard errno.
+.Pp
+The
+.Fn uvm_map_checkprot
+function checks the protection of the range from
+.Fa start
+to
+.Fa end
+in map
+.Fa map
+against
+.Fa protection .
+This returns either
+.Dv TRUE
+or
+.Dv FALSE .
+.Pp
+The
+.Fn uvm_map_protect
+function changes the protection
+.Fa start
+to
+.Fa end
+in map
+.Fa map
+to
+.Fa new_prot ,
+also setting the maximum protection to the region to
+.Fa new_prot
+if
+.Fa set_max
+is non-zero.
+This function returns a standard errno.
+.Pp
+The
+.Fn uvmspace_alloc
+function allocates and returns a new address space, with ranges from
+.Fa min
+to
+.Fa max ,
+setting the pageability of the address space to
+.Fa pageable .
+If
+.Fa remove_holes
+is non-zero, hardware
+.Sq holes
+in the virtual address space will be removed from the newly allocated
+address space.
+.Pp
+The
+.Fn uvmspace_exec
+function either reuses the address space of process
+.Fa p
+if there are no other references to it, or creates
+a new one with
+.Fn uvmspace_alloc .
+The range of valid addresses in the address space is reset to
+.Fa start
+through
+.Fa end .
+.Pp
+The
+.Fn uvmspace_fork
+function creates and returns a new address space based upon the
+address space of process
+.Fa pr
+and is typically used when allocating an address space for a
+child process.
+.Pp
+The
+.Fn uvmspace_free
+function lowers the reference count on the address space
+.Fa vm ,
+freeing the data structures if there are no other references.
+.Pp
+The
+.Fn uvmspace_share
+function returns a reference to the address space of process
+.Fa pr ,
+increasing its reference count.
+.Pp
+The
+.Fn uvm_uarea_alloc
+function allocates a thread's
+.Sq uarea ,
+the memory where its kernel stack and PCB are stored.
+The
+.Fn uvm_uarea_free
+function frees the uarea for
+thread
+.Fa p ,
+which must no longer be running.
+.Sh SEE ALSO
+.Xr pmap 9
diff --git a/share/man/man9/uvm_pagealloc.9 b/share/man/man9/uvm_pagealloc.9
new file mode 100644
index 00000000000..3f883e7f22d
--- /dev/null
+++ b/share/man/man9/uvm_pagealloc.9
@@ -0,0 +1,169 @@
+.\" $OpenBSD: uvm_pagealloc.9,v 1.1 2019/12/05 15:14:28 mpi Exp $
+.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
+.\"
+.\" Copyright (c) 1998 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd $Mdocdate: December 5 2019 $
+.Dt UVM_PAGEALLOC 9
+.Os
+.Sh NAME
+.Nm uvm_pagealloc ,
+.Nm uvm_pagerealloc ,
+.Nm uvm_pagefree ,
+.Nm uvm_pglistalloc ,
+.Nm uvm_pglistfree ,
+.Nm uvm_page_physload
+.Nd physical memory allocator
+.Sh SYNOPSIS
+.In sys/param.h
+.In uvm/uvm.h
+.Ft struct vm_page *
+.Fn uvm_pagealloc "struct uvm_object *uobj" "voff_t off" "struct vm_anon *anon" "int flags"
+.Ft void
+.Fn uvm_pagerealloc "struct vm_page *pg" "struct uvm_object *newobj" "voff_t newoff"
+.Ft void
+.Fn uvm_pagefree "struct vm_page *pg"
+.Ft int
+.Fn uvm_pglistalloc "psize_t size" "paddr_t low" "paddr_t high" "paddr_t alignment" "paddr_t boundary" "struct pglist *rlist" "int nsegs" "int flags"
+.Ft void
+.Fn uvm_pglistfree "struct pglist *list"
+.Ft void
+.Fn uvm_page_physload "paddr_t start" "paddr_t end" "paddr_t avail_start" "paddr_t avail_end" "int free_list"
+.Sh DESCRIPTION
+The
+.Fn uvm_pagealloc
+function allocates a page of memory at virtual address
+.Fa off
+in either the object
+.Fa uobj
+or the anonymous memory
+.Fa anon ,
+or returns
+.Dv NULL
+if no pages are free.
+Only one of
+.Fa anon
+and
+.Fa uobj
+can be non
+.Dv NULL .
+The
+.Fa flags
+can be any of:
+.Bd -literal
+#define UVM_PGA_USERESERVE 0x0001 /* ok to use reserve pages */
+#define UVM_PGA_ZERO 0x0002 /* returned page must be zeroed */
+.Ed
+.Pp
+The
+.Dv UVM_PGA_USERESERVE
+flag means to allocate a page even if that will result in the number of
+free pages being lower than
+.Dv uvmexp.reserve_pagedaemon
+(if the current thread is the pagedaemon) or
+.Dv uvmexp.reserve_kernel
+(if the current thread is not the pagedaemon).
+The
+.Dv UVM_PGA_ZERO
+flag causes the returned page to be filled with zeroes, either by allocating it
+from a pool of pre-zeroed pages or by zeroing it in-line as necessary.
+.Pp
+The
+.Fn uvm_pagerealloc
+function reallocates page
+.Fa pg
+to a new object
+.Fa newobj ,
+at a new offset
+.Fa newoff .
+.Pp
+The
+.Fn uvm_pagefree
+function frees the physical page
+.Fa pg .
+.Pp
+The
+.Fn uvm_pglistalloc
+function allocates a list of pages for size
+.Fa size
+byte under various constraints.
+.Fa low
+and
+.Fa high
+describe the lowest and highest addresses acceptable for the list.
+If
+.Fa alignment
+is non-zero, it describes the required alignment of the list, in
+power-of-two notation.
+If
+.Fa boundary
+is non-zero, no segment of the list may cross this power-of-two
+boundary, relative to zero.
+.Fa nsegs
+is the maximum number of physically contiguous segments.
+The allocated memory is returned in the
+.Fa rlist
+list.
+The
+.Fa flags
+can be any of:
+.Bd -literal
+#define UVM_PLA_WAITOK 0x0001 /* may sleep */
+#define UVM_PLA_NOWAIT 0x0002 /* can't sleep */
+#define UVM_PLA_ZERO 0x0004 /* zero all pages before returning */
+.Ed
+.Pp
+The
+.Dv UVM_PLA_WAITOK
+flag means that the function may sleep while trying to allocate the list of
+pages (this is currently ignored).
+Conversely, the
+.Dv UVM_PLA_NOWAIT
+flag signifies that the function may not sleep while allocating.
+It is an error not to provide one of the above flags.
+Optionally, one may also specify the
+.Dv UVM_PLA_ZERO
+flag to receive zeroed memory in the page list.
+.Pp
+The
+.Fn uvm_pglistfree
+function frees the list of pages pointed to by
+.Fa list .
+.Pp
+The
+.Fn uvm_page_physload
+function loads physical memory segments into VM space on the specified
+.Fa free_list .
+.Fn uvm_page_physload
+must be called at system boot time to set up physical memory management pages.
+The arguments describe the
+.Fa start
+and
+.Fa end
+of the physical addresses of the segment, and the available start and end
+addresses of pages not already in use.
+.\" XXX expand on "system boot time"!
+.Sh SEE ALSO
+.Xr uvm_km_alloc 9
diff --git a/share/man/man9/uvn_attach.9 b/share/man/man9/uvn_attach.9
new file mode 100644
index 00000000000..0bad650f840
--- /dev/null
+++ b/share/man/man9/uvn_attach.9
@@ -0,0 +1,99 @@
+.\" $OpenBSD: uvn_attach.9,v 1.1 2019/12/05 15:14:28 mpi Exp $
+.\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $
+.\"
+.\" Copyright (c) 1998 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd $Mdocdate: December 5 2019 $
+.Dt UVN_ATTACH 9
+.Os
+.Sh NAME
+.Nm uvn_attach ,
+.Nm uvm_vnp_setsize ,
+.Nm uvm_vnp_sync ,
+.Nm uvm_vnp_terminate ,
+.Nm uvm_vnp_uncache
+.Nd memory mapping files and devices
+.Sh SYNOPSIS
+.In sys/param.h
+.In uvm/uvm.h
+.Ft struct uvm_object *
+.Fn uvn_attach "struct vnode *vp" "vm_prot_t accessprot"
+.Ft void
+.Fn uvm_vnp_setsize "struct vnode *vp" "voff_t newsize"
+.Ft void
+.Fn uvm_vnp_sync "struct mount *mp"
+.Ft void
+.Fn uvm_vnp_terminate "struct vnode *vp"
+.Ft boolean_t
+.Fn uvm_vnp_uncache "struct vnode *vp"
+.Sh DESCRIPTION
+The
+.Fn uvn_attach
+function attaches a UVM object to vnode
+.Fa vp ,
+creating the object if necessary.
+The object is returned.
+.Pp
+The
+.Fn uvm_vnp_setsize
+function sets the size of vnode
+.Fa vp
+to
+.Fa newsize .
+Caller must hold a reference to the vnode.
+If the vnode shrinks, pages no longer used are discarded.
+This function will be removed when the file system and VM buffer caches
+are merged.
+.Pp
+The
+.Fn uvm_vnp_sync
+function flushes dirty vnodes from either the mount point passed in
+.Fa mp ,
+or all dirty vnodes if
+.Fa mp
+is
+.Dv NULL .
+This function will be removed when the file system and VM buffer caches
+are merged.
+.Pp
+The
+.Fn uvm_vnp_terminate
+function frees all VM resources allocated to vnode
+.Fa vp .
+If the vnode still has references, it will not be destroyed; however
+all future operations using this vnode will fail.
+This function will be removed when the file system and VM buffer caches
+are merged.
+.Pp
+The
+.Fn uvm_vnp_uncache
+function disables vnode
+.Fa vp
+from persisting when all references are freed.
+This function will be removed when the file system and UVM caches
+are unified.
+Returns true if there is no active vnode.
+.Sh SEE ALSO
+.Xr uvm_init 9