[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.11

1.11    ! mycroft     1: /*     $NetBSD: uvm_extern.h,v 1.10 1998/03/27 01:47:06 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 */
                    119: #define UVM_UNKNOWN_OFFSET ((vm_offset_t) -1)
                    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: /*
                    131:  * structures
                    132:  */
                    133:
                    134: struct core;
                    135: struct mount;
                    136: struct pglist;
                    137: struct proc;
                    138: struct ucred;
                    139: struct uio;
                    140: struct uvm_object;
                    141: struct vm_anon;
                    142: struct vmspace;
1.10      thorpej   143: struct pmap;
1.1       mrg       144: struct vnode;
                    145:
                    146: /*
                    147:  * uvmexp: global data structures that are exported to parts of the kernel
                    148:  * other than the vm system.
                    149:  */
                    150:
                    151: struct uvmexp {
1.9       mrg       152:        /* vm_page constants */
1.1       mrg       153:        int pagesize;   /* size of a page (PAGE_SIZE): must be power of 2 */
                    154:        int pagemask;   /* page mask */
                    155:        int pageshift;  /* page shift */
                    156:
1.9       mrg       157:        /* vm_page counters */
1.1       mrg       158:        int npages;     /* number of pages we manage */
                    159:        int free;       /* number of free pages */
                    160:        int active;     /* number of active pages */
                    161:        int inactive;   /* number of pages that we free'd but may want back */
1.3       chs       162:        int paging;     /* number of pages in the process of being paged out */
1.1       mrg       163:        int wired;      /* number of wired pages */
1.3       chs       164:        int reserve_pagedaemon; /* number of pages reserved for pagedaemon */
                    165:        int reserve_kernel; /* number of pages reserved for kernel */
1.1       mrg       166:
1.9       mrg       167:        /* pageout params */
                    168:        int freemin;    /* min number of free pages */
                    169:        int freetarg;   /* target number of free pages */
                    170:        int inactarg;   /* target number of inactive pages */
                    171:        int wiredmax;   /* max number of wired pages */
1.1       mrg       172:
1.9       mrg       173:        /* swap */
1.1       mrg       174:        int nswapdev;   /* number of configured swap devices in system */
                    175:        int swpages;    /* number of PAGE_SIZE'ed swap pages */
1.3       chs       176:        int swpginuse;  /* number of swap pages in use */
1.1       mrg       177:        int nswget;     /* number of times fault calls uvm_swap_get() */
                    178:        int nanon;      /* number total of anon's in system */
                    179:        int nfreeanon;  /* number of free anon's */
                    180:
1.9       mrg       181:        /* stat counters */
1.7       mrg       182:        int faults;             /* page fault count */
                    183:        int traps;              /* trap count */
                    184:        int intrs;              /* interrupt count */
                    185:        int swtch;              /* context switch count */
                    186:        int softs;              /* software interrupt count */
                    187:        int syscalls;           /* system calls */
                    188:        int pageins;            /* pagein operation count */
                    189:                                /* pageouts are in pdpageouts below */
                    190:        int swapins;            /* swapins */
                    191:        int swapouts;           /* swapouts */
                    192:        int pgswapin;           /* pages swapped in */
                    193:        int pgswapout;          /* pages swapped out */
                    194:        int forks;              /* forks */
1.1       mrg       195:        int forks_ppwait;       /* forks where parent waits */
                    196:        int forks_sharevm;      /* forks where vmspace is shared */
                    197:
1.9       mrg       198:        /* fault subcounters */
1.1       mrg       199:        int fltnoram;   /* number of times fault was out of ram */
                    200:        int fltnoanon;  /* number of times fault was out of anons */
                    201:        int fltpgwait;  /* number of times fault had to wait on a page */
                    202:        int fltpgrele;  /* number of times fault found a released page */
                    203:        int fltrelck;   /* number of times fault relock called */
                    204:        int fltrelckok; /* number of times fault relock is a success */
                    205:        int fltanget;   /* number of times fault gets anon page */
                    206:        int fltanretry; /* number of times fault retrys an anon get */
                    207:        int fltamcopy;  /* number of times fault clears "needs copy" */
                    208:        int fltnamap;   /* number of times fault maps a neighbor anon page */
                    209:        int fltnomap;   /* number of times fault maps a neighbor obj page */
                    210:        int fltlget;    /* number of times fault does a locked pgo_get */
                    211:        int fltget;     /* number of times fault does an unlocked get */
                    212:        int flt_anon;   /* number of times fault anon (case 1a) */
                    213:        int flt_acow;   /* number of times fault anon cow (case 1b) */
                    214:        int flt_obj;    /* number of times fault is on object page (2a) */
                    215:        int flt_prcopy; /* number of times fault promotes with copy (2b) */
                    216:        int flt_przero; /* number of times fault promotes with zerofill (2b) */
                    217:
1.9       mrg       218:        /* daemon counters */
1.1       mrg       219:        int pdwoke;     /* number of times daemon woke up */
                    220:        int pdrevs;     /* number of times daemon rev'd clock hand */
                    221:        int pdswout;    /* number of times daemon called for swapout */
                    222:        int pdfreed;    /* number of pages daemon freed since boot */
                    223:        int pdscans;    /* number of pages daemon scaned since boot */
                    224:        int pdanscan;   /* number of anonymous pages scanned by daemon */
                    225:        int pdobscan;   /* number of object pages scanned by daemon */
                    226:        int pdreact;    /* number of pages daemon reactivated since boot */
                    227:        int pdbusy;     /* number of times daemon found a busy page */
                    228:        int pdpageouts; /* number of times daemon started a pageout */
                    229:        int pdpending;  /* number of times daemon got a pending pagout */
                    230:        int pddeact;    /* number of pages daemon deactivates */
                    231:
1.9       mrg       232:        /* kernel memory objects: managed by uvm_km_kmemalloc() only! */
1.1       mrg       233:        struct uvm_object *kmem_object;
                    234:        struct uvm_object *mb_object;
                    235: };
                    236:
                    237:
                    238: extern struct uvmexp uvmexp;
                    239:
                    240: /*
                    241:  * macros
                    242:  */
                    243:
                    244: /* zalloc zeros memory, alloc does not */
                    245: #define uvm_km_zalloc(MAP,SIZE) uvm_km_alloc1(MAP,SIZE,TRUE)
                    246: #define uvm_km_alloc(MAP,SIZE)  uvm_km_alloc1(MAP,SIZE,FALSE)
                    247:
                    248: /*
                    249:  * typedefs
                    250:  */
                    251:
                    252: typedef unsigned int  uvm_flag_t;
                    253: typedef int vm_fault_t;
                    254:
                    255: /* uvm_aobj.c */
                    256: struct uvm_object      *uao_create __P((vm_size_t, int));
                    257: void                   uao_detach __P((struct uvm_object *));
                    258: void                   uao_reference __P((struct uvm_object *));
                    259:
                    260: /* uvm_fault.c */
                    261: int                    uvm_fault __P((vm_map_t, vm_offset_t,
1.9       mrg       262:                                vm_fault_t, vm_prot_t));
1.1       mrg       263:                                /* handle a page fault */
                    264:
                    265: /* uvm_glue.c */
                    266: #if defined(KGDB)
                    267: void                   uvm_chgkprot __P((caddr_t, int, int));
                    268: #endif
                    269: void                   uvm_fork __P((struct proc *, struct proc *, boolean_t));
                    270: void                   uvm_init_limits __P((struct proc *));
                    271: boolean_t              uvm_kernacc __P((caddr_t, int, int));
1.11    ! mycroft   272: __dead void            uvm_scheduler __P((void)) __attribute__((noreturn));
1.1       mrg       273: void                   uvm_swapin __P((struct proc *));
                    274: boolean_t              uvm_useracc __P((caddr_t, int, int));
                    275: void                   uvm_vslock __P((caddr_t, u_int));
                    276: void                   uvm_vsunlock __P((caddr_t, u_int));
                    277:
                    278:
                    279: /* uvm_init.c */
                    280: void                   uvm_init __P((void));
                    281:                                /* init the uvm system */
                    282:
                    283: /* uvm_io.c */
                    284: int                    uvm_io __P((vm_map_t, struct uio *));
                    285:
                    286: /* uvm_km.c */
                    287: vm_offset_t            uvm_km_alloc1 __P((vm_map_t, vm_size_t, boolean_t));
                    288: void                   uvm_km_free __P((vm_map_t, vm_offset_t, vm_size_t));
                    289: void                   uvm_km_free_wakeup __P((vm_map_t, vm_offset_t,
                    290:                                                vm_size_t));
                    291: vm_offset_t            uvm_km_kmemalloc __P((vm_map_t, struct uvm_object *,
                    292:                                                vm_size_t, int));
                    293: struct vm_map          *uvm_km_suballoc __P((vm_map_t, vm_offset_t *,
                    294:                                vm_offset_t *, vm_size_t, boolean_t,
1.6       thorpej   295:                                boolean_t, vm_map_t));
1.1       mrg       296: vm_offset_t            uvm_km_valloc __P((vm_map_t, vm_size_t));
                    297: vm_offset_t            uvm_km_valloc_wait __P((vm_map_t, vm_size_t));
                    298:
                    299:
                    300: /* uvm_map.c */
                    301: int                    uvm_map __P((vm_map_t, vm_offset_t *, vm_size_t,
                    302:                                struct uvm_object *, vm_offset_t, uvm_flag_t));
                    303: int                    uvm_map_pageable __P((vm_map_t, vm_offset_t,
                    304:                                vm_offset_t, boolean_t));
1.3       chs       305: boolean_t              uvm_map_checkprot __P((vm_map_t, vm_offset_t,
                    306:                                vm_offset_t, vm_prot_t));
1.1       mrg       307: #if defined(DDB)
                    308: void                   uvm_map_print __P((vm_map_t, boolean_t));
                    309: void                   uvm_map_printit __P((vm_map_t, boolean_t,
                    310:                                void (*) __P((const char *, ...))));
                    311: #endif
                    312: int                    uvm_map_protect __P((vm_map_t, vm_offset_t,
                    313:                                vm_offset_t, vm_prot_t, boolean_t));
                    314: #if defined(DDB)
                    315: void                   uvm_object_print __P((struct uvm_object *, boolean_t));
                    316: void                   uvm_object_printit __P((struct uvm_object *, boolean_t,
                    317:                                void (*) __P((const char *, ...))));
                    318: void                   uvm_page_print __P((struct vm_page *, boolean_t));
                    319: void                   uvm_page_printit __P((struct vm_page *, boolean_t,
                    320:                                void (*) __P((const char *, ...))));
                    321: #endif
1.10      thorpej   322: struct vmspace         *uvmspace_alloc __P((vm_offset_t, vm_offset_t,
                    323:                                boolean_t));
                    324: void                   uvmspace_init __P((struct vmspace *, struct pmap *,
                    325:                                vm_offset_t, vm_offset_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 */
                    339: int                    uvm_mmap __P((vm_map_t, vm_offset_t *, vm_size_t,
                    340:                                vm_prot_t, vm_prot_t, int,
                    341:                                caddr_t, vm_offset_t));
                    342:
                    343: /* uvm_page.c */
                    344: struct vm_page         *uvm_pagealloc __P((struct uvm_object *, vm_offset_t,
                    345:                                            struct vm_anon *));
                    346: void                   uvm_pagerealloc __P((struct vm_page *,
                    347:                                             struct uvm_object *, vm_offset_t));
                    348: void                   uvm_page_physload __P((vm_offset_t, vm_offset_t,
                    349:                                               vm_offset_t, vm_offset_t));
                    350: void                   uvm_setpagesize __P((void));
                    351:
                    352: /* uvm_pdaemon.c */
                    353: void                   uvm_pageout __P((void));
                    354:
                    355: /* uvm_pglist.c */
                    356: int                    uvm_pglistalloc __P((vm_size_t, vm_offset_t,
                    357:                                vm_offset_t, vm_offset_t, vm_offset_t,
                    358:                                struct pglist *, int, int));
                    359: void                   uvm_pglistfree __P((struct pglist *));
                    360:
                    361: /* uvm_swap.c */
                    362: void                   uvm_swap_init __P((void));
                    363:
                    364: /* uvm_unix.c */
                    365: int                    uvm_coredump __P((struct proc *, struct vnode *,
                    366:                                struct ucred *, struct core *));
                    367: int                    uvm_grow __P((struct proc *, vm_offset_t));
                    368:
                    369: /* uvm_user.c */
                    370: int                    uvm_deallocate __P((vm_map_t, vm_offset_t, vm_size_t));
                    371:
                    372: /* uvm_vnode.c */
                    373: void                   uvm_vnp_setsize __P((struct vnode *, u_quad_t));
                    374: void                   uvm_vnp_sync __P((struct mount *));
                    375: void                   uvm_vnp_terminate __P((struct vnode *));
                    376:                                /* terminate a uvm/uvn object */
                    377: boolean_t              uvm_vnp_uncache __P((struct vnode *));
                    378: struct uvm_object      *uvn_attach __P((void *, vm_prot_t));
                    379:
1.8       perry     380: #endif /* _UVM_UVM_EXTERN_H_ */

CVSweb <webmaster@jp.NetBSD.org>