#ifndef _UVM_UVM_EXTERN_H_
#define _UVM_UVM_EXTERN_H_
#include <sys/types.h>
#define UVM_PROT_MASK 0x07
#define UVM_PROT_NONE 0x00
#define UVM_PROT_ALL 0x07
#define UVM_PROT_READ 0x01
#define UVM_PROT_WRITE 0x02
#define UVM_PROT_EXEC 0x04
#define UVM_PROT_R 0x01
#define UVM_PROT_W 0x02
#define UVM_PROT_RW 0x03
#define UVM_PROT_X 0x04
#define UVM_PROT_RX 0x05
#define UVM_PROT_WX 0x06
#define UVM_PROT_RWX 0x07
#define UVM_INH_MASK 0x30
#define UVM_INH_SHARE 0x00
#define UVM_INH_COPY 0x10
#define UVM_INH_NONE 0x20
#define UVM_INH_DONATE 0x30
#define UVM_ADV_NORMAL 0x0
#define UVM_ADV_RANDOM 0x1
#define UVM_ADV_SEQUENTIAL 0x2
#define UVM_ADV_WILLNEED 0x3
#define UVM_ADV_DONTNEED 0x4
#define UVM_ADV_NOREUSE 0x5
#define UVM_ADV_MASK 0x7
#define UVM_FLAG_FIXED 0x00010000
#define UVM_FLAG_OVERLAY 0x00020000
#define UVM_FLAG_NOMERGE 0x00040000
#define UVM_FLAG_COPYONW 0x00080000
#define UVM_FLAG_AMAPPAD 0x00100000
#define UVM_FLAG_TRYLOCK 0x00200000
#define UVM_FLAG_NOWAIT 0x00400000
#define UVM_FLAG_WAITVA 0x00800000
#define UVM_FLAG_VAONLY 0x02000000
#define UVM_FLAG_COLORMATCH 0x04000000
#define UVM_FLAG_UNMAP 0x08000000
#define UVM_FLAG_BITS "\177\020\
F\0\3\
:\0PROT=NONE\0\
:\1PROT=R\0\
:\2PROT=W\0\
:\3PROT=RW\0\
:\4PROT=X\0\
:\5PROT=RX\0\
:\6PROT=WX\0\
:\7PROT=RWX\0\
F\4\2\
:\0INH=SHARE\0\
:\1INH=COPY\0\
:\2INH=NONE\0\
:\3INH=DONATE\0\
F\10\3\
:\0MAXPROT=NONE\0\
:\1MAXPROT=R\0\
:\2MAXPROT=W\0\
:\3MAXPROT=RW\0\
:\4MAXPROT=X\0\
:\5MAXPROT=RX\0\
:\6MAXPROT=WX\0\
:\7MAXPROT=RWX\0\
F\14\3\
:\0ADV=NORMAL\0\
:\1ADV=RANDOM\0\
:\2ADV=SEQUENTIAL\0\
:\3ADV=WILLNEED\0\
:\4ADV=DONTNEED\0\
:\5ADV=NOREUSE\0\
b\20FIXED\0\
b\21OVERLAY\0\
b\22NOMERGE\0\
b\23COPYONW\0\
b\24AMAPPAD\0\
b\25TRYLOCK\0\
b\26NOWAIT\0\
b\27WAITVA\0\
b\30VAONLY\0\
b\31COLORMATCH\0\
b\32UNMAP\0\
"
#define UVM_PROTECTION(X) ((X) & UVM_PROT_MASK)
#define UVM_INHERIT(X) (((X) & UVM_INH_MASK) >> 4)
#define UVM_MAXPROTECTION(X) (((X) >> 8) & UVM_PROT_MASK)
#define UVM_ADVICE(X) (((X) >> 12) & UVM_ADV_MASK)
#define UVM_MAPFLAG(PROT,MAXPROT,INH,ADVICE,FLAGS) \
(((MAXPROT) << 8)|(PROT)|(INH)|((ADVICE) << 12)|(FLAGS))
#define UVM_UNKNOWN_OFFSET ((voff_t) -1)
#define UVM_KMF_WIRED 0x1
#define UVM_KMF_PAGEABLE 0x2
#define UVM_KMF_VAONLY 0x4
#define UVM_KMF_TYPEMASK (UVM_KMF_VAONLY | UVM_KMF_PAGEABLE | UVM_KMF_WIRED)
#define UVM_KMF_CANFAIL 0x8
#define UVM_KMF_ZERO 0x10
#define UVM_KMF_EXEC 0x20
#define UVM_KMF_TRYLOCK UVM_FLAG_TRYLOCK
#define UVM_KMF_NOWAIT UVM_FLAG_NOWAIT
#define UVM_KMF_WAITVA UVM_FLAG_WAITVA
#define UVM_KMF_COLORMATCH UVM_FLAG_COLORMATCH
#define UVM_PGA_STRAT_NORMAL 0
#define UVM_PGA_STRAT_ONLY 1
#define UVM_PGA_STRAT_FALLBACK 2
#define UVM_PGA_STRAT_NUMA 3
#define UVM_PGA_USERESERVE 0x0001
#define UVM_PGA_ZERO 0x0002
#define UBC_READ 0x001
#define UBC_WRITE 0x002
#define UBC_FAULTBUSY 0x004
#define UBC_ISMAPPED 0x008
#define UBC_UNMAP 0x010
#define UBC_PARTIALOK 0x100
#define UFP_ALL 0x00
#define UFP_NOWAIT 0x01
#define UFP_NOALLOC 0x02
#define UFP_NOCACHE 0x04
#define UFP_NORDONLY 0x08
#define UFP_DIRTYONLY 0x10
#define UFP_BACKWARD 0x20
#define UFP_NOBUSY 0x40
#define UVM_LK_ENTER 0x00000001
#define UVM_LK_EXIT 0x00000002
#define UBC_MAX_PAGES 8
#define UVM_EMAP_INACTIVE (0)
struct buf;
struct core;
struct loadavg;
struct mount;
struct pglist;
struct proc;
struct uio;
struct uvm_object;
struct vm_anon;
struct vmspace;
struct pmap;
struct vnode;
struct vm_map_entry;
struct vm_map;
struct vm_page;
struct vmtotal;
#define UVM_PCTPARAM_SHIFT 8
#define UVM_PCTPARAM_SCALE (1 << UVM_PCTPARAM_SHIFT)
#define UVM_PCTPARAM_APPLY(pct, x) \
(((uint64_t)(x) * (pct)->pct_scaled) >> UVM_PCTPARAM_SHIFT)
struct uvm_pctparam {
int pct_pct;
int pct_scaled;
int (*pct_check)(struct uvm_pctparam *, int);
};
struct uvmexp {
int pagesize;
int pagemask;
int pageshift;
int npages;
int free;
int paging;
int wired;
int ncolors;
int colormask;
int zeropages;
int reserve_pagedaemon;
int reserve_kernel;
unsigned anonpages;
unsigned filepages;
unsigned execpages;
int freemin;
int freetarg;
int wiredmax;
int nswapdev;
int swpages;
int swpgavail;
int swpginuse;
int swpgonly;
int nswget;
int faults;
int traps;
int intrs;
int swtch;
int softs;
int syscalls;
int pageins;
int _unused1;
int _unused2;
int pgswapin;
int pgswapout;
int forks;
int forks_ppwait;
int forks_sharevm;
int pga_zerohit;
int pga_zeromiss;
int zeroaborts;
int colorhit;
int colormiss;
int cpuhit;
int cpumiss;
int fltnoram;
int fltnoanon;
int fltpgwait;
int fltpgrele;
int fltrelck;
int fltrelckok;
int fltanget;
int fltanretry;
int fltamcopy;
int fltnamap;
int fltnomap;
int fltlget;
int fltget;
int flt_anon;
int flt_acow;
int flt_obj;
int flt_prcopy;
int flt_przero;
int pdwoke;
int pdrevs;
int _unused3;
int pdfreed;
int pdscans;
int pdanscan;
int pdobscan;
int pdreact;
int pdbusy;
int pdpageouts;
int pdpending;
int pddeact;
int pdreanon;
int pdrefile;
int pdreexec;
int bootpages;
};
struct uvmexp_sysctl {
int64_t pagesize;
int64_t pagemask;
int64_t pageshift;
int64_t npages;
int64_t free;
int64_t active;
int64_t inactive;
int64_t paging;
int64_t wired;
int64_t zeropages;
int64_t reserve_pagedaemon;
int64_t reserve_kernel;
int64_t freemin;
int64_t freetarg;
int64_t inactarg;
int64_t wiredmax;
int64_t nswapdev;
int64_t swpages;
int64_t swpginuse;
int64_t swpgonly;
int64_t nswget;
int64_t unused1;
int64_t cpuhit;
int64_t cpumiss;
int64_t faults;
int64_t traps;
int64_t intrs;
int64_t swtch;
int64_t softs;
int64_t syscalls;
int64_t pageins;
int64_t swapins;
int64_t swapouts;
int64_t pgswapin;
int64_t pgswapout;
int64_t forks;
int64_t forks_ppwait;
int64_t forks_sharevm;
int64_t pga_zerohit;
int64_t pga_zeromiss;
int64_t zeroaborts;
int64_t fltnoram;
int64_t fltnoanon;
int64_t fltpgwait;
int64_t fltpgrele;
int64_t fltrelck;
int64_t fltrelckok;
int64_t fltanget;
int64_t fltanretry;
int64_t fltamcopy;
int64_t fltnamap;
int64_t fltnomap;
int64_t fltlget;
int64_t fltget;
int64_t flt_anon;
int64_t flt_acow;
int64_t flt_obj;
int64_t flt_prcopy;
int64_t flt_przero;
int64_t pdwoke;
int64_t pdrevs;
int64_t unused4;
int64_t pdfreed;
int64_t pdscans;
int64_t pdanscan;
int64_t pdobscan;
int64_t pdreact;
int64_t pdbusy;
int64_t pdpageouts;
int64_t pdpending;
int64_t pddeact;
int64_t anonpages;
int64_t filepages;
int64_t execpages;
int64_t colorhit;
int64_t colormiss;
int64_t ncolors;
int64_t bootpages;
int64_t poolpages;
int64_t countsyncone;
int64_t countsyncall;
int64_t anonunknown;
int64_t anonclean;
int64_t anondirty;
int64_t fileunknown;
int64_t fileclean;
int64_t filedirty;
int64_t fltup;
int64_t fltnoup;
};
#ifdef _KERNEL
extern struct uvmexp uvmexp;
#endif
#include <sys/vmmeter.h>
#include <sys/queue.h>
#include <sys/lock.h>
#ifdef _KERNEL
#include <sys/vmem.h>
#endif
#include <uvm/uvm_param.h>
#include <uvm/uvm_prot.h>
#include <uvm/uvm_pmap.h>
#if defined(_KERNEL) || defined(_KMEMUSER)
#include <uvm/uvm_map.h>
#include <uvm/uvm_pager.h>
#endif
#ifdef _KERNEL
#include <uvm/uvm_physseg.h>
#endif
#ifdef PMAP_CACHE_VIVT
#define UBC_VNODE_FLAGS(vp) \
((((vp)->v_iflag & VI_TEXT) != 0 ? UBC_UNMAP : 0) | \
(((vp)->v_vflag & VV_MAPPED) != 0 ? UBC_ISMAPPED : 0))
#else
#define UBC_VNODE_FLAGS(vp) \
(((vp)->v_vflag & VV_MAPPED) != 0 ? UBC_ISMAPPED : 0)
#endif
#if defined(_KERNEL) || defined(_KMEMUSER)
struct vmspace {
struct vm_map vm_map;
volatile int vm_refcnt;
void * vm_shm;
#define vm_startcopy vm_rssize
segsz_t vm_rssize;
segsz_t vm_rssmax;
segsz_t vm_tsize;
segsz_t vm_dsize;
segsz_t vm_ssize;
segsz_t vm_issize;
void * vm_taddr;
void * vm_daddr;
void *vm_maxsaddr;
void *vm_minsaddr;
size_t vm_aslr_delta_mmap;
};
#define VMSPACE_IS_KERNEL_P(vm) VM_MAP_IS_KERNEL(&(vm)->vm_map)
#endif
#ifdef _KERNEL
struct uvm_coredump_state {
void *cookie;
vaddr_t start;
vaddr_t realend;
vaddr_t end;
vm_prot_t prot;
int flags;
};
#define UVM_COREDUMP_STACK 0x01
extern struct vm_map *kernel_map;
extern struct vm_map *phys_map;
struct uvm_voaddr {
uintptr_t object;
voff_t offset;
};
#define vm_resident_count(vm) uvm_resident_count(vm)
int vmapbuf(struct buf *, vsize_t);
void vunmapbuf(struct buf *, vsize_t);
void ktext_write(void *, const void *, size_t);
struct uvm_object *uao_create(voff_t, int);
void uao_set_pgfl(struct uvm_object *, int);
void uao_detach(struct uvm_object *);
void uao_reference(struct uvm_object *);
void ubc_init(void);
void ubchist_init(void);
int ubc_uiomove(struct uvm_object *, struct uio *, vsize_t,
int, int);
void ubc_zerorange(struct uvm_object *, off_t, size_t, int);
void ubc_purge(struct uvm_object *);
#define uvm_fault(m, a, p) uvm_fault_internal(m, a, p, 0)
int uvm_fault_internal(struct vm_map *, vaddr_t, vm_prot_t, int);
#if defined(KGDB)
void uvm_chgkprot(void *, size_t, int);
#endif
void uvm_proc_fork(struct proc *, struct proc *, bool);
void uvm_lwp_fork(struct lwp *, struct lwp *,
void *, size_t, void (*)(void *), void *);
int uvm_coredump_walkmap(struct proc *,
int (*)(struct uvm_coredump_state *), void *);
int uvm_coredump_count_segs(struct proc *);
void uvm_proc_exit(struct proc *);
void uvm_lwp_exit(struct lwp *);
void uvm_idle(void);
void uvm_init_limits(struct proc *);
bool uvm_kernacc(void *, size_t, vm_prot_t);
__dead void uvm_scheduler(void);
vaddr_t uvm_uarea_alloc(void);
void uvm_uarea_free(vaddr_t);
vaddr_t uvm_uarea_system_alloc(struct cpu_info *);
void uvm_uarea_system_free(vaddr_t);
vaddr_t uvm_lwp_getuarea(lwp_t *);
void uvm_lwp_setuarea(lwp_t *, vaddr_t);
int uvm_vslock(struct vmspace *, void *, size_t, vm_prot_t);
void uvm_vsunlock(struct vmspace *, void *, size_t);
long uvm_resident_count(struct vmspace *);
void uvm_cpu_attach(struct cpu_info *);
void uvm_md_init(void);
void uvm_init(void);
int uvm_io(struct vm_map *, struct uio *, int);
vaddr_t uvm_km_alloc(struct vm_map *, vsize_t, vsize_t,
uvm_flag_t);
int uvm_km_protect(struct vm_map *, vaddr_t, vsize_t,
vm_prot_t);
void uvm_km_free(struct vm_map *, vaddr_t, vsize_t,
uvm_flag_t);
struct vm_map *uvm_km_suballoc(struct vm_map *, vaddr_t *,
vaddr_t *, vsize_t, int, bool,
struct vm_map *);
int uvm_km_kmem_alloc(vmem_t *, vmem_size_t, vm_flag_t,
vmem_addr_t *);
void uvm_km_kmem_free(vmem_t *, vmem_addr_t, vmem_size_t);
bool uvm_km_va_starved_p(void);
int uvm_map(struct vm_map *, vaddr_t *, vsize_t,
struct uvm_object *, voff_t, vsize_t,
uvm_flag_t);
int uvm_map_pageable(struct vm_map *, vaddr_t,
vaddr_t, bool, int);
int uvm_map_pageable_all(struct vm_map *, int, vsize_t);
bool uvm_map_checkprot(struct vm_map *, vaddr_t,
vaddr_t, vm_prot_t);
int uvm_map_protect(struct vm_map *, vaddr_t,
vaddr_t, vm_prot_t, bool);
int uvm_map_protect_user(struct lwp *, vaddr_t, vaddr_t,
vm_prot_t);
struct vmspace *uvmspace_alloc(vaddr_t, vaddr_t, bool);
void uvmspace_init(struct vmspace *, struct pmap *,
vaddr_t, vaddr_t, bool);
void uvmspace_exec(struct lwp *, vaddr_t, vaddr_t, bool);
struct vmspace *uvmspace_fork(struct vmspace *);
void uvmspace_addref(struct vmspace *);
void uvmspace_free(struct vmspace *);
void uvmspace_share(struct proc *, struct proc *);
void uvmspace_unshare(struct lwp *);
bool uvm_voaddr_acquire(struct vm_map *, vaddr_t,
struct uvm_voaddr *);
void uvm_voaddr_release(struct uvm_voaddr *);
int uvm_voaddr_compare(const struct uvm_voaddr *,
const struct uvm_voaddr *);
void uvm_whatis(uintptr_t, void (*)(const char *, ...));
int uvm_sysctl(int *, u_int, void *, size_t *,
void *, size_t, struct proc *);
int uvm_pctparam_check(struct uvm_pctparam *, int);
void uvm_pctparam_set(struct uvm_pctparam *, int);
int uvm_pctparam_get(struct uvm_pctparam *);
void uvm_pctparam_init(struct uvm_pctparam *, int,
int (*)(struct uvm_pctparam *, int));
int uvm_pctparam_createsysctlnode(struct uvm_pctparam *,
const char *, const char *);
void uvm_update_uvmexp(void);
int uvm_mmap_dev(struct proc *, void **, size_t, dev_t,
off_t);
int uvm_mmap_anon(struct proc *, void **, size_t);
vaddr_t uvm_default_mapaddr(struct proc *, vaddr_t, vsize_t,
int);
int uvm_mremap(struct vm_map *, vaddr_t, vsize_t,
struct vm_map *, vaddr_t *, vsize_t,
struct proc *, int);
void uvm_obj_init(struct uvm_object *,
const struct uvm_pagerops *, bool, u_int);
void uvm_obj_setlock(struct uvm_object *, krwlock_t *);
void uvm_obj_destroy(struct uvm_object *, bool);
int uvm_obj_wirepages(struct uvm_object *, off_t, off_t,
struct pglist *);
void uvm_obj_unwirepages(struct uvm_object *, off_t, off_t);
bool uvm_obj_clean_p(struct uvm_object *);
bool uvm_obj_nowriteback_p(struct uvm_object *);
bool uvm_obj_page_dirty_p(struct vm_page *);
void uvm_obj_page_set_dirty(struct vm_page *);
void uvm_obj_page_clear_dirty(struct vm_page *);
bool uvm_obj_page_writeback_p(struct vm_page *);
void uvm_obj_page_set_writeback(struct vm_page *);
void uvm_obj_page_clear_writeback(struct vm_page *);
int uvm_availmem(bool);
void uvm_page_numa_load(paddr_t, paddr_t, u_int);
struct vm_page *uvm_pagealloc_strat(struct uvm_object *,
voff_t, struct vm_anon *, int, int, int);
#define uvm_pagealloc(obj, off, anon, flags) \
uvm_pagealloc_strat((obj), (off), (anon), (flags), \
UVM_PGA_STRAT_NORMAL, 0)
void uvm_pagereplace(struct vm_page *,
struct vm_page *);
int uvm_pagerealloc(struct vm_page *,
struct uvm_object *, voff_t);
void uvm_setpagesize(void);
void uvm_aio_aiodone(struct buf *);
void uvm_aio_aiodone_pages(struct vm_page **, int, bool,
int);
void uvm_pageout(void *);
struct work;
void uvm_aiodone_worker(struct work *, void *);
void uvm_pageout_start(int);
void uvm_pageout_done(int);
void uvm_estimatepageable(int *, int *);
int uvm_pglistalloc(psize_t, paddr_t, paddr_t,
paddr_t, paddr_t, struct pglist *, int, int);
void uvm_pglistfree(struct pglist *);
void uvm_swap_init(void);
int uvm_grow(struct proc *, vaddr_t);
void uvm_deallocate(struct vm_map *, vaddr_t, vsize_t);
struct uvm_page_array;
void uvm_vnp_setsize(struct vnode *, voff_t);
void uvm_vnp_setwritesize(struct vnode *, voff_t);
int uvn_findpages(struct uvm_object *, voff_t,
unsigned int *, struct vm_page **,
struct uvm_page_array *, unsigned int);
bool uvn_text_p(struct uvm_object *);
bool uvn_needs_writefault_p(struct uvm_object *);
void kmeminit_nkmempages(void);
extern size_t nkmempages;
#endif
#endif