aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_page.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_page.h')
-rw-r--r--sys/vm/vm_page.h106
1 files changed, 63 insertions, 43 deletions
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index 072c6a29ba70..33ada305990b 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)vm_page.h 7.3 (Berkeley) 4/21/91
- * $Id: vm_page.h,v 1.2 1993/10/16 16:20:46 rgrimes Exp $
+ * $Id: vm_page.h,v 1.8 1994/01/31 04:21:19 davidg Exp $
*/
/*
@@ -96,58 +96,53 @@
* queues (P).
*/
+#define PG_INACTIVE 0x0001
+#define PG_ACTIVE 0x0002
+#define PG_LAUNDRY 0x0004
+#define PG_CLEAN 0x0008
+#define PG_BUSY 0x0010
+#define PG_WANTED 0x0020
+#define PG_TABLED 0x0040
+#define PG_COPY_ON_WRITE 0x0080
+#define PG_FICTITIOUS 0x0100
+#define PG_ABSENT 0x0200
+#define PG_FAKE 0x0400
+#define PG_PAGEROWNED 0x0800
+#define PG_PTPAGE 0x1000
+
struct vm_page {
- queue_chain_t pageq; /* queue info for FIFO
- * queue or free list (P) */
+ queue_chain_t pageq; /* queue info for FIFO */
+ /* queue or free list (P) */
queue_chain_t hashq; /* hash table links (O)*/
queue_chain_t listq; /* all pages in same object (O)*/
vm_object_t object; /* which object am I in (O,P)*/
vm_offset_t offset; /* offset into that object (O,P) */
- unsigned int wire_count:16, /* how many wired down maps use me?
- (P) */
- /* boolean_t */ inactive:1, /* page is in inactive list (P) */
- active:1, /* page is in active list (P) */
- laundry:1, /* page is being cleaned now (P)*/
-#ifdef DEBUG
- pagerowned:1, /* async paging op in progress */
- ptpage:1, /* is a user page table page */
-#endif
- :0; /* (force to 'long' boundary) */
-#ifdef ns32000
- int pad; /* extra space for ns32000 bit ops */
-#endif ns32000
- boolean_t clean; /* page has not been modified */
- unsigned int
- /* boolean_t */ busy:1, /* page is in transit (O) */
- wanted:1, /* someone is waiting for page (O) */
- tabled:1, /* page is in VP table (O) */
- copy_on_write:1,/* page must be copied before being
- changed (O) */
- fictitious:1, /* physical page doesn't exist (O) */
- absent:1, /* virtual page doesn't exist (O) */
- fake:1, /* page is a placeholder for page-in
- (O) */
- :0;
+ unsigned int wire_count; /* how many wired down maps use me? */
+ unsigned short flags; /* bit encoded flags */
+ unsigned short deact; /* deactivation count */
vm_offset_t phys_addr; /* physical address of page */
- vm_prot_t page_lock; /* Uses prohibited by data manager */
- vm_prot_t unlock_request; /* Outstanding unlock request */
};
typedef struct vm_page *vm_page_t;
+#define DEACT_START 5
+#define DEACT_DELAY 2
+#define DEACT_CLEAN 1
+#define DEACT_FREE 0
+
#if VM_PAGE_DEBUG
#define VM_PAGE_CHECK(mem) { \
- if ( (((unsigned int) mem) < ((unsigned int) &vm_page_array[0])) || \
+ if ((((unsigned int) mem) < ((unsigned int) &vm_page_array[0])) || \
(((unsigned int) mem) > ((unsigned int) &vm_page_array[last_page-first_page])) || \
- (mem->active && mem->inactive) \
+ ((mem->flags & PG_ACTIVE) && (mem->flags & PG_INACTIVE)) \
) panic("vm_page_check: not valid!"); \
}
-#else VM_PAGE_DEBUG
+#else /* VM_PAGE_DEBUG */
#define VM_PAGE_CHECK(mem)
-#endif VM_PAGE_DEBUG
+#endif /* VM_PAGE_DEBUG */
#ifdef KERNEL
/*
@@ -223,7 +218,6 @@ simple_lock_data_t vm_page_queue_free_lock;
vm_offset_t vm_page_startup();
vm_page_t vm_page_lookup();
vm_page_t vm_page_alloc();
-void vm_page_init();
void vm_page_free();
void vm_page_activate();
void vm_page_deactivate();
@@ -236,21 +230,20 @@ void vm_page_copy();
void vm_page_wire();
void vm_page_unwire();
-void vm_set_page_size();
/*
* Functions implemented as macros
*/
#define PAGE_ASSERT_WAIT(m, interruptible) { \
- (m)->wanted = TRUE; \
+ (m)->flags |= PG_WANTED; \
assert_wait((int) (m), (interruptible)); \
}
#define PAGE_WAKEUP(m) { \
- (m)->busy = FALSE; \
- if ((m)->wanted) { \
- (m)->wanted = FALSE; \
+ (m)->flags &= ~PG_BUSY; \
+ if ((m)->flags & PG_WANTED) { \
+ (m)->flags &= ~PG_WANTED; \
thread_wakeup((int) (m)); \
} \
}
@@ -258,6 +251,33 @@ void vm_set_page_size();
#define vm_page_lock_queues() simple_lock(&vm_page_queue_lock)
#define vm_page_unlock_queues() simple_unlock(&vm_page_queue_lock)
-#define vm_page_set_modified(m) { (m)->clean = FALSE; }
-#endif KERNEL
-#endif _VM_PAGE_
+#define vm_page_set_modified(m) { (m)->flags &= ~PG_CLEAN; }
+
+/* Some pmap things are declared here for the convenience of other bits of
+ code. */
+extern void pmap_bootstrap(vm_offset_t, vm_offset_t);
+extern void pmap_init(vm_offset_t, vm_offset_t);
+extern vm_offset_t pmap_map(vm_offset_t, vm_offset_t, vm_offset_t, int);
+extern void pmap_remove_all(vm_offset_t);
+extern void pmap_copy_on_write(vm_offset_t);
+extern void pmap_page_protect(vm_offset_t, vm_prot_t);
+extern void pmap_update(void);
+extern void pmap_zero_page(vm_offset_t);
+extern void pmap_copy_page(vm_offset_t, vm_offset_t);
+extern void pmap_clear_modify(vm_offset_t);
+extern void pmap_clear_reference(vm_offset_t);
+extern boolean_t pmap_is_referenced(vm_offset_t);
+extern boolean_t pmap_is_modified(vm_offset_t);
+extern vm_offset_t pmap_phys_ddress(int);
+
+
+/*
+ * these macros are *MUCH* faster on a 386/486 type machine
+ * eventually they need to be implemented correctly and put
+ * somewhere in the machine dependant stuff.
+ */
+#define vm_disable_intr() (disable_intr(), 0)
+#define vm_set_intr(spl) enable_intr()
+
+#endif /* KERNEL */
+#endif /* _VM_PAGE_ */