| 1 | /* |
| 2 | * Copyright (c) 1990 University of Utah. |
| 3 | * Copyright (c) 1991 The Regents of the University of California. |
| 4 | * All rights reserved. |
| 5 | * |
| 6 | * This code is derived from software contributed to Berkeley by |
| 7 | * the Systems Programming Group of the University of Utah Computer |
| 8 | * Science Department. |
| 9 | * |
| 10 | * %sccs.include.redist.c% |
| 11 | * |
| 12 | * @(#)vm_pager.h 7.2 (Berkeley) %G% |
| 13 | */ |
| 14 | |
| 15 | /* |
| 16 | * Pager routine interface definition. |
| 17 | * For BSD we use a cleaner version of the internal pager interface. |
| 18 | */ |
| 19 | |
| 20 | #ifndef _VM_PAGER_ |
| 21 | #define _VM_PAGER_ |
| 22 | |
| 23 | struct pager_struct { |
| 24 | queue_head_t pg_list; /* links for list management */ |
| 25 | caddr_t pg_handle; /* external handle (vp, dev, fp) */ |
| 26 | int pg_type; /* type of pager */ |
| 27 | struct pagerops *pg_ops; /* pager operations */ |
| 28 | caddr_t pg_data; /* private pager data */ |
| 29 | }; |
| 30 | typedef struct pager_struct *vm_pager_t; |
| 31 | |
| 32 | /* pager types */ |
| 33 | #define PG_DFLT -1 |
| 34 | #define PG_SWAP 0 |
| 35 | #define PG_VNODE 1 |
| 36 | #define PG_DEVICE 2 |
| 37 | |
| 38 | struct pagerops { |
| 39 | void (*pgo_init)(); /* initialize pager */ |
| 40 | vm_pager_t (*pgo_alloc)(); /* allocate pager */ |
| 41 | void (*pgo_dealloc)(); /* disassociate */ |
| 42 | int (*pgo_getpage)(); /* get (read) page */ |
| 43 | int (*pgo_putpage)(); /* put (write) page */ |
| 44 | boolean_t (*pgo_haspage)(); /* does pager have page? */ |
| 45 | }; |
| 46 | |
| 47 | /* |
| 48 | * get/put return values |
| 49 | * OK operation was successful |
| 50 | * BAD specified data was out of the accepted range |
| 51 | * FAIL specified data was in range, but doesn't exist |
| 52 | * PEND operations was initiated but not completed |
| 53 | */ |
| 54 | #define VM_PAGER_OK 0 |
| 55 | #define VM_PAGER_BAD 1 |
| 56 | #define VM_PAGER_FAIL 2 |
| 57 | #define VM_PAGER_PEND 3 |
| 58 | |
| 59 | #define VM_PAGER_ALLOC(h, s, p) (*(pg)->pg_ops->pgo_alloc)(h, s, p) |
| 60 | #define VM_PAGER_DEALLOC(pg) (*(pg)->pg_ops->pgo_dealloc)(pg) |
| 61 | #define VM_PAGER_GET(pg, m, s) (*(pg)->pg_ops->pgo_getpage)(pg, m, s) |
| 62 | #define VM_PAGER_PUT(pg, m, s) (*(pg)->pg_ops->pgo_putpage)(pg, m, s) |
| 63 | #define VM_PAGER_HASPAGE(pg, o) (*(pg)->pg_ops->pgo_haspage)(pg, o) |
| 64 | |
| 65 | #ifdef KERNEL |
| 66 | vm_pager_t vm_pager_allocate(); |
| 67 | void vm_pager_deallocate(); |
| 68 | int vm_pager_get(); |
| 69 | int vm_pager_put(); |
| 70 | boolean_t vm_pager_has_page(); |
| 71 | |
| 72 | vm_offset_t vm_pager_map_page(); |
| 73 | void vm_pager_unmap_page(); |
| 74 | vm_pager_t vm_pager_lookup(); |
| 75 | void vm_pager_sync(); |
| 76 | |
| 77 | extern struct pagerops *dfltpagerops; |
| 78 | #endif |
| 79 | |
| 80 | #endif /* _VM_PAGER_ */ |