diff options
Diffstat (limited to 'libpager/pager.h')
-rw-r--r-- | libpager/pager.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/libpager/pager.h b/libpager/pager.h new file mode 100644 index 00000000..d3f1162c --- /dev/null +++ b/libpager/pager.h @@ -0,0 +1,195 @@ +/* Definitions for multi-threaded pager library + Copyright (C) 1994, 1995, 1996, 1997, 1999 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +#ifndef _HURD_PAGER_ +#define _HURD_PAGER_ + +#include <hurd/ports.h> + +/* This declaration exists to place struct user_pager_info in the proper + scope. */ +struct user_pager_info; + +/* This de-muxer function is for use within libports_demuxer. */ +/* INP is a message we've received; OUTP will be filled in with + a reply message. */ +int pager_demuxer (mach_msg_header_t *inp, + mach_msg_header_t *outp); + +/* Create a new pager. The pager will have a port created for it + (using libports, in BUCKET) and will be immediately ready + to receive requests. U_PAGER will be provided to later calls to + pager_find_address. The pager will have one user reference + created. MAY_CACHE and COPY_STRATEGY are the original values of + those attributes as for memory_object_ready. Users may create + references to pagers by use of the relevant ports library + functions. On errors, return null and set errno. */ +struct pager * +pager_create (struct user_pager_info *u_pager, + struct port_bucket *bucket, + boolean_t may_cache, + memory_object_copy_strategy_t copy_strategy); + +/* Return the user_pager_info struct associated with a pager. */ +struct user_pager_info * +pager_get_upi (struct pager *p); + +/* Sync data from pager PAGER to backing store; wait for + all the writes to complete iff WAIT is set. */ +void +pager_sync (struct pager *pager, + int wait); + +/* Sync some data (starting at START, for LEN bytes) from pager PAGER + to backing store. Wait for all the writes to complete iff WAIT is + set. */ +void +pager_sync_some (struct pager *pager, + vm_address_t start, + vm_size_t len, + int wait); + +/* Flush data from the kernel for pager PAGER and force any pending + delayed copies. Wait for all pages to be flushed iff WAIT is set. */ +void +pager_flush (struct pager *pager, + int wait); + + +/* Flush some data (starting at START, for LEN bytes) for pager PAGER + from the kernel. Wait for all pages to be flushed iff WAIT is set. */ +void +pager_flush_some (struct pager *pager, + vm_address_t start, + vm_size_t len, + int wait); + +/* Flush data from the kernel for pager PAGER and force any pending + delayed copies. Wait for all pages to be flushed iff WAIT is set. + Have the kernel write back modifications. */ +void +pager_return (struct pager *pager, + int wait); + + +/* Flush some data (starting at START, for LEN bytes) for pager PAGER + from the kernel. Wait for all pages to be flushed iff WAIT is set. + Have the kernel write back modifications. */ +void +pager_return_some (struct pager *pager, + vm_address_t start, + vm_size_t len, + int wait); + +/* Offer a page of data to the kernel. If PRECIOUS is set, then this + page will be paged out at some future point, otherwise it might be + dropped by the kernel. If the page is currently in core, the + kernel might ignore this call. */ +void +pager_offer_page (struct pager *pager, + int precious, + int writelock, + vm_offset_t page, + vm_address_t buf); + +/* Change the attributes of the memory object underlying pager PAGER. + Args MAY_CACHE and COPY_STRATEGY are as for + memory_object_change_atributes. Wait for the kernel to report completion + off WAIT is set.*/ +void +pager_change_attributes (struct pager *pager, + boolean_t may_cache, + memory_object_copy_strategy_t copy_strategy, + int wait); + +/* Return the port (receive right) for requests to the pager. It is + absolutely necessary that a new send right be created from this + receive right. */ +mach_port_t +pager_get_port (struct pager *pager); + +/* Force termination of a pager. After this returns, no + more paging requests on the pager will be honored, and the + pager will be deallocated. (The actual deallocation might + occur asynchronously if there are currently outstanding paging + requests that will complete first.) */ +void +pager_shutdown (struct pager *pager); + +/* Return the error code of the last page error for pager P at address ADDR; + this will be deleted when the kernel interface is fixed. */ +error_t +pager_get_error (struct pager *p, vm_address_t addr); + +/* Try to copy *SIZE bytes between the region OTHER points to + and the region at OFFSET in the pager indicated by PAGER and MEMOBJ. + If PROT is VM_PROT_READ, copying is from the pager to OTHER; + if PROT contains VM_PROT_WRITE, copying is from OTHER into the pager. + *SIZE is always filled in the actual number of bytes successfully copied. + Returns an error code if the pager-backed memory faults; + if there is no fault, returns 0 and *SIZE will be unchanged. */ +error_t +pager_memcpy (struct pager *pager, memory_object_t memobj, + vm_offset_t offset, void *other, size_t *size, + vm_prot_t prot); + +/* The user must define this function. For pager PAGER, read one + page from offset PAGE. Set *BUF to be the address of the page, + and set *WRITE_LOCK if the page must be provided read-only. + The only permissable error returns are EIO, EDQUOT, and ENOSPC. */ +error_t +pager_read_page (struct user_pager_info *pager, + vm_offset_t page, + vm_address_t *buf, + int *write_lock); + +/* The user must define this function. For pager PAGER, synchronously + write one page from BUF to offset PAGE. In addition, mfree + (or equivalent) BUF. The only permissable error returns are EIO, + EDQUOT, and ENOSPC. */ +error_t +pager_write_page (struct user_pager_info *pager, + vm_offset_t page, + vm_address_t buf); + +/* The user must define this function. A page should be made writable. */ +error_t +pager_unlock_page (struct user_pager_info *pager, + vm_offset_t address); + +/* The user must define this function. It should report back (in + *OFFSET and *SIZE the minimum valid address the pager will accept + and the size of the object. */ +error_t +pager_report_extent (struct user_pager_info *pager, + vm_address_t *offset, + vm_size_t *size); + +/* The user must define this function. This is called when a pager is + being deallocated after all extant send rights have been destroyed. */ +void +pager_clear_user_data (struct user_pager_info *pager); + +/* The use must define this function. This will be called when the ports + library wants to drop weak references. The pager library creates no + weak references itself. If the user doesn't either, then it's OK for + this function to do nothing. */ +void +pager_dropweak (struct user_pager_info *p); + +#endif |