1 /* $OpenBSD: uvm_object.h,v 1.23 2019/11/29 22:10:04 beck Exp $ */ 2 /* $NetBSD: uvm_object.h,v 1.11 2001/03/09 01:02:12 chs Exp $ */ 3 4 /* 5 * Copyright (c) 1997 Charles D. Cranor and Washington University. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * from: Id: uvm_object.h,v 1.1.2.2 1998/01/04 22:44:51 chuck Exp 29 */ 30 31 #ifndef _UVM_UVM_OBJECT_H_ 32 #define _UVM_UVM_OBJECT_H_ 33 34 /* 35 * uvm_object.h 36 */ 37 38 /* 39 * uvm_object: all that is left of mach objects. 40 */ 41 42 struct uvm_object { 43 struct uvm_pagerops *pgops; /* pager ops */ 44 RBT_HEAD(uvm_objtree, vm_page) memt; /* pages in object */ 45 int uo_npages; /* # of pages in memt */ 46 int uo_refs; /* reference count */ 47 }; 48 49 /* 50 * UVM_OBJ_KERN is a 'special' uo_refs value which indicates that the 51 * object is a kernel memory object rather than a normal one (kernel 52 * memory objects don't have reference counts -- they never die). 53 * 54 * this value is used to detected kernel object mappings at uvm_unmap() 55 * time. normally when an object is unmapped its pages eventually become 56 * deactivated and then paged out and/or freed. this is not useful 57 * for kernel objects... when a kernel object is unmapped we always want 58 * to free the resources associated with the mapping. UVM_OBJ_KERN 59 * allows us to decide which type of unmapping we want to do. 60 * 61 * in addition, we have kernel objects which may be used in an 62 * interrupt context. these objects get their mappings entered 63 * with pmap_kenter*() and removed with pmap_kremove(), which 64 * are safe to call in interrupt context, and must be used ONLY 65 * for wired kernel mappings in these objects and their associated 66 * maps. 67 */ 68 #define UVM_OBJ_KERN (-2) 69 70 #define UVM_OBJ_IS_KERN_OBJECT(uobj) \ 71 ((uobj)->uo_refs == UVM_OBJ_KERN) 72 73 #ifdef _KERNEL 74 75 extern struct uvm_pagerops uvm_vnodeops; 76 extern struct uvm_pagerops uvm_deviceops; 77 78 /* For object trees */ 79 int uvm_pagecmp(const struct vm_page *, const struct vm_page *); 80 RBT_PROTOTYPE(uvm_objtree, vm_page, objt, uvm_pagecmp) 81 82 #define UVM_OBJ_IS_VNODE(uobj) \ 83 ((uobj)->pgops == &uvm_vnodeops) 84 85 #define UVM_OBJ_IS_DEVICE(uobj) \ 86 ((uobj)->pgops == &uvm_deviceops) 87 88 #define UVM_OBJ_IS_VTEXT(uobj) \ 89 ((uobj)->pgops == &uvm_vnodeops && \ 90 ((struct vnode *)uobj)->v_flag & VTEXT) 91 92 void uvm_objinit(struct uvm_object *, struct uvm_pagerops *, int); 93 int uvm_objwire(struct uvm_object *, voff_t, voff_t, struct pglist *); 94 void uvm_objunwire(struct uvm_object *, voff_t, voff_t); 95 void uvm_objfree(struct uvm_object *); 96 97 #endif /* _KERNEL */ 98 99 #endif /* _UVM_UVM_OBJECT_H_ */ 100