1 /* 2 * Copyright (c) 1985, Avadis Tevanian, Jr., Michael Wayne Young 3 * Copyright (c) 1987 Carnegie-Mellon University 4 * Copyright (c) 1991 Regents of the University of California. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * The Mach Operating System project at Carnegie-Mellon University. 9 * 10 * The CMU software License Agreement specifies the terms and conditions 11 * for use and redistribution. 12 * 13 * @(#)vm_object.h 7.1 (Berkeley) 12/05/90 14 */ 15 16 /* 17 * Virtual memory object module definitions. 18 */ 19 20 #ifndef _VM_OBJECT_ 21 #define _VM_OBJECT_ 22 23 #ifdef KERNEL 24 #include "types.h" 25 #include "lock.h" 26 #include "queue.h" 27 #include "../vm/vm_pager.h" 28 #else 29 #include <sys/types.h> 30 #include <sys/lock.h> 31 #include <sys/queue.h> 32 #include <vm/vm_pager.h> 33 #endif 34 35 /* 36 * Types defined: 37 * 38 * vm_object_t Virtual memory object. 39 */ 40 41 struct vm_object { 42 queue_chain_t memq; /* Resident memory */ 43 queue_chain_t object_list; /* list of all objects */ 44 simple_lock_data_t Lock; /* Synchronization */ 45 int LockHolder; 46 int ref_count; /* How many refs?? */ 47 vm_size_t size; /* Object size */ 48 int resident_page_count; 49 /* number of resident pages */ 50 struct vm_object *copy; /* Object that holds copies of 51 my changed pages */ 52 vm_pager_t pager; /* Where to get data */ 53 boolean_t pager_ready; /* Have pager fields been filled? */ 54 vm_offset_t paging_offset; /* Offset into paging space */ 55 struct vm_object *shadow; /* My shadow */ 56 vm_offset_t shadow_offset; /* Offset in shadow */ 57 unsigned int 58 paging_in_progress:16, 59 /* Paging (in or out) - don't 60 collapse or destroy */ 61 /* boolean_t */ can_persist:1, /* allow to persist */ 62 /* boolean_t */ internal:1; /* internally created object */ 63 queue_chain_t cached_list; /* for persistence */ 64 }; 65 66 typedef struct vm_object *vm_object_t; 67 68 struct vm_object_hash_entry { 69 queue_chain_t hash_links; /* hash chain links */ 70 vm_object_t object; /* object we represent */ 71 }; 72 73 typedef struct vm_object_hash_entry *vm_object_hash_entry_t; 74 75 #ifdef KERNEL 76 queue_head_t vm_object_cached_list; /* list of objects persisting */ 77 int vm_object_cached; /* size of cached list */ 78 simple_lock_data_t vm_cache_lock; /* lock for object cache */ 79 80 queue_head_t vm_object_list; /* list of allocated objects */ 81 long vm_object_count; /* count of all objects */ 82 simple_lock_data_t vm_object_list_lock; 83 /* lock for object list and count */ 84 85 vm_object_t kernel_object; /* the single kernel object */ 86 vm_object_t kmem_object; 87 88 #define vm_object_cache_lock() simple_lock(&vm_cache_lock) 89 #define vm_object_cache_unlock() simple_unlock(&vm_cache_lock) 90 #endif KERNEL 91 92 #define VM_OBJECT_NULL ((vm_object_t) 0) 93 94 /* 95 * Declare procedures that operate on VM objects. 96 */ 97 98 void vm_object_init (); 99 void vm_object_terminate(); 100 vm_object_t vm_object_allocate(); 101 void vm_object_reference(); 102 void vm_object_deallocate(); 103 void vm_object_pmap_copy(); 104 void vm_object_pmap_remove(); 105 void vm_object_page_remove(); 106 void vm_object_shadow(); 107 void vm_object_copy(); 108 void vm_object_collapse(); 109 vm_object_t vm_object_lookup(); 110 void vm_object_enter(); 111 void vm_object_setpager(); 112 #define vm_object_cache(pager) pager_cache(vm_object_lookup(pager),TRUE) 113 #define vm_object_uncache(pager) pager_cache(vm_object_lookup(pager),FALSE) 114 115 void vm_object_cache_clear(); 116 void vm_object_print(); 117 118 #if VM_OBJECT_DEBUG 119 #define vm_object_lock_init(object) { simple_lock_init(&(object)->Lock); (object)->LockHolder = 0; } 120 #define vm_object_lock(object) { simple_lock(&(object)->Lock); (object)->LockHolder = (int) current_thread(); } 121 #define vm_object_unlock(object) { (object)->LockHolder = 0; simple_unlock(&(object)->Lock); } 122 #define vm_object_lock_try(object) (simple_lock_try(&(object)->Lock) ? ( ((object)->LockHolder = (int) current_thread()) , TRUE) : FALSE) 123 #define vm_object_sleep(event, object, interruptible) \ 124 { (object)->LockHolder = 0; thread_sleep((event), &(object)->Lock, (interruptible)); } 125 #else VM_OBJECT_DEBUG 126 #define vm_object_lock_init(object) simple_lock_init(&(object)->Lock) 127 #define vm_object_lock(object) simple_lock(&(object)->Lock) 128 #define vm_object_unlock(object) simple_unlock(&(object)->Lock) 129 #define vm_object_lock_try(object) simple_lock_try(&(object)->Lock) 130 #define vm_object_sleep(event, object, interruptible) \ 131 thread_sleep((event), &(object)->Lock, (interruptible)) 132 #endif VM_OBJECT_DEBUG 133 134 #endif _VM_OBJECT_ 135