vmopen.c revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Copyright (c) 1985-2008 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Opening a new region of allocation.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Note that because of possible exotic memory types,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** all region data must be stored within the space given
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** by the discipline.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _vminit_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinVmalloc_t* vmopen(Vmdisc_t* disc, Vmethod_t* meth, int mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* note that Vmalloc_t space must be local to process since that's
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin where the meth&disc function addresses are going to be stored */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(vm = (Vmalloc_t*)vmalloc(Vmheap,sizeof(Vmalloc_t))) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((e = (*disc->exceptf)(vm,VM_OPEN,(Void_t*)(&addr),disc)) != 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(e < 0 || !addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* align this address */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* see if it's a valid region */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make sure vd->incr is properly rounded */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* get space for region data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(addr = (Vmuchar_t*)(*memoryf)(vm,NIL(Void_t*),0,s,disc)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make sure that addr is aligned */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* initialize region */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(e = S_CACHE; e >= 0; --e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin seg->size = s; /* this size is larger than usual so that the segment
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin will not be freed until the region is closed. */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make a data block out of the remainder */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SIZE(b) = seg->baddr - (Vmuchar_t*)b - 2*sizeof(Head_t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make a fake header for next block in case of noncontiguous segments */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* put into linked list of regions */