BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / sys / mapmem.h
/*
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* the Systems Programming Group of the University of Utah Computer
* Science Department.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Utah $Hdr: mmap.h 1.4 89/08/14$
*
* @(#)mapmem.h 7.2 (Berkeley) 6/6/90
*/
/*
* Mapped memory descriptors.
*
* A process has one of these for every "mapped" memory region.
* Mapped memory is characterized by:
* - Corresponding physical memory is neither paged nor swapped.
* - User PTEs have both pg_v and pg_fod set.
* - Has no backing swap space unless mapped over existing data.
* - If mapped over existing data, original data is lost when
* segment is unmapped. (i.e. pages are reinitialized to ZFOD)
* Operations:
* (*mm_fork)(mp, ischild) struct mapmem *mp; int ischild;
* Called during fork in both parent and child. Parent
* call can be used for maintaining reference counts and
* should NEVER destroy the region. Child call should be
* used for unmapping regions not inherited across forks.
* (*mm_vfork)(mp, fup, tup) struct mapmem *mp; struct user *fup, *tup;
* Called twice during vfork (always in parent context)
* after exchanging resources (including u_mmap chains).
* `fup' is the donor and `tup' the recipient of the
* "parent" (full) context. Needed for maintaining
* reference counts or if the underlying object contains
* references to owning process. Routine should NEVER
* destroy the region.
* (*mm_exec)(mp) struct mapmem *mp;
* Called during exec before releasing old address space.
* Used for graceful cleanup of underlying object. Resources
* will be freed regardless of what this routine does.
* Need to add a post-exec call to re-establish mappings
* in the new address space for regions inherited across execs.
* (*mm_exit)(mp) struct mapmem *mp;
* Called during exit just before releasing address space.
* Used for graceful cleanup of underlying object. Resources
* will be freed regardless of what this routine does.
* The default semantics for a region with routine addresses of zero are
* that it is inherited across forks, stays with the "active" process during
* vforks, and is destroyed by execs and exit.
*/
struct mapmem {
struct mapmem *mm_next; /* next descriptor */
int mm_id; /* identifier (e.g. fd, shmid) */
caddr_t mm_uva; /* user VA at which region is mapped */
int mm_size; /* size of mapped region */
int mm_prot; /* attributes of region */
struct mapmemops { /* operations */
int (*mm_fork)();
int (*mm_vfork)();
int (*mm_exec)();
int (*mm_exit)();
} *mm_ops;
};
#define MMNIL ((struct mapmem *)0)
/* attributes */
#define MM_RW 0x00 /* region is read-write */
#define MM_RO 0x01 /* region is read-only */
#define MM_CI 0x02 /* caching is inhibited on region */
#define MM_NOCORE 0x04 /* cannot write region to core file;
e.g. mapped framebuffer hardware */
#ifdef KERNEL
#define MMALLOC(mp) \
(mp) = (struct mapmem *)malloc((u_long)sizeof(struct mapmem), \
M_MAPMEM, M_WAITOK)
#define MMFREE(mp) \
free((caddr_t)(mp), M_MAPMEM)
#endif