/* @(#)seg.h 1.1 92/07/30 SMI */ /* * Copyright (c) 1988 by Sun Microsystems, Inc. */ #ifndef _vm_seg_h #define _vm_seg_h #include #include /* * VM - Segments. */ /* * An address space contains a set of segments, managed by drivers. * Drivers support mapped devices, sharing, copy-on-write, etc. * * The seg structure contains a lock to prevent races, the base virtual * address and size of the segment, a back pointer to the containing * address space, pointers to maintain a circularly doubly linked list * of segments in the same address space, and procedure and data hooks * for the driver. The seg list on the address space is sorted by * ascending base addresses and overlapping segments are not allowed. * * After a segment is created, faults may occur on pages of the segment. * When a fault occurs, the fault handling code must get the desired * object and set up the hardware translation to the object. For some * objects, the fault handling code also implements copy-on-write. * * When the hat wants to unload a translation, it can call the unload * routine which is responsible for processing reference and modify bits. */ struct seg { kmon_t s_lock; addr_t s_base; /* base virtual address */ u_int s_size; /* size in bytes */ struct as *s_as; /* containing address space */ struct seg *s_next; /* next seg in this address space */ struct seg *s_prev; /* prev seg in this address space */ struct seg_ops { int (*dup)(/* seg, newsegp */); int (*unmap)(/* seg, addr, len */); int (*free)(/* seg */); faultcode_t (*fault)(/* seg, addr, len, type, rw */); faultcode_t (*faulta)(/* seg, addr */); int (*hatsync)(/* seg, addr, ref, mod, flags */); int (*setprot)(/* seg, addr, size, prot */); int (*checkprot)(/* seg, addr, size, prot */); int (*kluster)(/* seg, addr, delta */); u_int (*swapout)(/* seg */); int (*sync)(/* seg, addr, size, flags */); int (*incore)(/* seg, addr, size, vec */); int (*lockop)(/* seg, addr, size, op */); int (*advise)(/* seg, addr, size, behav */); } *s_ops; caddr_t s_data; /* private data for instance */ }; /* * Fault information passed to the seg fault handling routine. * The F_SOFTLOCK and F_SOFTUNLOCK are used by software * to lock and unlock pages for physical I/O. */ enum fault_type { F_INVAL, /* invalid page */ F_PROT, /* protection fault */ F_SOFTLOCK, /* software requested locking */ F_SOFTUNLOCK, /* software requested unlocking */ }; /* * seg_rw gives the access type for a fault operation */ enum seg_rw { S_OTHER, /* unknown or not touched */ S_READ, /* read access attempted */ S_WRITE, /* write access attempted */ S_EXEC, /* execution access attempted */ }; #ifdef KERNEL /* * Generic segment operations */ struct seg *seg_alloc(/* as, base, size */); int seg_attach(/* as, base, size, seg */); void seg_free(/* seg */); u_int seg_page(/* seg, addr */); u_int seg_pages(/* seg */); #endif KERNEL #endif /*!_vm_seg_h*/