[BACK]Return to uvm_extern.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / uvm

Annotation of src/sys/uvm/uvm_extern.h, Revision 1.19

1.19    ! eeh         1: /*     $NetBSD: uvm_extern.h,v 1.18 1998/08/01 01:39:03 thorpej Exp $  */
1.1       mrg         2:
                      3: /*
                      4:  * XXXCDC: "ROUGH DRAFT" QUALITY UVM PRE-RELEASE FILE!
                      5:  *        >>>USE AT YOUR OWN RISK, WORK IS NOT FINISHED<<<
                      6:  */
                      7: /*
                      8:  *
                      9:  * Copyright (c) 1997 Charles D. Cranor and Washington University.
                     10:  * All rights reserved.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  * 3. All advertising materials mentioning features or use of this software
                     21:  *    must display the following acknowledgement:
                     22:  *      This product includes software developed by Charles D. Cranor and
                     23:  *      Washington University.
                     24:  * 4. The name of the author may not be used to endorse or promote products
                     25:  *    derived from this software without specific prior written permission.
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     28:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     29:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     30:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     31:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     32:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     33:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     34:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     35:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     36:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.4       mrg        37:  *
                     38:  * from: Id: uvm_extern.h,v 1.1.2.21 1998/02/07 01:16:53 chs Exp
1.1       mrg        39:  */
                     40:
1.8       perry      41: #ifndef _UVM_UVM_EXTERN_H_
                     42: #define _UVM_UVM_EXTERN_H_
1.1       mrg        43:
                     44: /*
                     45:  * uvm_extern.h: this file defines the external interface to the VM system.
                     46:  *
                     47:  * this should be the only file included by non-VM parts of the kernel
                     48:  * which need access to VM services.   if you want to know the interface
                     49:  * to the MI VM layer without knowing the details, this is the file to
                     50:  * learn.
                     51:  *
                     52:  * NOTE: vm system calls are prototyped in syscallargs.h
                     53:  */
                     54:
                     55: /*
                     56:  * defines
                     57:  */
                     58:
                     59: /*
                     60:  * the following defines are for uvm_map and functions which call it.
                     61:  */
                     62:
                     63: /* protections bits */
                     64: #define UVM_PROT_MASK  0x07    /* protection mask */
                     65: #define UVM_PROT_NONE  0x00    /* protection none */
                     66: #define UVM_PROT_ALL   0x07    /* everything */
                     67: #define UVM_PROT_READ  0x01    /* read */
                     68: #define UVM_PROT_WRITE  0x02   /* write */
                     69: #define UVM_PROT_EXEC  0x04    /* exec */
                     70:
                     71: /* protection short codes */
                     72: #define UVM_PROT_R     0x01    /* read */
                     73: #define UVM_PROT_W     0x02    /* write */
                     74: #define UVM_PROT_RW    0x03    /* read-write */
                     75: #define UVM_PROT_X     0x04    /* exec */
                     76: #define UVM_PROT_RX    0x05    /* read-exec */
                     77: #define UVM_PROT_WX    0x06    /* write-exec */
                     78: #define UVM_PROT_RWX   0x07    /* read-write-exec */
                     79:
                     80: /* 0x08: not used */
                     81:
                     82: /* inherit codes */
                     83: #define UVM_INH_MASK   0x30    /* inherit mask */
                     84: #define UVM_INH_SHARE  0x00    /* "share" */
                     85: #define UVM_INH_COPY   0x10    /* "copy" */
                     86: #define UVM_INH_NONE   0x20    /* "none" */
                     87: #define UVM_INH_DONATE 0x30    /* "donate" << not used */
                     88:
                     89: /* 0x40, 0x80: not used */
                     90:
                     91: /* bits 0x700: max protection, 0x800: not used */
                     92:
                     93: /* bits 0x7000: advice, 0x8000: not used */
                     94: /* advice: matches MADV_* from sys/mman.h */
                     95: #define UVM_ADV_NORMAL 0x0     /* 'normal' */
                     96: #define UVM_ADV_RANDOM 0x1     /* 'random' */
                     97: #define UVM_ADV_SEQUENTIAL 0x2 /* 'sequential' */
                     98: /* 0x3: will need, 0x4: dontneed */
                     99: #define UVM_ADV_MASK   0x7     /* mask */
                    100:
                    101: /* mapping flags */
                    102: #define UVM_FLAG_FIXED   0x010000 /* find space */
                    103: #define UVM_FLAG_OVERLAY 0x020000 /* establish overlay */
                    104: #define UVM_FLAG_NOMERGE 0x040000 /* don't merge map entries */
                    105: #define UVM_FLAG_COPYONW 0x080000 /* set copy_on_write flag */
                    106: #define UVM_FLAG_AMAPPAD 0x100000 /* for bss: pad amap to reduce malloc() */
                    107: #define UVM_FLAG_TRYLOCK 0x200000 /* fail if we can not lock map */
                    108:
                    109: /* macros to extract info */
                    110: #define UVM_PROTECTION(X)      ((X) & UVM_PROT_MASK)
                    111: #define UVM_INHERIT(X)         (((X) & UVM_INH_MASK) >> 4)
                    112: #define UVM_MAXPROTECTION(X)   (((X) >> 8) & UVM_PROT_MASK)
                    113: #define UVM_ADVICE(X)          (((X) >> 12) & UVM_ADV_MASK)
                    114:
                    115: #define UVM_MAPFLAG(PROT,MAXPROT,INH,ADVICE,FLAGS) \
                    116:        ((MAXPROT << 8)|(PROT)|(INH)|((ADVICE) << 12)|(FLAGS))
                    117:
                    118: /* magic offset value */
1.19    ! eeh       119: #define UVM_UNKNOWN_OFFSET ((vaddr_t) -1)
1.1       mrg       120:                                /* offset not known(obj) or don't care(!obj) */
                    121:
                    122: /*
                    123:  * the following defines are for uvm_km_kmemalloc's flags
                    124:  */
                    125:
                    126: #define UVM_KMF_NOWAIT 0x1                     /* matches M_NOWAIT */
                    127: #define UVM_KMF_VALLOC 0x2                     /* allocate VA only */
                    128: #define UVM_KMF_TRYLOCK        UVM_FLAG_TRYLOCK        /* try locking only */
                    129:
                    130: /*
1.15      thorpej   131:  * the following defines the strategies for uvm_pagealloc_strat()
                    132:  */
                    133: #define        UVM_PGA_STRAT_NORMAL    0       /* high -> low free list walk */
                    134: #define        UVM_PGA_STRAT_ONLY      1       /* only specified free list */
                    135: #define        UVM_PGA_STRAT_FALLBACK  2       /* ONLY falls back on NORMAL */
                    136:
                    137: /*
1.1       mrg       138:  * structures
                    139:  */
                    140:
                    141: struct core;
                    142: struct mount;
                    143: struct pglist;
                    144: struct proc;
                    145: struct ucred;
                    146: struct uio;
                    147: struct uvm_object;
                    148: struct vm_anon;
                    149: struct vmspace;
1.10      thorpej   150: struct pmap;
1.1       mrg       151: struct vnode;
                    152:
                    153: /*
                    154:  * uvmexp: global data structures that are exported to parts of the kernel
                    155:  * other than the vm system.
                    156:  */
                    157:
                    158: struct uvmexp {
1.9       mrg       159:        /* vm_page constants */
1.1       mrg       160:        int pagesize;   /* size of a page (PAGE_SIZE): must be power of 2 */
                    161:        int pagemask;   /* page mask */
                    162:        int pageshift;  /* page shift */
                    163:
1.9       mrg       164:        /* vm_page counters */
1.1       mrg       165:        int npages;     /* number of pages we manage */
                    166:        int free;       /* number of free pages */
                    167:        int active;     /* number of active pages */
                    168:        int inactive;   /* number of pages that we free'd but may want back */
1.3       chs       169:        int paging;     /* number of pages in the process of being paged out */
1.1       mrg       170:        int wired;      /* number of wired pages */
1.3       chs       171:        int reserve_pagedaemon; /* number of pages reserved for pagedaemon */
                    172:        int reserve_kernel; /* number of pages reserved for kernel */
1.1       mrg       173:
1.9       mrg       174:        /* pageout params */
                    175:        int freemin;    /* min number of free pages */
                    176:        int freetarg;   /* target number of free pages */
                    177:        int inactarg;   /* target number of inactive pages */
                    178:        int wiredmax;   /* max number of wired pages */
1.1       mrg       179:
1.9       mrg       180:        /* swap */
1.1       mrg       181:        int nswapdev;   /* number of configured swap devices in system */
                    182:        int swpages;    /* number of PAGE_SIZE'ed swap pages */
1.3       chs       183:        int swpginuse;  /* number of swap pages in use */
1.1       mrg       184:        int nswget;     /* number of times fault calls uvm_swap_get() */
                    185:        int nanon;      /* number total of anon's in system */
                    186:        int nfreeanon;  /* number of free anon's */
                    187:
1.9       mrg       188:        /* stat counters */
1.7       mrg       189:        int faults;             /* page fault count */
                    190:        int traps;              /* trap count */
                    191:        int intrs;              /* interrupt count */
                    192:        int swtch;              /* context switch count */
                    193:        int softs;              /* software interrupt count */
                    194:        int syscalls;           /* system calls */
                    195:        int pageins;            /* pagein operation count */
                    196:                                /* pageouts are in pdpageouts below */
                    197:        int swapins;            /* swapins */
                    198:        int swapouts;           /* swapouts */
                    199:        int pgswapin;           /* pages swapped in */
                    200:        int pgswapout;          /* pages swapped out */
                    201:        int forks;              /* forks */
1.1       mrg       202:        int forks_ppwait;       /* forks where parent waits */
                    203:        int forks_sharevm;      /* forks where vmspace is shared */
                    204:
1.9       mrg       205:        /* fault subcounters */
1.1       mrg       206:        int fltnoram;   /* number of times fault was out of ram */
                    207:        int fltnoanon;  /* number of times fault was out of anons */
                    208:        int fltpgwait;  /* number of times fault had to wait on a page */
                    209:        int fltpgrele;  /* number of times fault found a released page */
                    210:        int fltrelck;   /* number of times fault relock called */
                    211:        int fltrelckok; /* number of times fault relock is a success */
                    212:        int fltanget;   /* number of times fault gets anon page */
                    213:        int fltanretry; /* number of times fault retrys an anon get */
                    214:        int fltamcopy;  /* number of times fault clears "needs copy" */
                    215:        int fltnamap;   /* number of times fault maps a neighbor anon page */
                    216:        int fltnomap;   /* number of times fault maps a neighbor obj page */
                    217:        int fltlget;    /* number of times fault does a locked pgo_get */
                    218:        int fltget;     /* number of times fault does an unlocked get */
                    219:        int flt_anon;   /* number of times fault anon (case 1a) */
                    220:        int flt_acow;   /* number of times fault anon cow (case 1b) */
                    221:        int flt_obj;    /* number of times fault is on object page (2a) */
                    222:        int flt_prcopy; /* number of times fault promotes with copy (2b) */
                    223:        int flt_przero; /* number of times fault promotes with zerofill (2b) */
                    224:
1.9       mrg       225:        /* daemon counters */
1.1       mrg       226:        int pdwoke;     /* number of times daemon woke up */
                    227:        int pdrevs;     /* number of times daemon rev'd clock hand */
                    228:        int pdswout;    /* number of times daemon called for swapout */
                    229:        int pdfreed;    /* number of pages daemon freed since boot */
                    230:        int pdscans;    /* number of pages daemon scaned since boot */
                    231:        int pdanscan;   /* number of anonymous pages scanned by daemon */
                    232:        int pdobscan;   /* number of object pages scanned by daemon */
                    233:        int pdreact;    /* number of pages daemon reactivated since boot */
                    234:        int pdbusy;     /* number of times daemon found a busy page */
                    235:        int pdpageouts; /* number of times daemon started a pageout */
                    236:        int pdpending;  /* number of times daemon got a pending pagout */
                    237:        int pddeact;    /* number of pages daemon deactivates */
                    238:
1.9       mrg       239:        /* kernel memory objects: managed by uvm_km_kmemalloc() only! */
1.1       mrg       240:        struct uvm_object *kmem_object;
                    241:        struct uvm_object *mb_object;
                    242: };
                    243:
                    244:
                    245: extern struct uvmexp uvmexp;
                    246:
                    247: /*
                    248:  * macros
                    249:  */
                    250:
                    251: /* zalloc zeros memory, alloc does not */
                    252: #define uvm_km_zalloc(MAP,SIZE) uvm_km_alloc1(MAP,SIZE,TRUE)
                    253: #define uvm_km_alloc(MAP,SIZE)  uvm_km_alloc1(MAP,SIZE,FALSE)
                    254:
                    255: /*
                    256:  * typedefs
                    257:  */
                    258:
                    259: typedef unsigned int  uvm_flag_t;
                    260: typedef int vm_fault_t;
                    261:
                    262: /* uvm_aobj.c */
1.19    ! eeh       263: struct uvm_object      *uao_create __P((vsize_t, int));
1.1       mrg       264: void                   uao_detach __P((struct uvm_object *));
                    265: void                   uao_reference __P((struct uvm_object *));
                    266:
                    267: /* uvm_fault.c */
1.19    ! eeh       268: int                    uvm_fault __P((vm_map_t, vaddr_t,
1.9       mrg       269:                                vm_fault_t, vm_prot_t));
1.1       mrg       270:                                /* handle a page fault */
                    271:
                    272: /* uvm_glue.c */
                    273: #if defined(KGDB)
1.13      kleink    274: void                   uvm_chgkprot __P((caddr_t, size_t, int));
1.1       mrg       275: #endif
                    276: void                   uvm_fork __P((struct proc *, struct proc *, boolean_t));
                    277: void                   uvm_init_limits __P((struct proc *));
1.13      kleink    278: boolean_t              uvm_kernacc __P((caddr_t, size_t, int));
1.11      mycroft   279: __dead void            uvm_scheduler __P((void)) __attribute__((noreturn));
1.1       mrg       280: void                   uvm_swapin __P((struct proc *));
1.13      kleink    281: boolean_t              uvm_useracc __P((caddr_t, size_t, int));
                    282: void                   uvm_vslock __P((struct proc *, caddr_t, size_t));
                    283: void                   uvm_vsunlock __P((struct proc *, caddr_t, size_t));
1.1       mrg       284:
                    285:
                    286: /* uvm_init.c */
                    287: void                   uvm_init __P((void));
                    288:                                /* init the uvm system */
                    289:
                    290: /* uvm_io.c */
                    291: int                    uvm_io __P((vm_map_t, struct uio *));
                    292:
                    293: /* uvm_km.c */
1.19    ! eeh       294: vaddr_t                        uvm_km_alloc1 __P((vm_map_t, vsize_t, boolean_t));
        !           295: void                   uvm_km_free __P((vm_map_t, vaddr_t, vsize_t));
        !           296: void                   uvm_km_free_wakeup __P((vm_map_t, vaddr_t,
        !           297:                                                vsize_t));
        !           298: vaddr_t                        uvm_km_kmemalloc __P((vm_map_t, struct uvm_object *,
        !           299:                                                vsize_t, int));
        !           300: struct vm_map          *uvm_km_suballoc __P((vm_map_t, vaddr_t *,
        !           301:                                vaddr_t *, vsize_t, boolean_t,
1.6       thorpej   302:                                boolean_t, vm_map_t));
1.19    ! eeh       303: vaddr_t                        uvm_km_valloc __P((vm_map_t, vsize_t));
        !           304: vaddr_t                        uvm_km_valloc_wait __P((vm_map_t, vsize_t));
        !           305: vaddr_t                        uvm_km_alloc_poolpage1 __P((vm_map_t,
1.18      thorpej   306:                                struct uvm_object *));
1.19    ! eeh       307: void                   uvm_km_free_poolpage1 __P((vm_map_t, vaddr_t));
1.1       mrg       308:
1.18      thorpej   309: #define        uvm_km_alloc_poolpage()         uvm_km_alloc_poolpage1(kmem_map, \
                    310:                                                uvmexp.kmem_object)
1.17      thorpej   311: #define        uvm_km_free_poolpage(addr)      uvm_km_free_poolpage1(kmem_map, (addr))
1.1       mrg       312:
                    313: /* uvm_map.c */
1.19    ! eeh       314: int                    uvm_map __P((vm_map_t, vaddr_t *, vsize_t,
        !           315:                                struct uvm_object *, vaddr_t, uvm_flag_t));
        !           316: int                    uvm_map_pageable __P((vm_map_t, vaddr_t,
        !           317:                                vaddr_t, boolean_t));
        !           318: boolean_t              uvm_map_checkprot __P((vm_map_t, vaddr_t,
        !           319:                                vaddr_t, vm_prot_t));
        !           320: int                    uvm_map_protect __P((vm_map_t, vaddr_t,
        !           321:                                vaddr_t, vm_prot_t, boolean_t));
        !           322: struct vmspace         *uvmspace_alloc __P((vaddr_t, vaddr_t,
1.10      thorpej   323:                                boolean_t));
                    324: void                   uvmspace_init __P((struct vmspace *, struct pmap *,
1.19    ! eeh       325:                                vaddr_t, vaddr_t, boolean_t));
1.1       mrg       326: void                   uvmspace_exec __P((struct proc *));
                    327: struct vmspace         *uvmspace_fork __P((struct vmspace *));
                    328: void                   uvmspace_free __P((struct vmspace *));
                    329: void                   uvmspace_share __P((struct proc *, struct proc *));
                    330: void                   uvmspace_unshare __P((struct proc *));
                    331:
                    332:
                    333: /* uvm_meter.c */
                    334: void                   uvm_meter __P((void));
                    335: int                    uvm_sysctl __P((int *, u_int, void *, size_t *,
                    336:                                void *, size_t, struct proc *));
                    337:
                    338: /* uvm_mmap.c */
1.19    ! eeh       339: int                    uvm_mmap __P((vm_map_t, vaddr_t *, vsize_t,
1.1       mrg       340:                                vm_prot_t, vm_prot_t, int,
1.19    ! eeh       341:                                caddr_t, vaddr_t));
1.1       mrg       342:
                    343: /* uvm_page.c */
1.15      thorpej   344: struct vm_page         *uvm_pagealloc_strat __P((struct uvm_object *,
1.19    ! eeh       345:                                vaddr_t, struct vm_anon *, int, int));
1.15      thorpej   346: #define        uvm_pagealloc(obj, off, anon) \
                    347:            uvm_pagealloc_strat((obj), (off), (anon), UVM_PGA_STRAT_NORMAL, 0)
1.1       mrg       348: void                   uvm_pagerealloc __P((struct vm_page *,
1.19    ! eeh       349:                                             struct uvm_object *, vaddr_t));
        !           350: /* Actually, uvm_page_physload takes PF#s which need their own type */
        !           351: void                   uvm_page_physload __P((vaddr_t, vaddr_t,
        !           352:                                               vaddr_t, vaddr_t, int));
1.1       mrg       353: void                   uvm_setpagesize __P((void));
                    354:
                    355: /* uvm_pdaemon.c */
                    356: void                   uvm_pageout __P((void));
                    357:
                    358: /* uvm_pglist.c */
1.19    ! eeh       359: int                    uvm_pglistalloc __P((psize_t, paddr_t,
        !           360:                                paddr_t, paddr_t, paddr_t,
1.1       mrg       361:                                struct pglist *, int, int));
                    362: void                   uvm_pglistfree __P((struct pglist *));
                    363:
                    364: /* uvm_swap.c */
                    365: void                   uvm_swap_init __P((void));
                    366:
                    367: /* uvm_unix.c */
                    368: int                    uvm_coredump __P((struct proc *, struct vnode *,
                    369:                                struct ucred *, struct core *));
1.19    ! eeh       370: int                    uvm_grow __P((struct proc *, vaddr_t));
1.1       mrg       371:
                    372: /* uvm_user.c */
1.19    ! eeh       373: int                    uvm_deallocate __P((vm_map_t, vaddr_t, vsize_t));
1.1       mrg       374:
                    375: /* uvm_vnode.c */
                    376: void                   uvm_vnp_setsize __P((struct vnode *, u_quad_t));
                    377: void                   uvm_vnp_sync __P((struct mount *));
                    378: void                   uvm_vnp_terminate __P((struct vnode *));
                    379:                                /* terminate a uvm/uvn object */
                    380: boolean_t              uvm_vnp_uncache __P((struct vnode *));
                    381: struct uvm_object      *uvn_attach __P((void *, vm_prot_t));
                    382:
1.8       perry     383: #endif /* _UVM_UVM_EXTERN_H_ */
1.19    ! eeh       384:

CVSweb <webmaster@jp.NetBSD.org>